有人可以解释minimax tic tac toe算法

时间:2017-08-22 15:54:16

标签: javascript algorithm youtube tic-tac-toe minimax

我正在研究tic tac toe(用户与计算机)的AI,并且我使用minimax算法来实现计算机的最佳移动。我在youtube上查看了一些视频,并阅读了一些人的代码。但是,有些部分代码我仍然对正在做的事情感到困惑。让我们从tic tac toe minimax函数中获取以下代码。那里有一个主要的if,else if,else语句,其他一切都来自那里。我的主要问题是理解嵌入式for循环,以及后面的2个ifs。我认为,我已经对这些内容做了一些评论。我从此YouTube视频中获取了示例代码:https://www.youtube.com/watch?v=x_Je9i3aKNk tic tac toe的minimax函数。

//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;
    }
}

1 个答案:

答案 0 :(得分:4)

Minimax算法的关键是两个玩家之间的来回,其中&#34;转向的玩家是&#34;希望以最高分获得此举。反过来,每个可用移动的得分由对方玩家决定其可用移动中的哪一个具有最小分数来确定。并且对手球员移动的得分再次由轮流球员试图最大化其得分以及从移动树一直到最终状态一直决定。

算法的描述,假设X是&#34;轮流玩家,&#34;看起来像是:

  • 如果游戏结束,请从X的角度返回分数。
  • 否则,获取每个可能移动的新游戏状态列表
  • 创建分数列表
  • 对于这些状态中的每一个,将该状态的minimax结果添加到分数列表
  • 如果是X,请从分数列表中返回最高分
  • 如果轮到它,请从分数列表中返回最低分数

您会注意到此算法是递归的,它会在玩家之间来回翻转,直到找到最终得分。

让我们通过完整移动树来完成算法的执行,并从算法上说明为什么会选择即时获胜动作:

minimax tic tac toe algorithm

  • X的状态为1. X生成状态2,3和4,并在这些状态上调用minimax。
  • 状态2将得分+10推至州1的得分列表,因为游戏处于最终状态。
  • 状态3和4不处于结束状态,因此3生成状态5和6并在它们上调用minimax,而状态4生成状态7和8并在它们上调用minimax。
  • 状态5将得分-10推到状态3的得分列表中,而状态7则将得分-10推到状态4的得分列表中。
  • 状态6和8生成唯一可用的移动,即结束状态,因此它们都将+10的分数添加到状态3和4的移动列表中。
  • 因为在状态3和4都转了,所以O会寻找 最低分,并给出-10和+10之间的选择,两个州 3和4将产生-10。
  • 最后,状态2,3和4的得分列表分别填充+ 10,-10和-10,并且寻求最大化得分的状态1将选择得分+10,状态2的获胜移动。 / LI>

有关代码中算法的更多详细信息和实现,您可以阅读以下文章:

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