欢迎光临
我们一直在努力

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

本文包括以下内容:
(1)数独游戏的核心算法;
(2)数独游戏核心算法的源代码;
(3)数独游戏的部分题目样本;
(4)适老版《数独》的设计原则及软件免积分下载。

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

仔细读完,必有收获啦!
阅读本文你就可以自己写出数独游戏软件啦!

一、数独游戏的核心算法

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、数独题目生成器的流程图

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

7、数独答题器

数独答题器是读入数独的题目,并显示于界面,供玩家选择或输入数字的软件。
数独答题器的流程图:

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

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 &amp;& 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;'>"); else sb.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 + "'>"); else sb.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

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

(适老版《数独》软件内有10000套题目,可随意选用!)

16x16:

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

以后补上更多样本,比如:25x25...

四、适老版《数独》的设计原则及软件下载

《数独》特别适合幼儿、老人进行智力开发与维护。这些玩家有一些特别的需求:
(1)字体要大!
(2)操作要简单!最好不要敲键盘!
(3)难度级别要多一些,逐步培养兴趣;
等等,不一而足。

北京联高软件开发有限公司秉承“用户第一,用户第二。”的原则开发了适老版《数独》。

适老版《数独》软件经过《用于保护C#|Java源程序的深度混淆技术与软件——DeepConfuser》混淆编译而成。

用于保护C#|Java源程序的深度混淆技术与软件——DeepConfuserC#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码https://blog.csdn.net/beijinghorn/article/details/123156464

联高软件可制作专门的《数独》题目或训练、竞赛软件(Y=)。

————————————————————————————

POWER BY TRUFFER.CN

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码》
文章链接:https://www.456zj.com/37399.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址