我的极小极大算法tic-tac-toe-AI的代码似乎不起作用,我也不知道为什么。如果一个移动导致了一个损失,那么返回一个负值似乎是错误的,它没有区分防御移动和进攻移动。你知道吗
而不是选择将X放置在位置6上以阻止对手连续到达3,而是将其放置在另一个磁贴上
board = [
"X", "X", "O",
"O", "O", "X",
"-", "-", "-",
]
opp = "O"
plyr = "X"
def getOpenPos(board):
openPos = []
for index, state in enumerate(board):
if state == "-":
openPos.append(index)
return openPos
def winning(board, plyr):
if ((board[0] == plyr and board[1] == plyr and board[2] == plyr) or
(board[3] == plyr and board[4] == plyr and board[5] == plyr) or
(board[6] == plyr and board[7] == plyr and board[8] == plyr) or
(board[0] == plyr and board[4] == plyr and board[8] == plyr) or
(board[1] == plyr and board[4] == plyr and board[7] == plyr) or
(board[2] == plyr and board[4] == plyr and board[6] == plyr) or
(board[0] == plyr and board[3] == plyr and board[6] == plyr) or
(board[2] == plyr and board[5] == plyr and board[8] == plyr)):
return True
else:
return False
def minimax(board, turn, FIRST):
possibleMoves = getOpenPos(board)
#check if won
if (winning(board, opp)):
return -10
elif (winning(board, plyr)):
return 10
scores = []
#new board created for recursion, and whoevers turn it is
for move in possibleMoves:
newBoard = board
newBoard[move] = turn
if (turn == plyr):
scores.append( [move,minimax(newBoard, opp, False)] )
elif (turn == opp):
scores.append( [move, minimax(newBoard, plyr, False)] )
#collapse recursion by merging all scores to find optimal position
#see if there is a negative value (loss) and if there is its a -10
if not FIRST:
bestScore = 0
for possibleScore in scores:
move = possibleScore[0]
score = possibleScore[1]
if score == -10:
return -10
else:
if score > bestScore:
bestScore = score
return bestScore
else:
bestMove, bestScore = 0, 0
for possibleScore in scores:
move = possibleScore[0]
score = possibleScore[1]
if score > bestScore:
bestMove = move
bestScore = score
#returns best position
return bestMove
print(minimax(board, plyr, True))
我发现你的代码有两个问题。如果您修复了它们,在本例中至少会得到
6
。你知道吗第一个问题是,行
newBoard = board
实际上并没有复制列表,它只是复制引用。可以通过将其更改为newBoard = board[:]
来修复。你知道吗第二个问题是
bestScore
的起始值实际上并没有超出预期的范围,因此您不会每次都得到bestIndex
的值。我把bestMove, bestScore = 0, 0
改成了bestMove, bestScore = 0, -11
,似乎对我有用。你知道吗相关问题 更多 >
编程相关推荐