很早之前大概是2014年的时候,我用WPF就是C#啦,写了一个数独游戏,那时之所以有这个想法,主要还是因为更早之前玩数独游戏时基本没有把题目解出,有点小受伤,但本葛葛毕竟是程序员啊,我解不出,可以用程序解出嘛。最近又用JavaScript把数独游戏的解法又实现了一遍,于是想记录下来,大家可以一起探讨

那这个数独算法要怎么设计呢,我将整个数独分成了以下几个部分。首先我们需要建造基本的结构体:

1、建一个9*9大小的二维数组,用于存储数独各个节点的值BrickNode。
2、创建数独单个节点的数据结构体BrickNode,它包含两个信息number(值,初始值为0)和kind(种类,是原始的值例如上图中橙色的种类,用户编辑的值如上图的绿色种类),例如左上角的原始值2的表示为number=2,kind=1
3、表示坐标的结构体MsPoint,它包含两个值x和y,例如左上角的2的坐标值为x=0,y=0

接下来就是我们主要的算法设计,那这个算法要怎么设计呢?我的第一想法是使用递归,这个主要的算法要做的事情就是:

1、判断是否已经得到了答案,如果得到则结束,否则继续
2、深度克隆一份当前的数独
3、判断当前的坐标是否是最后一个节点,且number值不等于0即已经填充了一个有效值。如果满足这两个条件,则表示数独已经计算完,且得到了答案。如果不满足则继续
4、判断当前的坐标上节点是否是原始节点。如果是的话,则获取下一个坐标,再从1重新开始,即递归方法;如果不是的话则进行第5步操作。
5、获取当前坐标可填充的数字的数组,如果该数组的长度为0,则表示当前坐标没有任何数字可填充,即无解,直接return,结束当前分支的递归;如果当前数组长度不为空,则遍历数组,取遍历的值将其填充到当前数独数组,判断当前的坐标是否是最后一个节点且number值不等于0,是的话则表示已经计算完了,设置标记是否已经取到答案的变量值为true,即已经计算完了,其它递归分支都不用计算了,如果不满足是最后一个节点,则获取下一个坐标,从第1步再继续递归。

