为了一个学校项目,我一直在努力做一个无与伦比的井字游戏。为了做到这一点,我试图实现一个极大极小算法,它给出了意想不到的输出,我还没有弄清楚为什么,不修复任何东西
我试着打印出变量,看看什么时候出了问题,但是对于任何比最简单的情况(它在其中工作)更复杂的事情,它输出的东西太多了,任何人都无法筛选,当我处理完它时,跟踪函数调用自身,以及它调用自身的次数是很困难的。我试过把严格不等式改成非严格不等式。我试过重写整件事好几次,看看我是不是有打字错误。我已经通过了逻辑,但什么也没找到
这是我的算法
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,这意味着出于某种原因,移动没有改变默认值
我认为这应该行得通(我刚刚测试了我在评论中提出的建议)。可怜的失败者意识到这是不可避免的命运,所以他太过冷静,没有采取行动:-)
功能不错
顺便说一句,你可以使用一个分数因子来缩短代码。因此,对于最小化玩家,您将因子设置为-1,将最大化设置为1。这样,您就可以在两个玩家的空字段和循环体上重复使用循环,而无需执行两次,只需将条件更改为:
相关问题 更多 >
编程相关推荐