2014-12-14 3 views
2

Я пытаюсь реализовать минимаксный алгоритм, у меня есть 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 
} 

ответ

1

Вы должны сделать копию состояния, когда вы делаете hypothetical, в противном случае диск «пробный» остается в самом state.

Это

Player[][] hypothetical = state; 

должен быть

Player[][] hypothetical = (Player[][])state.clone(); 

В качестве альтернативы можно использовать state вместо вашего hypothetical, но добавить удаление диска после цикла:

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 
int best = -10; 
for (int column = 0; column < GRID_WIDTH; column++) { 
    int row = top(hypothetical, column); 
    if (row >= 0) { 
     int tmp = minimax(hypothetical, row, column, player); 
     if (tmp > best) best = tmp; 
    } 
} 
state[r][c] = null; 
return best; 
+0

У меня есть сделал это изменение, но ИИ, использующий алгоритм, все еще, кажется, недостаточно развит. Вы добавили состояние [r] [c] = null, какова цель этого, если алгоритм не должен доходить до этой строки, если он работает правильно? – Ulsting

+0

@dasblinkenlight: Я думаю, что в тех случаях, когда изменяется только один элемент, след более эффективен: стек с действиями, которые необходимо выполнить, чтобы отменить модификацию (в этом случае вернуть старого игрока обратно в сетку). –

+1

@Ulsting Я думаю, что это игра Connect-4ish? В цикле вы возвращаете 'minimax (...)' в первый раз, когда игра действительна, даже если другие пьесы могут быть лучше. –

Смежные вопросы