如何修正tic-tac-toe-gam的minimax算法

2024-09-28 21:50:47 发布

您现在位置:Python中文网/ 问答频道 /正文

为了一个学校项目,我一直在努力做一个无与伦比的井字游戏。为了做到这一点,我试图实现一个极大极小算法,它给出了意想不到的输出,我还没有弄清楚为什么,不修复任何东西

我试着打印出变量,看看什么时候出了问题,但是对于任何比最简单的情况(它在其中工作)更复杂的事情,它输出的东西太多了,任何人都无法筛选,当我处理完它时,跟踪函数调用自身,以及它调用自身的次数是很困难的。我试过把严格不等式改成非严格不等式。我试过重写整件事好几次,看看我是不是有打字错误。我已经通过了逻辑,但什么也没找到

这是我的算法

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,这意味着出于某种原因,移动没有改变默认值


Tags: orandboardoutputmoveifdefempty
1条回答
网友
1楼 · 发布于 2024-09-28 21:50:47

我认为这应该行得通(我刚刚测试了我在评论中提出的建议)。可怜的失败者意识到这是不可避免的命运,所以他太过冷静,没有采取行动:-)

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:

相关问题 更多 >