五子棋是所有棋類博弈中比較簡單的了,這里介紹的也只是一種非常基本的AI策略。其實,包括之前的AI貪吃蛇,感覺這兩個AI其實體現的都是一種建模思想,把一個現實中的問題模型化,抽象化,得到其一般特征,再設計數據結構及算法。
首先,要意識到一件事情,我們可以用一個三維數組記錄所有的獲勝局勢,比如
再如:
這種獲勝局勢是有限可數的,所以,AI的關鍵一步就是得到這個三維數組:
1 //統計所有可能的贏法,需要好好理解 2 for (var i = 0; i < 15; i++){ 3 for (var j = 0; j < 11; j++){ 4 for (var k = 0; k < 5; k++){ 5 wins[i][j+k][count] = true; 6 } 7 count++; 8 } 9 } 10 for (var i = 0; i < 11; i++){ 11 for (var j = 0; j < 15; j++){ 12 for (var k = 0; k < 5; k++){ 13 wins[i+k][j][count] = true; 14 } 15 count++; 16 } 17 } 18 for (var i = 0; i < 11; i++){ 19 for (var j = 0; j < 11; j++){ 20 for (var k = 0; k < 5; k++){ 21 wins[i+k][j+k][count] = true; 22 } 23 count++; 24 } 25 } 26 for (var i = 0; i < 11; i++){ 27 for (var j = 14; j > 3; j--){ 28 for (var k = 0; k < 5; k++){ 29 wins[i+k][j-k][count] = true; 30 } 31 count++; 32 } 33 } 34 //共 572 贏法
現在,關鍵是如何利用這個三維數組,其實很多機器博弈其實就是在打分,再把棋子下到分高(或分低)的地方,比如以下紅色位置,如果沒有棋子,應該 給一個較高分,因為在下一個白棋子就贏了,但是如果下了一個黑棋子,那么,上面的第一種贏法無論如何也不可能了,所以直接設置為零分。所以在設置兩個一位數組,記錄每種贏法的得分,再查找棋盤上哪些位置可以實現這種贏法,給這些位置加分,最后從所有位置中,找出分最高的落子即可。而且,一種贏法上的落子越多,就越接近獲勝,所以分數應該越高。
1 for (var i = 0; i < 15; i++){ 2 for (var j = 0; j < 15; j++){ 3 if (0 == chessBoard[i][j]){//no chessman 4 for (var k = 0; k <count; k++){ 5 if (wins[i][j][k]){ 6 if (1 == myWin[k]){ 7 myScore[i][j] += 200; 8 } else if (2 == myWin[k]){ 9 myScore[i][j] += 400; 10 } else if (3 == myWin[k]){ 11 myScore[i][j] += 2000; 12 } else if (4 == myWin[k]){ 13 myScore[i][j] += 10000; 14 } 15 if (1 == computerWin[k]){ 16 computerScore[i][j] += 320; 17 } else if (2 == computerWin[k]){ 18 computerScore[i][j] += 420; 19 } else if (3 == computerWin[k]){ 20 computerScore[i][j] += 4200; 21 } else if (4 == computerWin[k]){ 22 computerScore[i][j] += 20000; 23 } 24 } 25 } 26 if (myScore[i][j] > max){ 27 max = myScore[i][j]; 28 u = i; 29 v = j; 30 } else if (myScore[i][j] == max){ 31 if (computerScore[i][j] > computerScore[u][v]){ 32 u = i; 33 v = j; 34 } 35 } 36 if (computerScore [i][j] > max){ 37 max = computerScore[i][j]; 38 u = i; 39 v = j; 40 } else if (computerScore[i][j] == max){ 41 if (myScore[i][j] > myScore[u][v]){ 42 u = i; 43 v = j; 44 } 45 } 46 } 47 }
最后,只需要統計每落子一次是否有一方贏了即可,這里談及了AI核心思想,其他部分比如判斷勝負,交替落子等邏輯可以找到很多學習資料。
總結,AI看似高大上,但是其實際是對實際問題的高度抽象、模型化以及大量計算(正是計算機的優勢)。如果能縝密地設計好編碼思路,那么效率就會很高,比如昨天寫的貪吃蛇,很多情況沒想到,所以總是陷入困境,當代碼量增加,邏輯結構變的復雜時,一定要事先規划,或者說,設計模式。自己要突破目前的瓶頸期可能要學習一下這方面的東西了!!!
此外,還利用Hbuilder生成了APP,首先是自己這么想了,然后還真找到辦法實現了,所以創意,眼界,技術,同樣重要。
小記。