不可能的井字游戏Javascript

Impossible tic tac toe game Javascript

本文关键字:游戏 Javascript 不可能      更新时间:2023-09-26

我正在开发一款基本的Javascript Tic-Tac-Toe游戏,让用户可以在电脑上玩。这个游戏的要求之一是用户永远无法击败电脑——他们能做的最多就是打平。我很难弄清楚它的逻辑,我还没有看到任何我能理解的关于如何实现它的例子。现在,计算机只是随机选择一个地点,将它的决定放在轮到它的时候。如果这个随机点是左上角(randomChoice==0)或右下角(random Choice==9),它会将其更改为旁边的框。我已经在下面发布了代码。任何关于这方面的提示都会有所帮助。此外,这是我迄今为止在CodePen上拥有的所有代码的链接。http://codepen.io/Android162010/pen/LGZXQa

function playRandom() {    

    randomChoice = Math.round(Math.random() * 10);
    if (randomChoice == 0) {
        randomChoice = 1;
    }
    if (randomChoice == 10) {
        randomChoice = 9;
    }

    if ($('#' + randomChoice).hasClass('hoverable')) {
        makeTic('#' + randomChoice, false);
    }
    else {
        playRandom();
    }
}

您可以使用minimax算法创建一个玩抖音的AI。

以下是一篇关于使用Tic-Tac Toe的minimax的文章:http://neverstopbuilding.com/minimax

这个想法是,与其随机选择动作,不如展望游戏未来可能的状态,并根据它们的好坏对它们进行排名。作者提出了一个系统,其中获胜的节点被分配值+10,而失败的节点得到-10。

# @player is the turn taking player
def score(game)
    if game.win?(@player)
        return 10
    elsif game.win?(@opponent)
        return -10
    else
        return 0
    end
end

一旦你有了一个根据未来状态对你的影响程度对其进行排名的系统,你就可以制定一个选择最佳状态的算法。以下是作者对算法的简明英文解释:

对算法的描述,假设X是"X";轮流上场的球员;看起来像:

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

最后,这里是作者的解决方案

def minimax(game, depth)
    return score(game) if game.over?
    depth += 1
    scores = [] # an array of scores
    moves = []  # an array of moves
# Populate the scores array, recursing as needed
game.get_available_moves.each do |move|
    possible_game = game.get_new_state(move)
    scores.push minimax(possible_game, depth)
    moves.push move
end
# Do the min or the max calculation
if game.active_turn == @player
    # This is the max calculation
    max_score_index = scores.each_with_index.max[1]
    @choice = moves[max_score_index]
    return scores[max_score_index]
else
    # This is the min calculation
    min_score_index = scores.each_with_index.min[1]
        @choice = moves[min_score_index]
        return scores[min_score_index]
    end
end