2017-07-18 84 views
1

我試圖掌握MiniMax算法,並且已經閱讀了它。我最初的方法是實現一個簡單的MiniMax算法,然後添加alpha-beta修剪。然而,這是我當前的代碼:用於Java中的TicTacToe AI的最簡單的MiniMax算法

public int miniMax(char[] node, int playerNum) 
{ 
    int victor = checkWin(node); // returns 0 if game is ongoing, 1 for p1, 2 for p2, 3 for tie. 
    if(victor != 0) //game over . 
     return score(victor); 

    if(playerNum == 2) //AI 
    { 
     int bestVal = Integer.MIN_VALUE; 
     int bestSpot = 0; 
     for(int i = 0; i < node.length; i++) 
     { 
      if(node[i] != '-') 
       continue; 
      node[i] = getSymbol(playerNum); 
      int value = miniMax(node, 1); 
      if(value > bestVal) 
      { 
       bestVal = value; 
       bestSpot = i; 
      } 

      node[i] = '-'; 
     } 
     return bestSpot; 
    } 
    else 
    { 
     int bestVal = Integer.MAX_VALUE; 
     int bestSpot = 0; 
     for(int i = 0; i < node.length; i++) 
     { 
      if(node[i] != '-') 
       continue; 
      node[i] = getSymbol(playerNum); 
      int value = miniMax(node, 2); 
      if(value < bestVal) 
      { 
       bestVal = value; 
       bestSpot = i; 
      } 
      node[i] = '-'; 
     } 
     return bestSpot; 
    } 
} 

我的得分功能

private int Score(int gameState) 
{ 
    if(gameState ==2) //O wins. 
     return 10; 
    else if(gameState==1) //X wins 
     return -10; 
    return 0; 
} 

現在,我有一個工作AI,試圖阻止我的舉動,贏得,但有時它是使非智能的選擇例如,如果我的輸入從控制檯讀取的順序是6,7,8,那麼這是我得到的輸出。它不會試圖阻止我的勝利。但在其他情況下,它確實如此。


| O | O | |


| | | |


| X | X | X |


在我的第二次嘗試我試過4,3,它擋住了我獲勝的舉動。


| | O | |


| X | X | O |


| | | |


我想任何人都可以指出什麼是錯我的執行?

+1

你可能會在http://codereview.stackexchange.com得到更多的建議 – Chris

回答

3

所示示例的代碼行爲是正確的!

那麼爲什麼在以下位置的威脅不被阻止?爲什麼程序會播放1而不是6?

O . .         O 1 2 
. . .  numbering available moves:  3 4 5 
X X .         X X 6 

這是因爲如果遊戲在完美的發揮失去了程序只是起到第一個可用的舉動。

該算法只關心贏或輸,而不考慮多少動作。

看看威脅被阻塞會發生什麼:

O . .  O . . 
. . .  . X .  and X wins on his next move 
X X O  X X O