2015-06-19 15 views
-2

我在探索如何在連接四個遊戲中使用Minimax算法進行alpha-beta修剪。這個評估函數如何在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次甚至是他贏得了比賽的威脅」(這一切都歸結爲填補棋盤和動作時被強制規定的規則有點簡化:第二名球員將會如果第一名球員在那裏有一個奇怪的威脅,他不能填補其他專欄,那麼他必須殺死一個甚至是威脅)。對於給定的規則(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 應該給你一些想法。

Btw。開放書籍(通常以任何形式(例如joseki,fuseki)預定義的智慧和特殊的最終遊戲評估者)可以極大地提高minimax的性能。