2016-02-27 197 views
1

我想让我的minimax算法适用于8x8 Gomoku板,我必须匹配5行/ col /对角才能赢得胜利!我的算法似乎没有正常工作,我无法确定它出错的位置!Java中的Minimax不工作

我的generateMoves()方法工作正常,它会生成所有合法的移动,所以我知道不是这样。最小最大值返回-1,-1作为最佳移动,但当然会抛出一个非法移动错误,因为从0,0到7,7板上不能有-1,-1。

任何帮助表示赞赏。谢谢。

private int[] minimax(int depth, Color [][] board) { 
      List<int[]> nextMoves = generateMoves(board); 

      int bestScore = (me == Color.WHITE) ? Integer.MIN_VALUE : Integer.MAX_VALUE; 
      int currentScore; 
      int bestRow = -1; 
      int bestCol = -1; 

      if (nextMoves.isEmpty() || depth == 0) { 
      bestScore = evaluateBoard(board); 
      } else { 
      for (int[] move : nextMoves) { 
       System.out.println(move[0]+","+move[1]+" THIS WAS ATTEMPTED"); 
       board[move[0]][move[1]] = Color.WHITE; 
       if (me == Color.BLACK) { 
        currentScore = minimax(depth - 1, board)[0]; 
        if (currentScore > bestScore) { 
         bestScore = currentScore; 
         bestRow = move[0]; 
         bestCol = move[1]; 
        } 
       } else { // oppSeed is minimizing player 
        currentScore = minimax(depth - 1, board)[0]; 
        if (currentScore < bestScore) { 
         bestScore = currentScore; 
         bestRow = move[0]; 
         bestCol = move[1]; 
        } 
       } 
       board[move[0]][move[1]] = null; 
      } 
      } 
      return new int[] {bestRow, bestCol}; 
     } 

