数独游戏程序

mathe的专栏 http://blog.csdn.net/mathe/article/details/1175498

数独游戏程序

分类: 软件2007-08-23 11:02 22389人阅读 评论(26) 收藏 举报

游戏c图形扩展

数独简介:
    数独是一个智力小游戏。一个9*9的棋盘,共有9行9列以及9个互不相交的3*3九宫格。里面某些格子开始已经填上了1-9中的一些数字。要求玩家在余下的空格中填上1-9中数字,使得每行,每列和每个3*3九宫格中都正好包含1-9数字各一个。数独游戏保证结果的存在和唯一性。
例子:
  

我下载了一些网上的数独游戏程序,玩起来觉得不是很舒服,所以决定自己开发一个。
现游戏具有的功能:
  i)  随机产生任意多的游戏(理论上可以产生2^96=79228162514264337593543950336个不同的游戏)
  ii) 游戏分成四个不同级别(入门级,高级,专家级,骨灰级)
  iii) 通过模拟人工解数独问题提供人性化的提示,几乎所有游戏都完全可以仅用提示解决
iv)提供尝试功能(使用Shift键加数字键或鼠标左键)
 v)可以用户自定义游戏,用户可以直接输入或者通过剪切板复制游戏
  vi)可以将计算机模拟人工求解过程复制到剪切板(Ctrl+U键),会使用人工推理方法:唯一数隐含唯一数数对隐含数对唯一矩形法三链数隐含三链数四链数隐含四链数区域删减法矩形法(X-WING, SwordFish, JellyFish),关连数删减法(Forcing Chain)等

vii)语音提示功能(M键切换语音功能)
 viii)历史记录图形化回放功能
 ix) 最新2.4版添加了语音命令功能

最新下载链接(932K)(2.4.1版):

下载地址1:      无限数独2.41版安装程序  (932K,添加语音命令功能)

下载地址2:   http://download.csdn.net/source/273047 (仅CSDN用户可用)

游戏说明:

1.玩游戏过程:
 
  
如上图,在游戏中还没有填充的格子中,在候选数显示模式,计算机会自动显示所有的候选数。其中黑色大数字是游戏事先设置好的数字,蓝色大数字是玩家填充的数字,黑色小数字是每个格子的候选数。但是在非候选数模式,计算机不会显示候选数。
用户可以使用鼠标或键盘玩游戏。用鼠标左键点击一个候选数(仅用于候选数显示模式)或鼠标在格子上时按数字键选择一个数1-9。用鼠标右键或同时按住Ctrl和数字键来减少或添加候选数(仅用于候选数显示模式)。按H或Ctrl+H获得提示。

显示部分候选数功能:仅提供键盘操作。按住Ctrl+Shift+数字键1-9分别只显示候选数1到9。Ctrl+Shift+0显示所有候选数。而在显示部分候选数时,也可以通过左右键改变当前显示的候选数。

游戏还提供无限制步数的取消和重做功能,任何时候可以通过菜单项"编辑/取消”或热键Ctrl+Z取消上一步操作。对于取消后的步骤可以通过Ctrl+Y键重做。 批量取消功能:通过用鼠标右键点击一个用户已经设置好的数据,这将取消这个格子里面的数据,并且所有在设置这个数字后面的步骤全部被取消。同样,用右键点击一个已经被加灰(推理删除)的候选数(仅用于候选数显示模式),将取消将这个候选数隐含的步骤,同时它后面的所有步骤也全部取消。在批量取消后,同样可以通过选择菜单项“重做”来重新使用这些被取消的步骤,如果因为错误操作(比如不小心用鼠标右键点中一个格子),可以通过按Shift+Y来重做所有被取消的步骤。
任何时候,我们还可以通过Shift+Z键来检查我们前面的游戏过程是否出现错误,如果出现错误,计算机会自动取消所有错误的步骤

在候选数显示模式,可以按住Shift然后用鼠标选择一个数字,表示尝试使用这个数据,计算机将在这个选择的数据上打上标签,如上图中H7和B2格子分别打上标签T1和T2.这个表示用户先尝试了H6=4,然后又尝试了B2=5. 在非候选数显示模式,可以通过Shift+数字键来使用尝试功能。
在游戏出现矛盾时(发现尝试失败),可以通过按住Shift然后用鼠标右键选择一个尝试过的格子(通常应该选择最大标签的格子),这样计算机就认为这个尝试失败,会退回尝试前状态并且自动将这个错误候选数剔除。也可以不按住Shift而是直接用右键选择这个格子,这时只是使用了普通批量撤销功能到使用这个尝试之前的状态。

