我一直在研究一个tic tac toe程序,以便更好地理解minimax算法的工作原理。以下实现无法正常工作,因为计算机可能会松动游戏。如果程序工作正常,理论上这应该是不可能的......
我是否犯了极小极大的实施错误,或获得最佳动作?
我之前从未实现过算法: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())));
}
谢谢。
答案 0 :(得分:0)
这很简单:一个完美的玩家必须搜索整个树的最大深度(截止节点除外),但是你的程序仅限于4层!
找到最佳动作是错误的:
int value = alphabeta(board, 3, turn, -10000, 10000);
将其更改为
int value = alphabeta(board, 8, turn, -10000, 10000);
答案 1 :(得分:0)
除了之前的回答,我很确定你的GetBestMove是错误的:只要一个移动更好或等于你当前最好的移动,你就会添加一个选择。但是,当最佳值发生变化时,您实际上并没有清除列表。这意味着您的选择列表中会有松动的动作。