【发布时间】: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 会产生同样的问题),具体取决于玩家。