【问题标题】:How to fix my minimax algorithm for tic tac toe game如何修复我的井字游戏的极小极大算法
【发布时间】:2019-06-13 01:53:46
【问题描述】:

对于一个学校项目,我一直在尝试制作一款无与伦比的井字游戏。为此,我尝试实现一个极小极大算法,但它给出了意想不到的输出,我无法弄清楚原因,没有解决任何问题。

我尝试打印出变量以查看何时出现问题,但对于任何比最简单的情况(它适用)更复杂的情况,它输出的东西太多,任何人都无法筛选,当我工作时通过它,跟踪调用自身的函数,以及它调用自身的次数是很困难的。我尝试将严格的不等式改为非严格的不等式。我已经尝试重写整个内容几次,看看我是否只是有一个错字。我已经遍历了逻辑,但什么也没找到。

这是我的算法

def minimax(newboard, player, huplayer, aiplayer):
    move=-1
    empty=emptyindices(newboard)
    if winning(newboard, huplayer):
        score=-1
    elif winning(newboard, aiplayer):
        score = 1
    elif empty==[]:
        score=0
    else:
        if player == aiplayer:
            score=0
            for i in empty:
                newboard[i]=player
                output=minimax(newboard, huplayer, huplayer, aiplayer)
                tempscore=output[1]
                if tempscore > score:
                    score=tempscore
                    move = i
                    newboard[i]=""
                newboard[i]=""
        if player == huplayer:
            score=0
            for i in empty:
                newboard[i]=player
                output=minimax(newboard, aiplayer, huplayer, aiplayer)
                tempscore=output[1]
                if tempscore < score:
                    score=tempscore
                    move = i
                    newboard[i]=""
                newboard[i]=""
    return [move,score]

我已经将板子从 0 索引到 8 像

0 | 1 | 2

3 | 4 | 5

6 | 7 | 8

我认为使用的其他函数没有错误,但无论如何我都会将它们包含在此处,以防万一它们确实是问题。

def winning(board,player):
    if (board[0]==player and board[1]==player and board[2]==player) or (board[3]==player and board[4]==player and board[5]==player) or(board[6]==player and board[7]==player and board[8]==player) or(board[0]==player and board[3]==player and board[6]==player) or (board[1]==player and board[4]==player and board[7]==player) or(board[2]==player and board[5]==player and board[8]==player) or (board[0]==player and board[4]==player and board[8]==player) or (board[2]==player and board[4]==player and board[6]==player):
        win=True
    else:
        win=False
    return win

def emptyindices(board):
    empty=[]
    for i in range(9):
        if board[i]=="":
            empty.append(i)
    return empty

对于计算机可以立即获胜的简单情况,它会这样做。 但是对于像

print(minimax(['X', '', '', 'O', '', 'X', 'X', 'O', 'O'],"X","O","X"))

输出是

[-1, 0]

即使计算机可以通过移动 2 来保证获胜,这意味着由于某种原因,移动并没有改变默认值

【问题讨论】:

  • 我不太确定,但这可能与将您的分数初始化为 0 有关吗?在某些情况下,您的代码可能根本没有选择移动,因为递归调用返回的结果比当前玩家的得分 0 差,因此他们怯懦地“选择”不移动(这意味着移动 =-1) .也许您可以尝试将分数初始化为 -2 / 2(-1/1 会产生同样的问题),具体取决于玩家。

标签: python minimax


【解决方案1】:

我认为这应该可行(我刚刚测试了我在评论中提出的建议)。可怜的输球选手已经瘫痪到无法采取行动,认识到这是不可避免的命运:-)

def minimax(newboard, player, huplayer, aiplayer):
    move=-1
    empty=emptyindices(newboard)
    if winning(newboard, huplayer):
        score=-1
    elif winning(newboard, aiplayer):
        score = 1
    elif empty==[]:
        score=0
    else:
        if player == aiplayer:
            score=-2
            for i in empty:
                newboard[i]=player
                output=minimax(newboard, huplayer, huplayer, aiplayer)
                tempscore=output[1]
                if tempscore > score:
                    score=tempscore
                    move = i
                    newboard[i]=""
                newboard[i]=""
        if player == huplayer:
            score=2
            for i in empty:
                newboard[i]=player
                output=minimax(newboard, aiplayer, huplayer, aiplayer)
                tempscore=output[1]
                if tempscore < score:
                    score=tempscore
                    move = i
                    newboard[i]=""
                newboard[i]=""
    return [move,score]

不错的功能!

顺便说一句。您可以通过使用分数因子来使代码更短。因此,对于最小化玩家,您将因子设置为 -1 以将最大化为 1。这样,您可以为两个玩家重复使用空字段和循环体上的循环,而无需通过将条件更改为类似的东西来实现它们两次:

if tempscore*factor > score:

【讨论】:

  • 非常感谢!几个星期以来,我一直在为这件事发疯,能真正发挥作用真是太好了。
  • 不客气。我知道 min-max 和 alpha-beta 策略很难调试。
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
相关资源
最近更新 更多