ミニマックスアルゴリズムがどのように機能するかをよりよく理解するために、私は三目並べプログラムに取り組んできました。次の実装は、コンピューターがゲームに負ける可能性があるため、正しく機能していません。プログラムが正しく動作している場合、理論的にはこれは不可能なはずです...
ミニマックスの実装、または最善の手の取得で間違いを犯しましたか?
私は以前にアルゴリズムを実装したことがありません: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())));
}
ありがとうございました。