C#,数独游戏(Sudoku Game)的算法与源代码
本文包括以下內容:
(1)數獨游戲的核心算法;
(2)數獨游戲核心算法的源代碼;
(3)數獨游戲的部分題目樣本;
(4)適老版《數獨》的設計原則及軟件免積分下載。
仔細讀完,必有收獲啦!
閱讀本文你就可以自己寫出數獨游戲軟件啦!
一、數獨游戲的核心算法
1、數獨的基本規則
數獨游戲的規則非常簡單,以9x9標準數獨為例:
(1)每行、列的9個格子由1--9數字填入,不得重復;
(2)9x9格子可劃分為9個3x3的不重復的塊(宮),每個3x3的塊(宮)的9個格子由1--9數字填入,不得重復;
2、數獨軟件
數獨軟件,包括三類:
(1)數獨題目生成器;
(2)數獨答題器(也有軟件含有(1)的功能);
(3)數獨題目解答器;
3、數獨題目生成器
數獨題目生成器就是按“需求”生成數獨的題目。
數獨題目的需求,包括但不限于:
(1)格子總數:4x4,6x6,9x9,16x16,25,25,...
(2)格子樣式:標準、異形(包括所謂的殺手數獨)等等;
(3)特殊要求:對角線、和值、大小等等;
(4)難度系數:一般而言是指剩余的數字數量。數量越少,難度越高。
數獨題目生成器又包括兩個比較大的步驟:
(1)生成包括全部數字的數獨題目;
(2)按難度系數挖去部分數字,使之稱為空格;
(*)最終的剩余數字與空格成為題目;
數獨題目的生成算法,主要兩種:
(1)Lasvegas算法,稱之為“賭徒算法”;本質就是隨機算法;
基本思路是:順序或隨機位置填入1-9之間的隨機數,嚴格遵守規則;
(2)Exchange算法,稱之為“交換算法”,以一個lasvegas生成的題目為基礎,
經過數字、行、列、塊(宮)、旋轉、對稱等等交換(就是矩陣交換啦),得到看起來是新的題目;
交換算法既可以用于全數字題目,也可以用于挖去空洞的最終題目。
4、挖洞算法
挖洞算法也有兩種:
(1)順序挖洞;
從左上角開始,消除數字(挖洞),但必須確保答案唯一!
(2)隨機挖洞;
隨機選擇位置,消除數字(挖洞),但必須確保答案唯一!
5、異型題目的生成
所有異型題目的生成,都是以標準題目生成為基礎的;比如:
(1)對角線數獨:實現在對角線填入隨機數字;
(2)殺手數獨:以一個完成的題目為基礎,左右上下可以一個塊為基礎,填入剩余數字即可;
(3)和值數獨:先生成題目,再隨機取部分相鄰的格子,計算其和值,并用一個虛線框標記即可;
(4)大小數獨:取獨立的兩個格子,判別其數字大、小,用箭頭繪制即可;
更多異形,也不過爾爾。
6、數獨題目生成器的流程圖
7、數獨答題器
數獨答題器是讀入數獨的題目,并顯示于界面,供玩家選擇或輸入數字的軟件。
數獨答題器的流程圖:
8、數獨題目解答器
數獨題目解答器是玩家或作弊者,用于輸入題目,并給出答案的軟件。
二、數獨游戲核心算法的源代碼
1、拉斯維加斯算法的源代碼
/// <summary> /// 賭徒法(美其名曰:回溯法,實際上是 Lasvegas 算法) /// 構造數獨矩陣 /// </summary> /// <returns></returns> public static Board LasVegas_Original(int N = 9) {int[,] array = new int[N, N];for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){array[i, j] = 0;}}// 生成一個隨機的不完整數獨矩陣// 1..N 個數覆蓋了 NxN 的部分點for (int i = 0; i < N; i++){int temp = rnd.Next() % (N * N);array[temp / N, temp % N] = i + 1;}// 構造數獨矩陣// 暴力試錯法,賭徒法,回溯法int k = 0;while (true){if (k < 0){k = 0;}int row = k / N;int column = k % N;while (true){array[row, column]++;if (array[row, column] > N){// 失敗!重試!array[row, column] = 0;--k;break;}else if (Is_Matched_Node(array, row, column)){++k;break;}}// 終于摸到一條大魚!if (k == (N * N)){return new Board(array);}} }數獨規則檢驗代碼:?
/// <summary> /// 驗證array[row,column]是否符合要求 /// (1)每行、列不能重復! /// (2)每個塊內不能重復! /// </summary> /// <param name="array"></param> /// <param name="row"></param> /// <param name="column"></param> /// <returns></returns> private static bool Is_Matched_Node(int[,] array, int row, int column) {int N = array.GetLength(0);int M = (int)Math.Sqrt(N);int temp = array[row, column];// 列檢測for (int i = 0; i < N; i++){if (i != row && array[i, column] == temp){return false;}}// 行檢測for (int i = 0; i < N; i++){if (i != column && array[row, i] == temp){return false;}}// 塊檢測int p = (row / M) * M;int q = (column / M) * M;for (int i = p; i < p + M; i++){for (int j = q; j < q + M; j++){if (i != row && j != column && array[i, j] == temp){return false;}}}return true; }2、挖洞程序的源代碼
暫略。
3、題目顯示的源代碼
public static string ToHtml(int[,] array) {int N = array.GetLength(0);int M = (int)Math.Sqrt(N);StringBuilder sb = new StringBuilder();sb.AppendLine("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");sb.AppendLine("<html xmlns=\"http://www.w3.org/1999/xhtml\" >"); sb.AppendLine("<style>");sb.AppendLine("* { -webkit-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none; }");sb.AppendLine("td { user-select:none;width:45px;height:45px;line-height:45px;font-size:35px;padding:10px;text-align:center; }");sb.AppendLine("td.v { background-color:#FFEEEE; } ");sb.AppendLine("td.s { background-color:#EEEEEE;cursor:pointer; } ");sb.AppendLine("td.s:hover { background-color:#FFFFFF;cursor:pointer; } ");sb.AppendLine("</style>");sb.AppendLine("<body>");sb.AppendLine("<center>");sb.AppendLine("<table border=1 bordercolor='#AAAAAA' style='border-collapse:collapse;border:solid 3px #333333;'>");for (int i = 0; i < N; i++){if ((i % M) == 0)sb.AppendLine("<tr style='border-top:solid 5px #333333;'>");else if (i == (N - 1))sb.AppendLine("<tr style='border-bottom:solid 5px #333333;'>");elsesb.AppendLine("<tr>");for (int j = 0; j < N; j++){string tds = (array[i, j]==0) ? "s" : "v";if ((j % M) == 0)sb.AppendLine("<td style='border-left:solid 5px #333333;' class='"+tds+"'>");else if (j == (N - 1))sb.AppendLine("<td style='border-right:solid 5px #333333;' class='" + tds + "'>");elsesb.AppendLine("<td class='" + tds + "'>");if (array[i, j] > 0)sb.AppendLine(array[i, j]+"");else sb.AppendLine("");sb.AppendLine("</td>");}sb.AppendLine("</tr>");}sb.AppendLine("</table>");sb.AppendLine("</center>");sb.AppendLine("</body>");sb.AppendLine("</html>");return sb.ToString(); }三、數獨題目樣本
9x9
(適老版《數獨》軟件內有10000套題目,可隨意選用!)?
16x16:
?以后補上更多樣本,比如:25x25...
四、適老版《數獨》的設計原則及軟件下載
《數獨》特別適合幼兒、老人進行智力開發與維護。這些玩家有一些特別的需求:
(1)字體要大!
(2)操作要簡單!最好不要敲鍵盤!
(3)難度級別要多一些,逐步培養興趣;
等等,不一而足。
北京聯高軟件開發有限公司秉承“用戶第一,用戶第二。”的原則開發了適老版《數獨》。
適老版《數獨》軟件經過《用于保護C#|Java源程序的深度混淆技術與軟件——DeepConfuser》混淆編譯而成。
用于保護C#|Java源程序的深度混淆技術與軟件——DeepConfuserhttps://blog.csdn.net/beijinghorn/article/details/123156464
下載鏈接(0積分):
0積分下載適老版《數獨》https://download.csdn.net/download/beijinghorn/85224898
聯高軟件可制作專門的《數獨》題目或訓練、競賽軟件(Y=)。
————————————————————————————
POWER BY TRUFFER.CN
總結
以上是生活随笔為你收集整理的C#,数独游戏(Sudoku Game)的算法与源代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3解密栅栏密码的正确方法
- 下一篇: Java开发必看!java登录界面代码