Я пытаюсь реализовать минимаксный алгоритм, у меня есть jist алгоритма, но мне кажется, что мне нужно «отменить» движения в определенной точке алгоритма. Я не могу найти, где это должно быть. Если бы кто-нибудь мог сказать мне, где и почему, это было бы оценено.Minimax gamestate
private int minimax(Player[][] state, int r, int c, Player player) {
if (getWinner(state, r, c) == player) return 10; //returns 10 if player is winner
Player opponent = (player == Player.PLAYERX ? Player.PLAYERO : Player.PLAYERX);
if (getWinner(state, r , c) == opponent) return -10; //returns -10 if opponent is winner
if (getPlays(state, player) > getPlays(state, opponent)) state[r][c] = opponent; //Puts opponent in current spot if player has played more times than opponent
else state[r][c] = player; //Puts player in current spot if opponent has played more times than player
for (int column = 0; column < GRID_WIDTH; column++) {
int row = top(state, column);
if (row >= 0) {
return minimax(state, row, column, player);
}
}
return 0; //minimax will only ever return this if there are no plays left to be made, meaning that the scenario resulted in a draw
}
У меня есть сделал это изменение, но ИИ, использующий алгоритм, все еще, кажется, недостаточно развит. Вы добавили состояние [r] [c] = null, какова цель этого, если алгоритм не должен доходить до этой строки, если он работает правильно? – Ulsting
@dasblinkenlight: Я думаю, что в тех случаях, когда изменяется только один элемент, след более эффективен: стек с действиями, которые необходимо выполнить, чтобы отменить модификацию (в этом случае вернуть старого игрока обратно в сетку). –
@Ulsting Я думаю, что это игра Connect-4ish? В цикле вы возвращаете 'minimax (...)' в первый раз, когда игра действительна, даже если другие пьесы могут быть лучше. –