首先是游戏界面的设计:
以下三图分别为登陆注册/难度选择/游戏界面
登陆注册利用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];
}
}
}
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();//计时器开始