通过复制和粘贴功能,可以输入输出游戏。任何时候,按Ctrl+C或者用菜单项"编辑/复制"将把当前游戏局面(所有填充格子的数据被复制)以文本方式复制到粘贴板;然后用户可以将这个局面复制到任何地方。如果用户想复制游戏的起始局面,可以先按Ctrl+R到游戏的起始状态,然后复制游戏,如果再想恢复到自己玩的状态,使用Shift+Y键重新回到前一个步骤就可以了. 同样,对于其他地方以文本形式存在的数独游戏,用户可以先复制到粘贴板,然后切换到游戏按Ctrl+V或者用菜单项"编辑/粘贴"将当前游戏设置成此游戏;计算机会尽量去猜测用户输入局面的格式,但是不能保证总是成功。 对于无法通过粘贴输入的游戏,可以通过使用菜单项"文件/手工输入"来输入游戏,选择这个菜单项后,依次用鼠标或键盘输入预定义数字,输入完毕后,选择菜单项”文件/完成手工输入“来结束游戏的输入,计算机会自动判断输入局面是否只有唯一解。

在不显示候选数模式,用鼠标左键点击任意一个方格,状态条将显示这个方格中所有候选数。
任何时候按R键,将显示鼠标所在行各个候选数所在格子
任何时候按C键,将显示鼠标所在列各个候选数所在格子
任何时候按B键,将显示鼠标所在九宫各个候选数所在格子

历史记录浏览
在历史记录浏览模式,可以使用左右键浏览过去玩过的游戏,计算机会猜测玩家使用过的策略,并且用图形模式显示出来。按HOME和END键分别跳到开始和结束状态。按ESC键退出历史模式。

在历史模式使用Ctrl+U键将把用户的解答过程用文本方式复制到粘贴板,而非历史模式,使用Ctrl+U键计算机将自动产生一个模拟人工解答过程,并且把它以文本方式复制到粘贴板。

4.计算机提供提示中所用到的方法:
现在提供了:唯一数隐含唯一数数对隐含数对唯一矩形法三链数隐含三链数四链数隐含四链数区域删减法矩形法(X-WING, SwordFish, JellyFish),关连数删减法(Forcing Chain)

5. 游戏难度划分:
 入门级:使用唯一数隐含唯一数数对就可以解决的游戏
高级:    除了入门级的方法,还需使用隐含数对区域删减法三链数的。
专家级:使用了4中除关连数删减法外提供的方法能够找到结果,但是仅仅用高级的方法还不够的。
骨灰级:需要使用关连数删减法才有可能解决的问题

6. 游戏技巧(以及计算机提示方法介绍)
i)唯一数法

如果我们发现某个格子中只有一个可用候选数,那么这个格子必然是这个数字,这就是唯一数法
如下面例子,H5格子中只有唯一候选数3

如果没有使用候选数模式,那么得到提示信息会如下图


ii)隐含唯一数法

如果我们发现某一行某一列或某个九宫有一个候选数只出现在一个格子里面,那么这个格子必然是这个数字,这就是隐含唯一数法,如下面例子,第3列候选数4只出现在格子I3中. 本软件还提供了一种显示单一候选数的模式,在单一候选数模式,我们可以更加容易找到隐含唯一数。比如在这里,我们按Ctrl+Shift+4,那么软件将会只显示候选数4,在这种模式下,就可以非常容易看出I3中的4是隐含唯一数。

如果没有使用候选数模式,得到提示如下:

而对于隐含唯一候选数法(还有区间删减法和各种矩形法)我们还可以使用单一候选数模式,比如对于这个例子
我们可以通过按Ctrl+Shift+4键只显示候选数4,得到如下一个图,根据下图,很显然I3中4是隐含唯一数

iii)数对法

如果我们发现某一行某一列或某个九宫有两个格子只使用了两个候选数,那么这两个格子必然正好是这两个数字,那么在这个单元(行,列,或九宫)中,其它格子不会出现这两个候选数,这就是数对法,如下面例子,第一列中B1和G1的候选数都是7,8;那么D1,H1中的候选数7,8可以删除。

iv)三链数法

