• 沒有找到結果。

殘局資料庫的改良

第三章、 如何破解台灣直棋

第二節、 殘局資料庫的改良

因為台灣直棋有「直」、「擔」跟「槓」三種吃子的情況,其中「擔」是當己

方主動在沿著正方形的線段上,己方一枚棋子主動出現在兩枚對方棋子的中間位

置,進而吃掉敵方該兩枚棋子。因此台灣直棋有一次吃兩子的可能性,需要對殘

局庫相互之間的連結關係作調整,以配合台灣直棋遊戲的特色。

圖3-5 台灣直棋殘局庫部分關係圖

台灣直棋殘局庫之間的連結也是使用「吃子步」作為連結,跟 Nine Men's

Morris 不同處在於台灣直棋的吃子情況有「直」、「槓」和「擔」三種,因此要 生成其中一個殘局庫時,需要讀取的殘局庫比 Nine Men's Morris 多了一倍。

因為在台灣直棋遊戲規則中,雙方在開始的時候都擁有十二顆棋子,所以盤

面需要考慮到十二子對十二子的情形,雖然十二子對十二子是剛好把盤面所有空

點填滿,雙方都無棋子可移動,因而不用計算,但是對於十二子對十一子的情形,

還是需要採用回溯分析演算來計算盤面的結果,考慮到記憶體空間的限制,我們

觀察直棋遊戲過程中的盤面,發現到一個現象,在行子階段出現循環盤面

時,在同樣的盤面是絕對輪到同一方玩家移動棋子。因此發現到直棋遊戲具有如

8-puzzle 一樣擁有兩種盤面及其產生盤面的集合彼此互斥,進而將此特性運用在 殘局庫,使得殘局庫能以棋子在盤面上位置分佈的不同來分割。

圖3-6 將交叉點塗上黑白兩色

如上圖,將交叉點塗上黑白兩種顏色作為區分,假設現在輪到黑方可以移動

棋子,此時黑方只有三個白色交叉點可以選擇,當黑方選擇移動黑色棋子到上方

白點後,空著的黑色交叉點就有 12 個,空著的白色交叉點就有 10 個。然後輪到

白方可以移動棋子,當白方選擇移動白色棋子之後,空著的黑色交叉點就剩 11

個,空著的白色交叉點就增加為 11 個。

圖3-7 分割方法示意圖

如此進行下去,就可以發現當輪到黑方移動棋子時,在盤面上,空著的黑色

交叉點總數為奇數;輪到白方移動棋子時,在盤面上,空著的黑色交叉點總數為

偶數。

如何運用程式來實現這個想法,我們將盤面 24 個交叉點以 0 到 23 編號,將

單數跟偶數點彼此交錯,讓移動棋子只能從單數交叉點移動到偶數交叉點,要計

算單數交叉點的數量只需要運用加法運算跟 and 運算,就可以得到單數交叉點的

總數量是奇數還是偶數。

將資料庫更細的分類之後,將原本一個資料庫存的資料分開成兩個資料庫儲

存。其單一資料庫需要儲存的盤面數為原本的一半,但是總共資料庫數量也變為

原本的兩倍。造成要生成一個新的殘局庫需要讀取八個已生成的殘局庫,即原本

需要讀取的四個資料庫經過此分割後變為八個資料庫。

相關文件