最近學了一點QT的繪圖,因而乎照着學長的代碼繪製了五子棋的小遊戲。算法
最基礎的東西這裏就不說了,本身的知識也僅僅比會用多那麼一點,下面咱們來講說這裏貌似高大上的人機AI吧。編程
評分表算法數組
通常狀況下棋盤是15*15的。那麼應該是572個五元組。而這五元組由黑棋白棋還有空格組成。也就是 3^5 * 572 = 138996; 看着不少吧,實際上是能夠分類的。每一個五元組就是一種局勢。.net
咱們只用統計只有己方棋子的局勢,以及只有敵方棋子的局勢,針對這兩種局勢給予肯定的評分,而其餘局勢直接評分爲0。code
下面是我使用的是評分表
blog
// 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] 表明其餘狀況(貌似沒用?)three
固然具體怎麼來統計那?onezeros的博客沒有給出來,對不少初學者來講實現仍是有必定困難,這裏就詳細的講一講吧。遊戲
首先咱們用一個棋盤大小的二維數組來儲存每一個點的得分。int scoreTabel[15][15];
ip
每次,當People或者Computer下完棋後,以該點爲中心統計周圍5個點的分數(上下左右對角)。get
圖1
即紅點,統計每一個點的分數。
對於每一個紅點,一樣的,咱們向其周圍8個方向找到全部包括其自身的五元組,並統計白棋和黑棋的個數,從而根據上面的評分表進行加分。
舉個栗子
圖2
對於1號位置,咱們先統計以它爲底端的五元組,即第一個矩形,而後是第二個,第三個,一直到以1號位置爲頂端的五元組,這樣咱們就統計了y軸方向的分數。
同理,接着統計x軸方向,兩種對角線方向的五元組的得分,這樣1號點位置的得分就出來了,咱們將這個值賦值在對應的scoreTable[][]裏面;
對圖1中全部紅點的得分統計完成後,咱們就能夠遍歷整個得分表scoreTable[][],其中的分最高並且爲空的位置就是計算機下子的位置。
固然,這種方法思路和編程都很簡單,天然效果比不上正規軍中極大極小值搜索中應用alpha-beta剪枝這種方法。