public int evaluateBoard(Color[][] board) { 
    int score = 0; 
    // Check all the rows 
    for (int i = 0; i < 8; i++) { 
     int blank = 0; 
     int black = 0; 
     int white = 0; 
     for (int j = 0; j < 8 - 5; ++j) { 
      if (board[i][j] == Color.black) { 
       black++; 
       if (board[i][j + 1] == Color.BLACK) { 
        black++; 
        if (board[i][j + 2] == Color.BLACK) { 
         if (board[i][j + 3] == Color.BLACK) { 
          black++; 
          if (board[i][j + 4] == Color.BLACK) { 
           black++; 
          } 
         } 
        } 
       } 
      } else if (board[i][j] == Color.WHITE) { 
       white++; 
       if (board[i][j + 1] == Color.WHITE) { 
        white++; 
        if (board[i][j + 2] == Color.WHITE) { 
         white++; 
         if (board[i][j + 3] == Color.WHITE) { 
          white++; 
          if (board[i][j + 4] == Color.WHITE) { 
           white++; 
          } 
         } 
        } 
       } 
      } 
     } 
     System.out.println(black); 
     score += scoreChange(black, white); 
    } 

    // Check all the columns 
    for (int j = 0; j < 8; ++j) { 
     int blank = 0; 
     int black = 0; 
     int white = 0; 
     for (int i = 0; i < 8 - 5; ++i) { 
      if (board[i][j] == Color.black) { 
       black++; 
       if (board[i + 1][j] == Color.BLACK) { 
        black++; 
        if (board[i + 2][j] == Color.BLACK) { 
         black++; 
         if (board[i + 3][j] == Color.BLACK) { 
          black++; 
          if (board[i + 4][j] == Color.BLACK) { 
           black++; 
          } 
         } 
        } 
       } 
      } else if (board[i][j] == Color.WHITE) { 
       white++; 
       if (board[i + 1][j] == Color.WHITE) { 
        white++; 
        if (board[i + 2][j] == Color.WHITE) { 
         white++; 
         if (board[i + 3][j] == Color.WHITE) { 
          white++; 
          if (board[i + 4][j] == Color.WHITE) { 
           white++; 
          } 
         } 
        } 
       } 
      } 
     } 
     score += scoreChange(black, white); 
    } 

    int black = 0; 
    int white = 0; 
    // Check diagonal (Second) 
    for (int i = 7, j = 0; i > 3; --i, ++j) { 
     if (board[i][j] == Color.black) { 
      black++; 
      if (board[i - 1][j + 1] == Color.black) { 
       black++; 
       if (board[i - 2][j + 2] == Color.black) { 
        black++; 
        if (board[i - 3][j + 3] == Color.black) { 
         black++; 
         if (board[i - 4][j + 4] == Color.black) { 
          black++; 
         } 
        } 
       } 
      } 
     } else if (board[i][j] == Color.white) { 
      white++; 
      if (board[i - 1][j + 1] == Color.white) { 
       white++; 
       if (board[i - 2][j + 2] == Color.white) { 
        white++; 
        if (board[i - 3][j + 3] == Color.white) { 
         white++; 
         if (board[i - 4][j + 4] == Color.white) { 
          white++; 
         } 
        } 
       } 
      } 
     } 
    } 
    score += scoreChange(black, white); 

    black = 0; 
    white = 0; 
    // Check Diagonal (First) 
    for (int i = 0, j = 0; i < 4; ++i, ++j) { 
     if (board[i][j] == Color.black) { 
      black++; 
      if (board[i + 1][j + 1] == Color.black) { 
       black++; 
       if (board[i + 2][j + 2] == Color.black) { 
        black++; 
        if (board[i + 3][j + 3] == Color.black) { 
         black++; 
         if (board[i + 4][j + 4] == Color.black) { 
          black++; 
         } 
        } 
       } 
      } 
     } else if (board[i][j] == Color.white) { 
      white++; 
      if (board[i + 1][j + 1] == Color.white) { 
       white++; 
       if (board[i + 2][j + 2] == Color.white) { 
        white++; 
        if (board[i + 3][j + 3] == Color.white) { 
         white++; 
         if (board[i + 4][j + 4] == Color.white) { 
          white++; 
         } 
        } 
       } 
      } 
     } 
    } 
    score += scoreChange(black, white); 
    return score; 
} 

private int scoreChange(int black, int white) { 
    int change; 

    if (black == 5) { 
     change = -10000; 
    } else if (black == 4 && white == 0) { 
     change = -1000; 
    } else if (black == 3 && white == 0) { 
     change = -100; 
    } else if (black == 2 && white == 0) { 
     change = -10; 
    } else if (black == 1 && white == 0) { 
     change = -1; 
    } else if (white == 5) { 
     change = 10000; 
    } else if (white == 4 && black == 0) { 
     change = 1000; 
    } else if (white == 3 && black == 0) { 
     change = 100; 
    } else if (white == 2 && black == 0) { 
     change = 10; 
    } else if (white == 1 && black == 0) { 
     change = 1; 
    } else { 
     change = 0; 
    } 
    return change; 
} 
+0

你有你的< and >错...... – elyashiv

回答

0

如果玩家是黑人,最好的分数是Integer.Max。目前的分数永远不会比这大,所以最好的举动从未设置。对于白人来说,问题是一致的:最好的分数是Integer.Min,现在的分数永远不会更小。

用调试器找到像这样的错误要容易得多。设置一个断点,您将移动设置为-1,然后前进。当你看到这些if语句时,如果代码没有进入,你会感到惊讶。你将仔细看看被比较的值,然后意识到你的错误。

+0

所以我基本定currentScore < >南辕北辙,我已经没有固定的,但它似乎并没有被卫冕也不以为聪明还是 – Aceboy1993

+0

我不玩游戏,我没有你所有的代码,所以我无法评估你的代码不工作的原因。 (我也不应该)但是我怀疑你想要bestScore代表的不是“最好的得分”,而是“我发现到现在为止的最好成绩”。改变你的比较方向只是接受*每一个*举动。你也可以用调试器解决问题。 –