其实一直都很想写个数独的游戏,最近刚好看了《编程之美》,得到了一些启发。
好,这时第一节,构造数独矩阵。主要用到深度搜索算法,先往下一个格子填数字(依次填入1~9),在9*9表格的行中检验数字有没有出现过,在9*9表格的列中检验数字有没有出现过,最后在3*3的表格中检验数字是否出现过。如果最后1~9中所有的数字都不符合,则开始回溯。重复以上过程,最终我们可以得到一个数独矩阵。
核心代码:
//得到一个数独矩阵 public bool GenerateValidMatrix() { //初始化之后坐标为(0,0) Coord currentCoord = new Coord(); while (true) { Cell currentCell = table[currentCoord.X, currentCoord.Y]; if (!currentCell.IsProcessed) { currentCell.validList = GetValidValueList(currentCoord); } if (currentCell.validList.Count>0) { currentCell.PickNextValidValue(); if (currentCoord.X == TableSize - 1 && currentCoord.Y == TableSize - 1) break; else currentCoord = NextCoord(currentCoord); } else { if (currentCoord.X == 0 && currentCoord.Y == 0) break; else { currentCell.Clear(); currentCoord = PrevCoord(currentCoord); } } //Console.WriteLine("X: " + currentCell.X.ToString() + // " Y: " + currentCell.Y.ToString() + // " Number: " + currentCell.Number.ToString()); } return true; } private List<int> GetValidValueList(Coord coord) { List<int> nextNumberList = new List<int>(); for (int i = 1; i <= TableSize;i++ ) { if (ValidLine(i,coord.X,coord.Y) && ValidColumn(i,coord.X,coord.Y) && ValidSmallTable(i,coord.X,coord.Y)) { nextNumberList.Add(i); } } return nextNumberList; }
OK我们现在可以得到一个数独矩阵了:
但是,这只是一个可行解,只是一个,这样的话用来做游戏就没有什么趣味性了,我们应该得到一些随机的可行解。
下面提供三种思路
1、行列交换
交换黄色那部分,我们得到另外一个可行解,同理,还可以交换列(如果没算错的话,应该可以得到6*6=36种可行解,应该也够玩一阵子了)
2、旋转
可以在上面行列交换的基础上再旋转(每次将矩阵旋转90°也可以)
3、在currentCell.PickNextValidValue();这个函数做手脚
Cell里面储存了下次可用的数字列表,只要随机的取列表中的这些数字就可以得到一个随机的矩阵了
最后再随机地把表格中的数字变为0,我们就得到一个可以玩的数独矩阵了
行,下次再做一个界面,然后再写解数独的那部分,欲知后事如何,请听下回分解……
本文为原创博文,转载请在注明作者博客地址:http://www.cnblogs.com/-Lei/