2017-08-22 54 views
-1

我正在研究tic tac toe(用戶vs計算機)的AI,並且我正在使用minimax算法實現計算機的最佳移動。我已經看過YouTube上的一些視頻,並閱讀了一些人的代碼。但是,有些部分代碼我仍然對正在做的事感到困惑。以下面的代碼爲例,來自井號最小極小函數。有一個主要的if,else if,else語句和其他所有從那裏得到的。我的主要問題是理解嵌入的for循環,以及後面的2個if。我認爲,我已經對這些東西發表了一些評論。我從這個YouTube視頻中獲取了示例代碼:https://www.youtube.com/watch?v=x_Je9i3aKNk 最小極小函數用於井字遊戲。有人可以解釋minimax tic tac toe算法

//minimax function 
function minimax(newGrid, depth, player) { 
    const gameState = isGameOver(newGrid); 
    //if the game is not over, evalute best move for computer 
    if(gameState === false) { 
     const values = []; 

     for(var i = 0; i < 3; i++) { 
      for(var j = 0; j < 3; j++) { 
       const gridCopy = _.cloneDeep(newGrid); 
       //if that spot is taken, skip to next loop 
       if(gridCopy[i][j] !== ' ') continue; 
       //if spot is player, evaluate 
       gridCopy[i][j] = player; 
       //need clarification 
       const value = minimax(gridCopy, depth+1, (player == PLAYER_TOKEN) ? COMPUTER_TOKEN : PLAYER_TOKEN); 
       values.push(value); 
      } 
     } 
     //need clarification for computer turn 
     if(player === COMPUTER_TOKEN) { 
      const max = _.maxBy(value, (v) => { 
       return v.cost; 
      }); 
      if(depth === 0) { 
       return max.cell; 
      } 
      else { 
       return max.cost; 
      } 
     //need clarification for user turn 
     else { 
      const min = _.minBy(value, (v) => { 
       return v.cost; 
      }); 
      if(depth === 0) { 
       return v.cell; 
      } 
      else { 
       return v.cost; 
      } 
     } 

    //if game state is null return 0 
    else if (gameState === null) { 
     return 0; 
    } 
    //if game state is player return negative 
    else if(gameState === PLAYER_TOKEN) { 
     return depth - 10; 
    } 
    //if game state is computer return positive 
    else if(gameState === COMPUTER_TOKEN) { 
     return 10 - depth; 
    } 
} 

回答

4

Minimax算法的關鍵是兩個玩家之間來回走動,其中「轉向它」的玩家想要以最大分數選擇移動。反過來,每個可用移動的得分由對手決定哪一個可用移動具有最小得分來確定。而對手球員移動的得分再次由輪轉球員試圖最大化其得分來決定,等等一直沿着移動樹移動到結束狀態。

一種算法描述,假定X是「轉走的球員,」看起來是這樣的:

  • 如果比賽結束時,返回從X的角度得分。
  • 否則得到的新的遊戲狀態的列表,每一個可能的舉動
  • 創建分數列表
  • 對於這些國家的加入該國的極大極小結果分數列表
  • 如果是X的轉,回從成績表
  • 如果是O公司又將最高分,從分數上返回列表中的最低分數

你會發現,這個算法是遞歸的,它翻轉來回球員之間,直到最後得分了 被發現。

讓我們通過算法的執行與飽動樹,並說明爲什麼,算法,即時獲獎此舉將有所回升:

minimax tic tac toe algorithm

  • 這是X輪到狀態1 X生成國家2,3和4,並在這些州調用最低限額。
  • 由於遊戲處於結束狀態,狀態2會將狀態1的得分+10推到狀態1的得分列表。
  • 狀態3和4不處於最終狀態,所以3生成狀態5和6並調用它們的最小值,而狀態4生成狀態7和8並調用它們的最小值。
  • 狀態5將狀態3的分數列表中的-10分推到狀態4的分數列表上,同樣的情況發生在狀態7上,將狀態4的分數列表中的分數推到-10上。
  • 狀態6和8生成唯一可用的移動,它們是結束狀態,因此它們都將+10的分數添加到狀態3和4的移動列表中。
  • 因爲在兩種狀態3和4,O將試圖找到最低分數,並且在-10和+10之間選擇,兩個狀態 3和4將產生-10。
  • 最後,狀態2,3和4的得分列表分別填充+10,-10和-10,並且尋求最大化得分的狀態1將選擇具有得分+10狀態2的獲勝移動。

有關詳細信息,並在代碼實現的算法,你可以通過下面的文章有:

Tic Tac Toe: Understanding The Minimax Algorithm

online version tic tac toe

Source code on github

Reference: http://neverstopbuilding.com/minimax

Here is the presentation slide by us