我的miniMax()
方法返回一个无效动作,并尝试将其应用于当前电路板,但是我认为,此返回的动作是电路板终端节点上的最佳动作。我希望它返回通往该板的最佳动作,这是我的miniMax()
:
public int miniMax(Board board, int depth, boolean maximizingPlayer, int alpha, int beta) {
if (depth == 0 || isTerminalNode(board)) {
return evaluateBoard(board);
// return rand.nextInt((100000 - 10) + 10) + 100000;
}
if (maximizingPlayer) {
int value = Integer.MIN_VALUE;
for (String move : getPossibleMoves(board, board.getCurrentPlayer())) {
Board b = new Board(board);
b.apply(move);
// Board b = board.clone();
// b.apply(move);
int result = Math.max(value, miniMax(b, depth - 1, false, alpha, beta));
if (alpha < result) {
alpha = result;
bestMove = move;
}
if (alpha >= beta) {
break; // beta cut-off
}
}
return alpha;
} else {
int value = Integer.MAX_VALUE;
for (String move : getPossibleMoves(board, board.getEnemyPlayer())) {
Board b = new Board(board);
b.apply(move);
// Board b = board.clone();
// b.apply(move);
int result = Math.min(value, miniMax(b, depth - 1, true, alpha, beta));
if (beta > result) {
beta = result;
}
if (beta <= alpha) {
break; // alpha cut-off
}
}
return beta;
}
}
完成此操作后,它也无法正常工作:
for (int i = 0; i < possibleMovesForBoard.size(); i++) {
String move = possibleMovesForBoard.get(i);
Board b = new Board(board);
b.apply(move);
int score = miniMax(b, 1, true, Integer.MIN_VALUE, Integer.MAX_VALUE);
if (score > lastScore) {
bestMove = move;
lastScore = score;
System.out.println("This is my best move: " + bestMove);
}
}
您可以在递归方法的所有深度中分配全局变量bestMove = move;
,即使您只需要在每次递归移动中将其分配一次,也就是在递归的初始入口点,即如果depth == maxdepth
。