如果我们发现某一行某一列或某个九宫有三个格子只使用了三个候选数,那么这三个格子必然正好是这三个数字,那么在这个单元(行,列,或九宫)中,其它格子不会出现这三个候选数,这就是三链数法,如下面例子,
最下面中间的九宫中格子H4,H5,I5三个格子都只使用候选数2,8,6;所以G4,G6,I6中出现的8,6都可以删除

v)四链数法

如果我们发现某一行某一列或某个九宫有四个格子只使用了四个候选数,那么这四个格子必然正好是这四个数字,那么在这个单元(行,列,或九宫)中,其它格子不会出现这四个候选数,这就是四链数法;如下面例子中
上面中间的九宫中四个格子A5,B5,C4,C5都只使用了数字1,2,3,4;所以另外4个格子A4,A6,B4,C6中出现的数字1,2,3,4可以删除

vi)隐含数对法

如果我们发现某一行某一列或某个九宫中有两个候选数只出现在两个格子中,那么这两个格子必然正好是这两个数字,那么这两格子中其他候选数可以删除,这就是隐含数对法;如下面例子,第A行中,只有格子A7,A8使用了数字6,8;所以这两个格子中其它数字2,5,9都可以删除

vii)隐含三链数法

如果我们发现某一行某一列或某个九宫中有三个候选数只出现在三个格子中,那么这三个格子必然正好是这三个数字,那么这三格子中其他候选数可以删除,这就是隐含三链数法,如下面例子,第8列中只有格子C8,F8,G8使用了数字1,3,4;所以格子F8中出现的其它数字6,7,8可以删除

viii)隐含四链数法

如果我们发现某一行某一列或某个九宫中有四个候选数只出现在四个格子中,那么这四个格子必然正好是这四个数字,那么这四格子中其他候选数可以删除,这就是隐含四链数法,我们借用四链数中的例子,可以发现上面中间的九宫格中,只有格子A4,A6,B4,C6使用了四个数字5,6,7,9;所以它们使用的其他数字1,2,3,4可以删除。

ix)区域删减法

如果我们发现某一候选数在某一单元(行,列,九宫)中完全处在同另外一个单元的交集中,那么在另外一个单元中,不在交集中的这个候选数必然可以删除,如下面例子,第D行中所有数字5都正好在左边中间的九宫中,所以在这个九宫中,不在第D行的候选数5(E3中)可以删除。本软件中,我们也可以使用显示单一候选数模式来更加容易的发现区域删减法的机会。

x) 矩形法

如果某个候选数在某两行(列)中只出现在某两行(列)中,那么在那两行(列)中,不在那两列(行)的这个候选数都可以删除,如下面例子,第C行和第F行的候选数3都正好是两个而且出现在第1列和第8列;所以第1列和第8列中,不在第C行和第F行的候选数3 (A8,D1,D8,I1,I8)都可以删除。矩形法也可以在显示单一候选数模式下发现

把它扩展到三行或四行就可以得到高阶矩形法,同样下面例子中可以删除蓝色的候选数6

下面的例子中粉色4可以删除

 xi)唯一矩形法

最新添加唯一矩形法,这个方法利用了数独结果唯一性的特性:如果有四个构成矩形顶点的格子只使用两个数字,而且同在一行或同在一列的格子在同一个宫格中,那么这个局面的结果必然不是唯一的(交换它们使用的数字同样可以得到合法的数独结果),必然不是合法的数独局面。通过这个结论我们分别得到两种删减法:
如下图A3,C3,A9,C9中,C3必然不能取候选数1和9(不然结果必然不唯一),所以C3只能取候选数5

如下图,D2和F2中必然有一个格子结果是3,不然D2,F2,D9,F9都只能是数字1和9,结果必然不唯一。
由此进一步得出第2列中H2不能取3(同样还可以得出在左中宫格中F3不能取3)

xii)关连数删减法

通过找到一串强关联数据来得出矛盾来删除候选数。
如下图,第9列只有G9和D9有候选数3,它们之间就是一种强关联数据,同样D4和I4之间也是强关联的。而如果一个格子中只有两个候选数,那么我们认为这两个候选数也是强关联的数据。
此外D9和D4之间在同一行都使用数据3,它们是弱关联,同样在一个格子中两个不同候选数也可以看成弱关联。这样通过一系列强弱关联(弱关联可以用强关联替代),
如果我们可以得到一个矛盾链。如下图,我们可以通过提示中逻辑推理排除G6=3(实际上还可以排除I7=3和I8=3)

下面是一个更加复杂的例子,用到了多个不同候选数值:

