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

news2025/2/3 18:02:57

本文包括以下内容:
(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;'>");
        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

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

16x16:

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

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

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

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


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

用于保护C#|Java源程序的深度混淆技术与软件——DeepConfusericon-default.png?t=N7T8https://blog.csdn.net/beijinghorn/article/details/123156464

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

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

POWER BY TRUFFER.CN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1427468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mirus TransIT-X2® 在RNAi干扰实验中性能数据展示

不同RNAi干扰途径示意图 基因沉默相关功能研究在分子和细胞生物学中发挥着重要作用&#xff0c;化学转染也在该研究领域扮演者重要角色。常见参与RNAi干扰途径的天然RNA分子包括&#xff1a; ★.小干扰 RNA (Small interfering RNAs, siRNA) &#xff1a;由双链 RNA(dsRNA)断裂…

第0章 Linux 基础入门

第0章 Linux 基础入门 RHCSA Red Hat Certified System Administrator 红帽认证系统管理员。 什么是计算机 计算机的组成&#xff1a; 控制器 运算器 存储器 输出设备 输入设备 计算机只能识别0和1&#xff0c;也就是二进制数。 为什么要学习Linux Linux 因其高效率…

零基础爬什么值得买的榜单——爬虫练习题目一(答二)

新问题总在解决老问题之后出现 引言原因正文 开整方法一代码运行效果 方法二代码运行结果 推荐 补充两个请求头的参数知识RefererUser-Agent 结尾 引言 今天心情不是很好 但是得更新呀 其实我写博客的一方面 也是希望大家能够监督我 让我尽量少情绪化 保持一个应有的速率做正确…

【VSCode 光标返回上一位置】

默认按键 Windows: Alt ← ;或者 鼠标侧键 Linux: Ctrl Alt - ;貌似数字键盘的减号没效果 Mac: Ctrl - 自定义修改方法&#xff1a; VSCode左下角 “管理 / Manage” “键盘快捷方式 / KeyBoard Shortcuts” 搜索 “前进 / Go Forward 或 后退 / Go Back” 双击需…

PySpark(二)RDD基础、RDD常见算子

目录 RDD RDD五大特性 RDD创建 RDD算子 常见的Transformation算子 map flatMap mapValues reduceByKey groupBy filter distinct union join intersection glom groupByKey groupByKey和reduceByKey的区别 ? sortBy sortByKey 常见的action算子 countByKey…

npm ERR! reason: certificate has expired(淘宝镜像过期)

npm ERR! request to https://registry.npm.taobao.org/yauzl/-/yauzl-2.4.1.tgz failed, reason: certificate has expired 今天在执行npm install命令时&#xff0c;报错百度了下是淘宝证书过期原因 解决方法一 执行下面两个命令再进行npm install即可 npm cache clean --…

LangChain结合通义千问的自建知识库

LangChain结合通义千问的自建知识库 在使用了通义千问API了之后&#xff0c;下一步就是构建知识库文档&#xff0c;使用了比较有名的LangChian&#xff0c;最后成果将自己的txt生成了知识向量库&#xff0c;最后我还把自己的论文生成了一个知识向量库&#xff0c;然后问他我的…

测试环境搭建整套大数据系统(一:基础配置,修改hostname,hosts,免密,时间同步)

一&#xff1a;使用服务器配置。 二&#xff1a;修改服务器名称hostname&#xff0c;hosts。 在 Linux 系统中&#xff0c;hostname 和 /etc/hosts 文件分别用于管理主机名和主机名解析。 在三台服务器上&#xff0c;分别执行以下命令。 vim /etc/hostnamexdso-hadoop-test-0…

Linux内核调参常用整理

一、【写在前面】 Linux内核调参是一个重要知识&#xff0c;这篇文章总结一下常见的参数用法。 调参位置在 /etc/sysctl.conf中或者sysctl.d 区别是&#xff1a; /etc/sysctl.conf 文件&#xff1a; 这是默认的主配置文件&#xff0c;包含了系统上所有的 sysctl 参数配置。所…

maven打包spring项目

常用的Maven命令如下 命令 说明mvn clean 清理Maven 项目。会删除目标路径(一般是target目录)Maven生成的打包文件,编译文件。mvn package 打包Maven项目,会生成jar 或者war文件。mvn test 执行test目录下的测试用例。mvn deploy 发布依赖到远端mvn site 生成…

Leetcode206:反转链表

一、题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 示例&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]输入&#xff1a;head [] 输出&#xff1…

面试经典 150 题 -- 滑动窗口 (总结)

面试经典150题链接 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 209 . 长度最小的子数组 思路 : 滑动窗口的思想&#xff0c;取ij0,向后遍历j,记录前缀和[l,r]为s,如果s>target,那么左端点向右移动&#xff0c;直到s…

net 一台路由器如何让两个不同网段的终端可以通信。

# 终端设备自己设置就行了 # 路由器的设置 The device is running! #################################################### <Huawei> Feb 1 2024 21:21:09-08:00 Huawei %%01IFPDT/4/IF_STATE(l)[0]:Interface GigabitEt hernet0/0/0 has turned into UP state. <…

Linux系统——防火墙

一、防火墙的认识 引言 安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全…

POI word操作,如何使表格单元格文本内容垂直/水平居中(两行代码解决)

垂直居中&#xff1a;cell本身就有垂直对齐的api&#xff0c;一行代码就够。 水平居中&#xff1a;一般方式行不通&#xff0c;网上苦找了许多方式&#xff0c;代码都太长了&#xff0c;&#xff0c;忒麻烦。于是我突发奇想&#xff0c;发现可以利用paragraph的水平居中对齐方…

Flask 入门3:Flask 请求上下文与请求

1. 前言 Flask 在处理请求与响应的过程&#xff1a; 首先我们从浏览器发送一个请求到服务端&#xff0c;由 Flask 接收了这个请求以后&#xff0c;这个请求将会由路由系统接收。然后在路由系统中&#xff0c;还可以挂入一些 “勾子”&#xff0c;在进入我们的 viewFunction …

小白水平理解面试经典题目_数组类Leetcode 412. Fizz Buzz【数学解法】

412 FizzBuzz 小白渣翻译&#xff1a; 给定一个整数 n &#xff0c;返回一个字符串数组 answer &#xff08;从 1 开始索引&#xff09;&#xff0c;其中&#xff1a; answer[i] “FizzBuzz” 如果 i 能被 3 和 5 整除。answer[i] “Fizz” 如果 i 能被 3 整除。answer[i]…

【gulp+jq+html】添加环境变量,并在js中使用(判断环境,更改api接口域名)+ 附gulpfile.js代码

参考博文&#xff1a; gulp分离环境 gulp中如何配置环境变量 gulp环境变量配置 1、安装cross-env插件 npm install cross-env -d2、package.json更改scripts "scripts": {"clean": "gulp clean","serve:test": "cross-env NODE…

IP协议(2) 和 数据链路层协议基础

IP协议续 1.路由选择 在复杂的网络结构中,我们需要找到一个通往终点的路线,这就是路由选择 举个例子:我们在没有手机导航之前,想去一个地方得是到一个地方问一下路的方式最终找到目的地 路由的过程,其实就是样子问路的过程 1.当IP数据包到达路由器的时候,会查看目的IP 2.路由器…

HAL库配置PWM模式

一、什么是PWM 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制。通过控制高低电平在一个周期内的占比从而输出一定的电压。 向上计数原理介绍 ​PWM的一个周期 定时器从0开始向上计数 当0-t1段,定时器计数器TIMx_CNT值小于…