2017-07-18 39 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