1. 程式人生 > >數獨遊戲程序

數獨遊戲程序

report 交換 添加 con 出現 事先 誤操作 退出 ont

mathe的專欄 http://blog.csdn.net/mathe/article/details/1175498


數獨遊戲程序

分類: 軟件 遊戲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

數獨遊戲程序