其實一直都很想寫個數獨的游戲,最近剛好看了《編程之美》,得到了一些啟發。
好,這時第一節,構造數獨矩陣。主要用到深度搜索算法,先往下一個格子填數字(依次填入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/