zoukankan      html  css  js  c++  java
  • 数独游戏程序

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


     

    数独游戏程序

    分类: 软件

    数独简介:
        数独是一个智力小游戏。一个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

  • 相关阅读:
    P2426 删数
    P2115 [USACO14MAR]破坏Sabotage
    P2679 子串
    P2979 [USACO10JAN]奶酪塔Cheese Towers
    P1114 “非常男女”计划
    P2105 K皇后
    P4053 [JSOI2007]建筑抢修
    P1294 高手去散步
    P4316 绿豆蛙的归宿
    P2253 好一个一中腰鼓!
  • 原文地址:https://www.cnblogs.com/asdyzh/p/10088746.html
Copyright © 2011-2022 走看看