Sudoku

首先是游戏界面的设计:

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




登陆注册利用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值