Sudoku

来源:互联网 发布:java源代码阅读工具 编辑:程序博客网 时间:2024/05/08 16:36

首先是游戏界面的设计:

以下三图分别为登陆注册/难度选择/游戏界面




登陆注册利用SQLITE实现,在引用SQLite for Universal Windows Platform和SQLitePCL,然后在登陆和注册按钮处分别添加CLICK事件:

private void add_database()        {            string tit = textBox.Text;            //Insert            var db = App.conn;            using (var custstmt = db.Prepare("INSERT INTO User (Name) VALUES (?)"))            {                custstmt.Bind(1, tit);                custstmt.Step();            }        }        private bool BtnGetAll()        {            var db = App.conn;            string word = textBox.Text;            StringBuilder re = new StringBuilder();            using (var statement = db.Prepare("SELECT Name FROM User WHERE Name = ?"))            {                statement.Bind(1, word);                while (SQLiteResult.ROW == statement.Step())                {                    re.Append((string)statement[0]);                    if (re.ToString() == word) return true;                }            }            return false;        }

然后是游戏难度的选择,在这个游戏里,我使用一个静态类来保存游戏信息

namespace Sudoku.Models{    public static class GameInfo    {        public static string GameLevel;        public static int time;        public static string UserName;    }}

接着进入游戏:

我使用了一个MODELS存储数独游戏过程中的每一步骤:

每一步用一个ITEM表示,数独九宫格里的数据用二维数组存储:

namespace Sudoku.Models{    class SudokuItem    {        public int[,] map;        public SudokuItem(int[,] map) {            this.map = new int[9,9];            for (int i = 0; i < 9; i++)                for (int j = 0; j < 9; j++)                    this.map[i, j] = map[i, j];        }    }}


把每一步装在collection中:
namespace Sudoku.ViewModels{    class SudokuItemViewModel    {        private ObservableCollection<Models.SudokuItem> allItems = new ObservableCollection<Models.SudokuItem>();        public ObservableCollection<Models.SudokuItem> AllItems { get { return this.allItems; } }        private Models.SudokuItem selectedItem = default(Models.SudokuItem);        public Models.SudokuItem SelectedItem { get { return selectedItem; } set { this.selectedItem = value; } }        public SudokuItemViewModel()        {            //test        }        public void AddSudokuItem(int[,] map)        {            this.allItems.Add(new Models.SudokuItem(map));        }        public void RemoveSudokuItem()        {                    }        public void UpdateSudokuItem()        {            // set selectedItem to null after update            this.selectedItem = null;        }    }}

在XAML里,用Grid控件划分出一个9x9的区域:

<Grid Name="grid" Grid.Row="0" >                            <Grid.RowDefinitions>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                                <RowDefinition Height="0.1*"/>                            </Grid.RowDefinitions>                            <Grid.ColumnDefinitions>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                                <ColumnDefinition Width="0.1*"/>                            </Grid.ColumnDefinitions>                        </Grid>

然后在C#中往每个格子添加一个button,并为每个button绑定一个二维数组即题目,还可以添加背景图片:

        private void InitMap(Grid thegrid,int[,] initmap)        {            thegrid.Children.Clear();            for (int i = 0; i <= 8; i++)            {                for (int j = 0; j <= 8; j++)                {                    int fontsize = 20;                    Button numberGrid = new Button() { Tag = i.ToString() + j.ToString(), FontSize = fontsize};                    numberGrid.SetValue(Grid.RowProperty, i);                    numberGrid.SetValue(Grid.ColumnProperty, j);                    if (initmap[i,j] == 0)                    numberGrid.Click += new RoutedEventHandler(ChooseButton);                    gridinfo.X = i;                    gridinfo.Y = j;                    Binding binding = new Binding();                    binding.Source = gridinfo;                    binding.Converter = new Converter();                    numberGrid.SetBinding(Button.ContentProperty, binding);                    numberGrid.Width = numberGrid.Height = 34                    if (initmap[i, j] > 0 || !(thegrid == grid || thegrid == draftgrid))                    {                        numberGrid.Background = new ImageBrush                        {                            ImageSource = new BitmapImage(new Uri(base.BaseUri, "Assets/darkGridItem.png"))                        };                    }                    else {                        numberGrid.Background = new ImageBrush                        {                            ImageSource = new BitmapImage(new Uri(base.BaseUri, "Assets/lightGridItem.png"))                        };                    }                    numberGrid.Content = (initmap[i, j] < 1) ? "" : numberGrid.Content;                    thegrid.Children.Add(numberGrid);                }            

数独九宫格的更新:

        private void UpdateMap(Grid thegrid, int[,] map)        {            for (int i = 0; i < 9; i++)            {                for (int j = 0; j < 9; j++)                {                    var btn = thegrid.Children[i * 9 + j] as Button;                    btn.Content = map[i, j] != 0 ? map[i, j].ToString() : "";                }            }        }

计时器的实现:

DispatcherTimer myTimer = new DispatcherTimer();            myTimer.Interval = new TimeSpan(0, 0, 1);//获取或设置计时器刻度之间的时间段——设置myTimer的时间间隔是1秒              myTimer.Tick += Timer_Tick;//Tick是超过计时间隔发生的事件——即超过1秒触发事件Timer_Tick              myTimer.Start();//计时器开始



0 0
原创粉丝点击