Реализация MiniMax реверси
Я пытаюсь реализовать алгоритм MiniMax в игре Reversi/Othello, и я довольно застрял, поскольку написанная мной функция выглядит совершенно нормально, и все же я получаю некоторые странные движения и сбой после нескольких. Вот функция поиска оптимального хода:
public Field findBestMove(GameBoard gb, int depth, int player)
{
if(depth >= max_depth) return null;
ArrayList <Field> moves = findAllPossibleMoves(gb, player);
Field best_move = null;
/** iterating over all possible moves, to find the best one */
for (int i=0; i<moves.size(); i++)
{
/* board to simulate moves */
GameBoard temp_board = new GameBoard(gb);
Field move = moves.get(i);
game.move(move, temp_board, player);
int opposite_player = player == GameBoard.WHITE ? GameBoard.BLACK : GameBoard.WHITE;
Field best_deep_move = findBestMove (temp_board, depth + 1, opposite_player);
/** if the maximum depth is reached, we have a null, so we evaluate */
if (best_deep_move == null)
{
/** we rate it according to the evaluation table */
move.setRating(evaluate (temp_board, player));
}
else
{
move.setRating(best_deep_move.getRating());
}
if(best_move == null)
{
best_move = move;
}
else
{
if (depth%2==0)
{
/** for us, we look for the maximum */
if (best_move.getRating() < move.getRating()) best_move = move;
}
else
{
/** for the opponent, we look for the minimum */
if (best_move.getRating() > move.getRating()) best_move = move;
}
}
}
return best_move;
}
После каждого хода активный игрок меняется. В методе onTouchEvent в GameView сначала игрок делает свой ход, а затем игрок переключается на БЕЛЫЙ, который является ИИ, и он делает ход. Он должен найти лучший ход в своем дереве, а затем выполнить ОДИН ход, вместо этого он делает несколько странных ходов. Я не знаю, почему для каждой ветви я создаю новую копию доски, поэтому я не знаю, почему основная игровая доска модифицируется.
Есть идеи?
1 ответ
Если изменение копии объекта влияет на оригинал. Тогда это "мелкая копия". Это означает, что где-то в структуре данных объекты являются общими. Вы хотите "глубокую копию".
Покажите нам код для new GameBoard(gb)
Некоторые опции: вы можете реализовать клон для вашей игровой доски и всех объектов, которые она содержит (и что они содержат). Или внедрите функцию отмены () на игровой доске. Пока вы отменяете каждый ход на игровой доске, вы можете выполнять на ней ходы. Это сэкономит память и затраты на создание объекта при выполнении тестовых перемещений во время оценки.