具体代码实现如下所示:

    calculating: function (sudokuParam, point) {if (this.gotAnswer || this.stop){return;}//深度克隆var sudoku = sudokuParam.clone();//判断当前的坐标是否是最后一个节点,且number值不等于0(即是否已经填充了一个有效值)if (point.X == 8 && point.Y == 8 && sudoku[point.X][point.Y].number != 0) {//得到答案了this.answer = sudoku;//标记已经得到答案了this.gotAnswer = true;return;}//判断当前节点的种类是否是原始值(即数独题给出的基本值,如上图的橙色方块)if (sudoku[point.X][point.Y].kind == BrickKind.Original){//根据当前数独及当前坐标的值,获取下个坐标,并继续计算this.calculating(sudoku, this.getNextPoint(sudoku, point));}else{//获取当前坐标可填充入的数字结构体,结果是一个数组var brickNodes = this.getAvailableBrickNodes(sudoku, point);//数组长度为0,即当前分支下的数组无解,直接退出当前递归分支if (brickNodes.count == 0){return;}// 如果当前数组长度不为空,则遍历数组for (var i = 0 ; i < brickNodes.length; i++) {var brickNode = brickNodes[i];//取遍历的值将其填充到当前数独数组的当前坐标下sudoku[point.X][point.Y] = brickNode;//判断当前的坐标是否是最后一个节点且number值不等于0,是的话则表示已经计算完了if (point.X == 8 && point.Y == 8 && sudoku[8][8].number != 0) {this.answer = sudoku;//设置标记是否已经取到答案的变量值为true,即已经计算完了,其它递归分支都不用计算了this.gotAnswer = true;return;}//如果不满足是最后一个节点,则获取下一个坐标,从第1步再继续递归this.calculating(sudoku, this.getNextPoint(sudoku, point));}}}

这里面用到两个方法,这两个方法在这里只阐述具体的用处和解决的思路,其它则不再赘述。

1、getAvailableBrickNodes(sudoku, point)作用是获取当前坐标可填入的数字,即判断竖排1-9有哪些数字可用,横排1-9有哪些数字可用,方格内1-9有哪些数字可用,取三方的并集。第一个参数sudoku为当前数独的二维数组,point指的是当前坐标值
2、getNextPoint(sudoku, point)作用是获取下一个坐标的值,这个方法比较简单,主要点在于判断当前的x是否已经是到8了,如果到了则x要加1而y要充值未0,基于这一点,还要判断当前点是否是原始点,是原始点的话还要一直前进,直到遇到非原始点,然后将该点坐标作为返回值返回。同样第一个参数sudoku为当前数独的二维数组,point指的是当前坐标值

以下是我使用WPF编写的一个数独游戏,不仅仅是数独算法啦,还涉及到了WPF界面的设计。感兴趣的同学可以下载试试:WPF Fashion Sudoku 数独游戏

怎样设计解开数独游戏相关推荐

  1. 《数独游戏的设计与实现》

    数独游戏的设计与实现 一.数独游戏简介 数独游戏,是一种数学智力拼图游戏,是"独立的数字游戏"的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家 ...

  2. Maltab GUI课程设计——数独游戏

    文章目录 课程设计 平台:Matlab App designer 功能实现:数独游戏的创建与运行 目的: 演示: 代码示例: 欢迎交流 课程设计 平台:Matlab App designer 功能实现 ...

  3. 基于Python的数独游戏设计与实现 课程文档+任务书+项目源码

    目录 数独游戏 1 需求分析 1 解题思路 2 生成数独 2 每行单元格包含整数1到9,且每个数恰好出现一次. 2 每列单元格包含整数1到9,且每个数恰好出现一次. 2 每个3×3的宫包含整数1到9, ...

  4. 基于Python的数独游戏的设计与实现

    源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 基于Python的数独游戏的设计与实现

  5. 小伙子利用C++设计出最难的“数独游戏”,让C++重回巅峰!

    求解数独,包括了数独所有解和舞蹈链的源码文件,源码主要是数独求解(舞蹈链算法)由于回朔法易于理解,不做具体介绍(便于求出所有可行解),本次仅具体介绍舞蹈链算法. 程序设计采用了数组代替十字交叉链表.主 ...

  6. 数独游戏设计(草稿)

    一.游戏功能 1.数独的九宫格的基本玩法. 2.用户可上传数独题目. 二.解决方案 1.数独的九宫格的基本玩法 九宫格:由50X50的方格,和粗细不同的两根线组成.方格被选中时,要呈现不同的状态. 数 ...

  7. 设计解谜游戏的30堂课

    设计解谜游戏的30堂课 文章目录 1.什么是Eureka Moment? 2.谜题与幽默是同构的 3.最大限度提高Sparkle 4.避免无意义的谜题 5.惊喜是Sparkle的重要源泉 6.有趣的事 ...

  8. python数独游戏源代码100行_python实现解数独程序代码

    偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...

  9. 2014/School_C_C++_A/6/“数独”游戏

    你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...

最新文章

  1. python保存到固定文件夹的存储路径不能直接复制!
  2. 【LC3开源峰会网络技术系列之三】基于JStorm的网络分析平台 1
  3. Haskell语言实现判断一个整数是否是质数的代码及运行结果
  4. echarts图表大小随着外部div大小变化
  5. Java RandomAccessFile close()方法与示例
  6. redis笔记_源码_简单动态字符串SDS
  7. 力扣算法题—075颜色分类
  8. gradle 关于repository配置
  9. 【verilog教程】第10篇:verilog代码规范
  10. GStreamer修改解码器默认优先级
  11. Elasticsearch:在华为大数据集群 从c80升级至651版本后,执行es命令修改配置失败
  12. 822D My pretty girl Noora
  13. Discuz论坛如何使用SendCloud?
  14. 如何申请TexturePacker
  15. c语言 运算符op,1 简单计算器。请编写一个程序计算表达式:datal op data2的值。其中op为运算符+、—、*、/。...
  16. Android Webrtc使用Wifi Direct无法建立P2P连接
  17. U8备份提示“远程组件初始化失败”
  18. R语言1——R的安装和相关介绍
  19. 网站首页的设计(转)
  20. Windows Server 2008 R2 组策略基本设置

热门文章

  1. 大学计算机导论怎么学,武汉大学珞珈学院《计算机导论》试卷(B)
  2. JAVA多线程实现和应用总结
  3. 六级备考8天|CET-6|阅读强化|16:00~17:20
  4. 2011被动元件供应依然吃紧?
  5. 张宇/王式安 考研数学 概率论争议题 【Python验证版】
  6. 数字图像处理Python语言实现-图像滤波-Log-Gabor滤波
  7. 电脑右下角WiFi标志不见了怎么办
  8. CATIA VBA二次开发(一)快速入门之宏脚本
  9. python语言程序设计是什么,python语言程序设计教程
  10. 计算机信息系统集成资质二级 列表6,计算机信息系统集成资质等级二级