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;'>");
        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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA操作Rabbitmq-原理讲的很详细

这篇文章来源于稀土掘金&#xff0c;来源&#xff1a;https://juejin.cn/post/7132268340541653005&#xff0c;主要用来收藏学习。 常见的消息队列很多&#xff0c;主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ&#xff0c;相关的选型可以看我之前的系列&#xff0c;这篇文…

用Python处理TDC激光测距数据并绘制为图片

用Python处理TDC激光测距数据并绘制为图片 说明一、定义全局变量变二、主函数入口三、处理原始文件数据四、将数据叠加统计生成图片五、额外的辅助函数六、将数据进行各种形式统计叠加七、原始数据形式八、 测试结果 说明 1. 主要是将TDC激光测距数据进行统计叠加并绘制为图片…

09. 配置Eth-Trunk

文章目录 一. 初识Eth-Trunk1.1. Eth-Trunk的概述1.2. Eth-Trunk的优势1.3. Eth-Trunk的模式的优势 二. 实验专题2.1. 实验1&#xff1a;手工模式2.1.1. 实验拓扑图2.1.2. 实验步骤&#xff08;1&#xff09;配置PC机的IP地址&#xff08;2&#xff09;在交换机接口划入VLAN&am…

Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)

文章目录 1. Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic aarch64)2. 三个链接是官方提供的文档、管理工具和技术支持3. System information as of Thu 01 Feb 2024 03:30:45 PM HKT4. System load: 1.16&#xff1a;系统负载指数5. Processes: 1096系统正在运…

防火墙 双机热备直路部署--上下三层配置

双机热备直路部署 -- 上下三层 双机热备直路部署的特点是防火墙接口都是三层工作模式&#xff0c;相当于防火墙在进行路由部 署。 1. 根据网段划分配置IP地址和安全区域 AR1配置: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huawei-GigabitEthernet…

Codeforces Round 893 (Div. 2)补题

Buttons(Problem - A - Codeforces) 题目大意&#xff1a;有三排按钮数量分别为a,b,c&#xff0c;第一排只能由A按下&#xff0c;第二排只能由B按下&#xff0c;第三排可以被任意一个人按下&#xff0c;问两人轮流游戏&#xff0c;谁没有可以按的谁输&#xff0c;问如果都发挥…

易语言系列学习1

通过本文章你会学习到 如果 如果真 获取编辑框内容 关闭本程序 监听按键让它等价于点击某个按钮 运算&#xff1a;或 且 非&#xff08;注意中间要有一个空格&#xff0c;否则会报错&#xff09; 效果 .版本 2.程序集 窗口程序集_启动窗口.子程序 _按钮2_被单击. 如果真 (编…

C#,斯特林数(Stirling Number)的算法与源代码

1 斯特林数 在组合数学&#xff0c;斯特林数可指两类数&#xff0c;第一类斯特林数和第二类斯特林数&#xff0c;都是由18世纪数学家James Stirling提出的。它们自18世纪以来一直吸引许多数学家的兴趣&#xff0c;如欧拉、柯西、西尔沃斯特和凯莱等。后来哥本哈根&#xff08;…

使用 postcss-cva 来生成 cva 方法吧

使用 postcss-cva 来生成 cva 方法吧 使用 postcss-cva 来生成 cva 方法吧 什么是 cva 封装示例组成参数 postcss-cva 的功能 Css 示例原子化设计注释参考生成cva函数 Refers 什么是 cva cva 全称为 class-variance-authority, 它是一个非常适合制作那种&#xff0c;创建控…

Ps:自动混合图层

Ps菜单&#xff1a;编辑/自动混合图层 Edit/Auto-Blend Layers 自动混合图层 Auto-Blend Layers命令可以自动地混合多个图层&#xff0c;特别适合于制作全景图、焦点堆叠、曝光合成或任何需要平滑融合多个图像的场景。 自动混合图层命令仅适用于 RGB 或灰度图像&#xff0c;不适…

2024年美国大学生数学建模B题思路分析 - 搜索潜水器

# 1 赛题 问题B&#xff1a;搜索潜水器 总部位于希腊的小型海上巡航潜艇&#xff08;MCMS&#xff09;公司&#xff0c;制造能够将人类运送到海洋最深处的潜水器。潜水器被移动到该位置&#xff0c;并不受主船的束缚。MCMS现在希望用他们的潜水器带游客在爱奥尼亚海底探险&…

shell脚本-免交互

一、Here Document免交互&#xff1a; 1.交互概述&#xff1a; 交互&#xff1a;当计算机播放某多媒体程序的时候&#xff0c;编程人员可以发出指令控制该程序的运行&#xff0c;而不是程序单方面执行下去&#xff0c;程序在接受到编程人员相应的指令后而相应地做出反应。 对于…

html,css,js速成

准备&#xff1a;vscode配好c&#xff0c;python&#xff0c;vue环境。 1. html hypertext markup language(超文本标记语言) 1. 基础语法 一个html元素由开始标签&#xff0c;填充文本&#xff0c;结束标签构成。 常见标签说明<b></b>粗体<i></i>…

UE4学习笔记 FPS游戏制作3 添加武器

文章目录 章节目标为骨骼添加武器挂载点添加武器 章节目标 本章节为手部添加一个武器挂载点&#xff0c;并挂载一个武器 为骨骼添加武器挂载点 添加挂载点需要以一个动画片段为基础&#xff0c;为骨骼添加挂载点。 首先找到我们需要的动画片段&#xff0c;通常是idle 双击打…

CentOS 7中搭建NFS文件共享服务器的完整步骤

CentOS 7中搭建NFS文件共享服务器的完整步骤 要求&#xff1a;实现镜像文件共享&#xff0c;并基于挂载的共享目录配置yum源。 系统环境&#xff1a; 服务器&#xff1a;172.20.26.167-CentOS7.6 客户端&#xff1a;172.20.26.198-CentOS7.6 1、在服务器和客户端上&#x…

AI 原生时代的云计算

本文整理自2023年 12 月 20 日举办的「2023 百度云智大会智算大会」主论坛&#xff0c;百度副总裁谢广军的主题演讲《AI 原生时代的云计算》。 &#xff08;视频回放链接&#xff1a;https://cloud.baidu.com/summit/aicomputing_2023/index.html&#xff09; 大模型的到来&…

leetcode 19 , 118

19 .删除链表倒数第n个节点 思路1&#xff1a; 我首先想到的就是使用两个loop来进行解决&#xff1a; 遍历所有节点&#xff0c;得到需要删除节点的位置。再遍历一边所有节点&#xff0c;找到需要删除节点进行删除。 解决方案1&#xff1a; class Solution {public ListNod…

深入探究iframe:网页嵌入的魔法盒子(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

2024/2/1学习记录

echarts 为柱条添加背景色&#xff1a; 若想设置折线图的点的样式&#xff0c;设置 series.itemStyle 指定填充颜色就好了&#xff0c;设置线的样式设置 lineStyle 就好了。 在折线图中倘若要设置空数据&#xff0c;用 - 表示即可&#xff0c;这对于其他系列的数据也是 适用的…

Java知识点总结

数据类型强转&#xff1a;byte short int long float double &#xff1b; 数组定义 [ ]数组名 clone-复制数组equals-比较存储地址 toString sort-排序 length-长度 arraycopy([]a,s,[]b,ss,n)-数组复制 运算符及语句 instanceof双目运算符 –左对象右类 判断是否是该类创建…