2015-06-19 9 views
-2

Я изучаю, как алгоритм Minimax можно использовать для подключения четырех игр с обрезкой альфа-бета.Как эта функция оценки работает в игре Connect 4? (Java)

Так я просматривал исходный код о стратегии Connect4 игрока и нашел эту оценочную функцию:

/** 
* Get the score of a board 
*/ 
public int score(){ 
    int score = 0; 
    for (int r= 0; r < ROWS; r++) { 
     if (r <= ROWS-4) { 
      for (int c = 0; c < COLS; c++) { 
       score += score(r, c); 
      } 
     } else { 
      for (int c = 0; c <= COLS-4; c++) { 
       score += score(r, c); 
      } 
     } 
    } 
    return score; 
} 


/** 
* Helper method to get the score of a board 
*/ 
public int score(int row, int col){ 
    int score = 0; 
    boolean unblocked = true; 
    int tally = 0; 
    //int r, c; 
    if (row < ROWS-3) { 
     //check up 
     unblocked = true; 
     tally = 0; 

     for (int r=row; r<row+4; r++) { 
      if (board[r][col] == CHECKERS[1-playerToMoveNum]) { 
       unblocked = false; 
      } 
      if (board[r][col] == CHECKERS[playerToMoveNum]) { 
       tally ++; 
      } 
     } 
     if (unblocked == true) { 
      score = score + (tally*tally*tally*tally); 
     } 
     if (col < COLS-3) { 
      //check up and to the right 
      unblocked = true; 
      tally = 0; 
      for (int r=row, c=col; r<row+4; r++, c++) { 
       if (board[r][c] == CHECKERS[1-playerToMoveNum]) { 
        unblocked = false; 
       } 
       if (board[r][c] == CHECKERS[playerToMoveNum]) { 
        tally ++; 
       } 
      } 
      if (unblocked == true) { 
       score = score + (tally*tally*tally*tally); 
      } 
     } 
    } 
    if (col < COLS-3) { 
     //check right 
     unblocked = true; 
     tally = 0; 
     for (int c=col; c<col+4; c++) { 
      if (board[row][c] == CHECKERS[1-playerToMoveNum]) { 
       unblocked = false; 
      } 
      if (board[row][c] == CHECKERS[playerToMoveNum]) { 
       tally ++; 
      } 
     } 
     if (unblocked == true) { 
      score = score + (tally*tally*tally*tally); 
     } 
     if (row > 2) { 
      //check down and to the right 
      unblocked = true; 
      tally = 0; 
      for (int r=row, c=col; c<col+4; r--, c++) { 
       if (board[r][c] == CHECKERS[1-playerToMoveNum]) { 
        unblocked = false; 
       } 
       if (board[r][c] == CHECKERS[playerToMoveNum]) { 
        tally ++; 
       } 
      } 
      if (unblocked == true) { 
       score = score + (tally*tally*tally*tally); 
      } 
     } 
    } 
    return score; 
} 

я нашел весь этот код в этом PDF: http://ryanmaguiremusic.com/media_files/pdf/ConnectFourSource.pdf

Я просто хочу понять, как эта функция оценки работает и решает, какой лучший способ сделать ... Может ли кто-нибудь мне помочь? Было бы весьма полезно.

ответ

1

Вот общий ответ:

Оценка должна дать лучшие значения для улучшения позиций. В играх положение часто оценивается путем вычисления оценки следующим образом: увеличивайте оценку для желаемых конфигураций/событий и уменьшайте ее для нежелательных. Решение о том, насколько оцениваемая функция должна изменить значение (= балансировка весов), может быть очень сложной.

Если мы применим это к , подключите четыре, тогда одной из функций может быть количество угроз. Но для действительно хорошего алгоритма (который разрешает 7x6) вам нужно посмотреть, будет ли выигрышный ход на нечетной или четной линии. И тогда есть некоторые правила, такие как «если у 2-го игрока есть 2 даже угрозы, которые он выиграл в игре» (все сводится к тому, что при заполнении доски и ходов вынуждены, приведенное правило немного упрощено: второй игрок должны убить даже угрозу, если он не может заполнить другие столбцы, если у 1-го игрока есть странная угроза).

Простой пример для правила данного (O = первого игрока, X = второй игрок), X побед:

* X X X * 
O O X O O 
1 2 3 4 5 6 7 

Был один очень подробный научный доклад об этом. Самое близкое, что я мог найти на данный момент: http://web.mit.edu/sp.268/www/2010/connectFourSlides.pdf Должны дать вам несколько идей.

КПП. Открытие книг (как правило, предопределенная мудрость в любой форме, например, joseki, fuseki) и специальных оценщиков конечных игр может значительно повысить производительность минимакса.