2013-04-12 4 views
0

Я создал простую игру Checkers в Java с minmax AI, но я не работаю. Я использую рекурсивную версию minmax, но с ней что-то не так, потому что она возвращает ходы, которые не лучше, но, возможно, сначала сгенерированы.MinMax AI for Checkers

public int minmax(int [][] board, int depth, int curPlayer){ 
    ArrayList<Move> moves = findMoves(curPlayer, board); 

    if (depth == 0 || moves.size() == 0){ 
     return heurValue(curPlayer, board); 
    } 

    int bestVal = 0; 
    if (curPlayer == GameCore.BLACK){ 
     bestVal = Integer.MIN_VALUE; 
     curPlayer = GameCore.RED; 
    }else{ 
     bestVal = Integer.MAX_VALUE; 
     curPlayer = GameCore.BLACK; 
    } 

    for(int i = 0; i<moves.size(); i++){ 
     Move m = moves.get(i); 

    int [][] boardNew = makeMove(m, board); 

    int value = minmax(boardNew, depth-1, curPlayer); 

    board = undoMove(m, boardNew); 

    // computer plays as black 
    if (curPlayer == GameCore.BLACK){ 
     if (value < bestVal){ 
      bestMove = m; 
      bestVal = value; 
     } 
    }else{ 
     if (value >= bestVal){ 
      bestMove = m; 
      bestVal = value; 
     } 
    } 
    } 
    return bestVal; 
} 

Если я позвоню MinMax с глубиной = 1 она должна «вернуть 7 значений (есть 7 возможных ходов), но возвращает только 1, если я перееду от 2,4 до 3,3 ... но когда Я пытался отладить ее, ArrayList движется имеет правильный размер Так что я не знаю, что случилось с ним :(

EDIT:.. к «вернуться» Я по ошибке означает, что первое условие (когда глубина 0 или ходы пустые) происходит только один раз, но если это было правильно, это должно произойти 7 раз. Извините за мой плохой английский.

Знаете ли вы, сайт, где правильный рекурсивный псевдокод для minmax (лучше с альфа/бета, потому что мне нужно будет его расширять), или вы могли бы помочь мне исправить это? Это должно быть только мелочь. Спасибо!

+0

Нет, если я правильно прочитал ваш вопрос, но «public int minmax (int [] [] board, int depth, int curPlayer)' возвращает только одно значение типа 'int'. Если вы хотите вернуть много значений, вы можете вернуть 'Collection', как' LinkedList' или что-то подобное –

+0

Где вы объявили boardNew? – Joan

+0

RED (человек) начинает игру, после его хода (компьютерные игры) вызывается minmax (для теста с глубиной 1). Для компьютера существует 7 возможных движений. MinMax должен возвращать 7 значений для 7 возможных плат, но это не будет. Обратите внимание, что bestMove является глобальной переменной. Извините за мой плохой английский. – user2275785

ответ

0

Вы написали это, чтобы вернуть только лучшее значение, то есть return bestVal; Если вы хотите, чтобы он возвращал их все, сохраните их в некотором виде и соответствующим образом измените подпись метода.

+0

Извините, что я ошибочно сформулировал проблему, но спасибо за ваше время. :) – user2275785

0

EDIT: Так что это не проблема с подписью, как я впервые подумал.

Я сделал быстрый поиск о MinMax и алгоритме это то, что я нашел an article

Быстро, что я думаю, что очень важно с этой страницы:

значение здесь представляет, насколько хорошо движение есть. Таким образом, игрок MAX попытается выбрать движение с наивысшим значением в конце.

Так что, если я настроен, MinMax вернет только одно движение, одно с bestValue.

+0

Нет, это вызвано моим английским. Я имею в виду это if (depth == 0 || move.size() == 0) {return heurValue (curPlayer, board);} не происходит 7 раз. Но спасибо за ваш ответ. – user2275785

+0

Нет проблем. Я не являюсь носителем языка, поэтому я знаю, как он себя чувствует;) –

+0

@ user2275785 Но исправьте меня, если я ошибаюсь, но возврат 1 значения в порядке, но он должен делать это 7 раз? –