https://blog.csdn.net/love_hot_girl/article/details/8772551

原文地址:https://www.cnblogs.com/asdyzh/p/10088746.html

时间: 2024-10-16 15:53:00

数独游戏程序的相关文章

数独游戏求解程序

最近玩数独游戏,每行.每列.以及9宫格都包含1-9个数组.觉得这东西很适合用程序来求解.于是我就仿照中国象棋的暴力搜索算法(可参考我之前写的文章极大极小搜索算法),写了一个程序求解数独,直接贴代码了 /** * 模仿象棋程序的搜索算法,写一个求解数独的程序 * @author royhoo * */ public class ShuDu { private int[][] board; // 数独矩阵 private int zeroNum; // 缺失的数字个数 private int fil

java程序计算数独游戏

兴趣来了,写了个简单的数独游戏计算程序,未做算法优化. 通过文件来输入一个二维数组,9行,每行9个数组,数独游戏中需要填空的地方用0来表示.结果也是打印二维数组. 1 import java.io.File; 2 import java.util.List; 3 //代表数独中的一个单元格位置 4 public class Cell { 5 6 // 所在行 7 public int row; 8 // 所在列 9 public int colum; 10 // 值 11 public int

5乘5的数独游戏

用了三个周的业余时间,日思夜想的牵挂才把5乘5的数独游戏填满了二十五个宫格. 在这前一篇<数独游戏新篇章>里面,通过对第一个宫格使用位移变换来得到后面的二十四个宫格,总觉得没有什么意思.现在可以通过回溯的办法填满整个二十五个宫格,又觉得这样的结果好像120个点的连通图里面的哈密顿回路的条数那样多得不可思议,所以就想在一个已经填入了一部分数字的情况下,再把其余的格子填满,因为已经有了可以解决3乘3标准数独的基础(前一篇那一个是芬兰数学家给出的世界最难标准数独,编写的程序运行十小时就能得到结果,就

C语言学习 数独游戏

摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 Win64) 参考: 互动百科 数独 章节: 正文: 原来也用C#和Go语言写过,主要思路是暴力撞大运破解.思路什么的在程序了都注释了,不多说了.可能是没用什么先进的算法,感觉C解题速度和C#差不多(除了C#第一次运行之外),基本上出来一个数独表都不用1秒. 附完整程序: 1 /*********************

数独游戏代码

//数独游戏c++ class CSudoku { int map[9][9]; int blanks; int smod; int solves; int check(int,int,int*); void dfs(); public: enum{ANY=0,ALL=1}; CSudoku(int); CSudoku::CSudoku(int *data); void SudokuGenerator(int); //随机生成数独,n越大越难 void SudokuGenerator(int *

数独GUI程序项目实现

数独GUI程序项目实现 导语:最近玩上了数独这个游戏,但是找到的几个PC端数独游戏都有点老了...我就想自己做一个数独小游戏,也是一个不错的选择. 前期我在网上简单地查看了一些数独游戏的界面,代码.好好地了解了一下现在数独游戏的大概的框架.当然,我自己写的小游戏,也许没那么好.但是我一定会一点点升级这个小游戏的. 目前,我做的游戏是V1.0版本的,只能说实现了这个游戏的基本功能:可以进行数独游戏.可以更换背景色以及一些其他的基本功能.接下来,在空余时间,我会进行对其中一Studying功能的实现

Swift数独游戏优化&mdash;&mdash;C++与OC混编、plist自动生成

一.为什么要C++与OC混编? 在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的.   但是在我的例子中我发现这样存在一定的局限性: 1.我是利用Terminal的重定向功能来实现输出的,这样不能查看程序的实际运行状态信息. 2.C++编写的代码不能直接生成plist文件,而OC有直接的API可以生成plist文件.(当我前几天刚知道的时候我感觉之前用C++生成plist是有多勇敢)   二.如何进行C++与OC混编? 1.OC文件后缀改为"mm&quo

使用双向十字链表(或Dancing Links)解数独游戏

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct Data { void assign(int x,int y,int z) { row=x; col=y; val=z; } int row,col,val; } data[730]; struct Node { Node(int x=0,int y=0): row(x),col(y),up(this)

【DFS】数独游戏

DFS(深度优先搜索): 深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点.整个进程反复进行直到所有节点都被访问为止.属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n).(一条路走到黑,直到走不下去才往回走) 基本模板: int check(参数) { if(满足条件) return 1;