淺析基本AI五子棋算法


  五子棋是所有棋類博弈中比較簡單的了,這里介紹的也只是一種非常基本的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,首先是自己這么想了,然后還真找到辦法實現了,所以創意,眼界,技術,同樣重要。

  

  

      完整代碼點這里

  小記。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM