最近學了一點QT的繪圖,於是乎照着學長的代碼繪制了五子棋的小游戲。
最基礎的東西這里就不說了,自己的知識也僅僅比會用多那么一點,下面我們來說說這里貌似高大上的人機AI吧。
評分表算法
一般情況下棋盤是15*15的。那么應該是572個五元組。而這五元組由黑棋白棋還有空格組成。也就是 3^5 * 572 = 138996; 看着很多吧,其實是可以分類的。每個五元組就是一種局勢。
我們只用統計只有己方棋子的局勢,以及只有敵方棋子的局勢,針對這兩種局勢給予確定的評分,而其他局勢直接評分為0。
下面是我使用的是評分表
// tuple is empty Blank, // tuple contains a black chess B, // tuple contains two black chesses BB, // tuple contains three black chesses BBB, // tuple contains four black chesses BBBB, // tuple contains a white chess W, // tuple contains two white chesses WW, // tuple contains three white chesses WWW, // tuple contains four white chesses WWWW, // tuple does not exist Virtual, // tuple contains at least one black and at least one white Polluted tupleScoreTable[0] = 7; tupleScoreTable[1] = 35; tupleScoreTable[2] = 800; tupleScoreTable[3] = 15000; tupleScoreTable[4] = 800000; tupleScoreTable[5] = 15; tupleScoreTable[6] = 400; tupleScoreTable[7] = 1800; tupleScoreTable[8] = 100000; tupleScoreTable[9] = 0; tupleScoreTable[10] = 0;
很多人可能沒看懂,其實就是當前五元組中黑白棋子個數以及對應的得分,tupleScoreTable[0] 對應 沒有棋子的得分,tupleScoreTable[1 - 4] 代表 1個黑棋 到 4個黑棋的得分, tupleScoreTable[5 - 8]代表 1 個白棋到4個白棋的得分,tupleScoreTable[9] 代表黑白棋共存的情況,tupleScoreTable[10] 代表其他情況(貌似沒用?)
當然具體怎么來統計那?onezeros的博客沒有給出來,對很多初學者來說實現還是有一定困難,這里就詳細的講一講吧。
首先我們用一個棋盤大小的二維數組來儲存每個點的得分。int scoreTabel[15][15];
每次,當People或者Computer下完棋后,以該點為中心統計周圍5個點的分數(上下左右對角)。
圖1
即紅點,統計每個點的分數。
對於每個紅點,同樣的,我們向其周圍8個方向找到所有包括其自身的五元組,並統計白棋和黑棋的個數,從而根據上面的評分表進行加分。
舉個栗子
圖2
對於1號位置,我們先統計以它為底端的五元組,即第一個矩形,然后是第二個,第三個,一直到以1號位置為頂端的五元組,這樣我們就統計了y軸方向的分數。
同理,接着統計x軸方向,兩種對角線方向的五元組的得分,這樣1號點位置的得分就出來了,我們將這個值賦值在對應的scoreTable[][]里面;
對圖1中所有紅點的得分統計完成后,我們就可以遍歷整個得分表scoreTable[][],其中的分最高而且為空的位置就是計算機下子的位置。
當然,這種方法思路和編程都很簡單,自然效果比不上正規軍中極大極小值搜索中應用alpha-beta剪枝這種方法。