C#,数独游戏(Sudoku Game)的算法与源代码
本文包括以下內(nèi)容:
(1)數(shù)獨游戲的核心算法;
(2)數(shù)獨游戲核心算法的源代碼;
(3)數(shù)獨游戲的部分題目樣本;
(4)適老版《數(shù)獨》的設(shè)計原則及軟件免積分下載。
仔細(xì)讀完,必有收獲啦!
閱讀本文你就可以自己寫出數(shù)獨游戲軟件啦!
一、數(shù)獨游戲的核心算法
1、數(shù)獨的基本規(guī)則
數(shù)獨游戲的規(guī)則非常簡單,以9x9標(biāo)準(zhǔn)數(shù)獨為例:
(1)每行、列的9個格子由1--9數(shù)字填入,不得重復(fù);
(2)9x9格子可劃分為9個3x3的不重復(fù)的塊(宮),每個3x3的塊(宮)的9個格子由1--9數(shù)字填入,不得重復(fù);
2、數(shù)獨軟件
數(shù)獨軟件,包括三類:
(1)數(shù)獨題目生成器;
(2)數(shù)獨答題器(也有軟件含有(1)的功能);
(3)數(shù)獨題目解答器;
3、數(shù)獨題目生成器
數(shù)獨題目生成器就是按“需求”生成數(shù)獨的題目。
數(shù)獨題目的需求,包括但不限于:
(1)格子總數(shù):4x4,6x6,9x9,16x16,25,25,...
(2)格子樣式:標(biāo)準(zhǔn)、異形(包括所謂的殺手?jǐn)?shù)獨)等等;
(3)特殊要求:對角線、和值、大小等等;
(4)難度系數(shù):一般而言是指剩余的數(shù)字?jǐn)?shù)量。數(shù)量越少,難度越高。
數(shù)獨題目生成器又包括兩個比較大的步驟:
(1)生成包括全部數(shù)字的數(shù)獨題目;
(2)按難度系數(shù)挖去部分?jǐn)?shù)字,使之稱為空格;
(*)最終的剩余數(shù)字與空格成為題目;
數(shù)獨題目的生成算法,主要兩種:
(1)Lasvegas算法,稱之為“賭徒算法”;本質(zhì)就是隨機算法;
基本思路是:順序或隨機位置填入1-9之間的隨機數(shù),嚴(yán)格遵守規(guī)則;
(2)Exchange算法,稱之為“交換算法”,以一個lasvegas生成的題目為基礎(chǔ),
經(jīng)過數(shù)字、行、列、塊(宮)、旋轉(zhuǎn)、對稱等等交換(就是矩陣交換啦),得到看起來是新的題目;
交換算法既可以用于全數(shù)字題目,也可以用于挖去空洞的最終題目。
4、挖洞算法
挖洞算法也有兩種:
(1)順序挖洞;
從左上角開始,消除數(shù)字(挖洞),但必須確保答案唯一!
(2)隨機挖洞;
隨機選擇位置,消除數(shù)字(挖洞),但必須確保答案唯一!
5、異型題目的生成
所有異型題目的生成,都是以標(biāo)準(zhǔn)題目生成為基礎(chǔ)的;比如:
(1)對角線數(shù)獨:實現(xiàn)在對角線填入隨機數(shù)字;
(2)殺手?jǐn)?shù)獨:以一個完成的題目為基礎(chǔ),左右上下可以一個塊為基礎(chǔ),填入剩余數(shù)字即可;
(3)和值數(shù)獨:先生成題目,再隨機取部分相鄰的格子,計算其和值,并用一個虛線框標(biāo)記即可;
(4)大小數(shù)獨:取獨立的兩個格子,判別其數(shù)字大、小,用箭頭繪制即可;
更多異形,也不過爾爾。
6、數(shù)獨題目生成器的流程圖
7、數(shù)獨答題器
數(shù)獨答題器是讀入數(shù)獨的題目,并顯示于界面,供玩家選擇或輸入數(shù)字的軟件。
數(shù)獨答題器的流程圖:
8、數(shù)獨題目解答器
數(shù)獨題目解答器是玩家或作弊者,用于輸入題目,并給出答案的軟件。
二、數(shù)獨游戲核心算法的源代碼
1、拉斯維加斯算法的源代碼
/// <summary> /// 賭徒法(美其名曰:回溯法,實際上是 Lasvegas 算法) /// 構(gòu)造數(shù)獨矩陣 /// </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;}}// 生成一個隨機的不完整數(shù)獨矩陣// 1..N 個數(shù)覆蓋了 NxN 的部分點for (int i = 0; i < N; i++){int temp = rnd.Next() % (N * N);array[temp / N, temp % N] = i + 1;}// 構(gòu)造數(shù)獨矩陣// 暴力試錯法,賭徒法,回溯法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);}} }數(shù)獨規(guī)則檢驗代碼:?
/// <summary> /// 驗證array[row,column]是否符合要求 /// (1)每行、列不能重復(fù)! /// (2)每個塊內(nèi)不能重復(fù)! /// </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(); }三、數(shù)獨題目樣本
9x9
(適老版《數(shù)獨》軟件內(nèi)有10000套題目,可隨意選用!)?
16x16:
?以后補上更多樣本,比如:25x25...
四、適老版《數(shù)獨》的設(shè)計原則及軟件下載
《數(shù)獨》特別適合幼兒、老人進行智力開發(fā)與維護。這些玩家有一些特別的需求:
(1)字體要大!
(2)操作要簡單!最好不要敲鍵盤!
(3)難度級別要多一些,逐步培養(yǎng)興趣;
等等,不一而足。
北京聯(lián)高軟件開發(fā)有限公司秉承“用戶第一,用戶第二。”的原則開發(fā)了適老版《數(shù)獨》。
適老版《數(shù)獨》軟件經(jīng)過《用于保護C#|Java源程序的深度混淆技術(shù)與軟件——DeepConfuser》混淆編譯而成。
用于保護C#|Java源程序的深度混淆技術(shù)與軟件——DeepConfuserhttps://blog.csdn.net/beijinghorn/article/details/123156464
下載鏈接(0積分):
0積分下載適老版《數(shù)獨》https://download.csdn.net/download/beijinghorn/85224898
聯(lián)高軟件可制作專門的《數(shù)獨》題目或訓(xùn)練、競賽軟件(Y=)。
————————————————————————————
POWER BY TRUFFER.CN
總結(jié)
以上是生活随笔為你收集整理的C#,数独游戏(Sudoku Game)的算法与源代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3解密栅栏密码的正确方法
- 下一篇: C# 将PDF转为Word、Html、X