我一直在研究井字游戏,以便更好地理解极小极大算法的工作原理。以下实现无法正常工作,因为计算机可能会丢失游戏。如果程序正常运行,理论上这应该是不可能的......
我在执行极小极大或获得最佳移动方面犯了错误吗?
我以前从未实现过该算法:s
评价功能
public static int evaluate(char[] board, char turn) {
if (isWinFor('x', board)) {
return -1;
} else if (isWinFor('o', board)) {
return 1;
}
return 0;
}
极小极大
public static int alphabeta(char[] board, int depth, char turn, int alpha, int beta) {
if (depth == 0 || gameOver(board)) {
return evaluate(board, turn);
} else {
for (int move : possibleMoves(board)) {
makeMove(board, turn, move);
turn = changeTurn(turn);
int value = alphabeta(board, depth--, turn, alpha, beta);
makeMove(board, ' ', move);
if (turn == 'o') {
if (value > alpha) {
alpha = value;
}
if (alpha >= beta) {
return beta;
}
} else if (turn == 'x') {
if (value < beta) {
beta = value;
}
if (beta <= alpha) {
return alpha;
}
}
}
if (turn == 'o') {
return alpha;
} else {
return beta;
}
}
}
寻找最佳动作
public static void getBestMove(char[] board, char turn) {
Random random = new Random();
int bestValue = -10000;
List<Integer> choices = new ArrayList<Integer>();
for (int move : possibleMoves(board)) {
makeMove(board, turn, move);
turn = changeTurn(turn);
int value = alphabeta(board, 3, turn, -10000, 10000);
makeMove(board, ' ', move);
if (value > bestValue) {
bestValue = value;
//start code edit
choices.clear();
//end code edit
choices.add(move);
} else if (value == bestValue) {
choices.add(move);
}
}
makeMove(board, turn, choices.get(random.nextInt(choices.size())));
}
谢谢你。