这是我的基本Tic Tac Toe程序的代码(减去实际的游戏类和我的测试)。 我在编写实际的minimax算法时遇到了麻烦。我很难核实实际发生了什么,但这段代码似乎只是从当前状态中随机移动。
我的想法是,我无法初始化最好的' minimax()中的变量,因为每次调用函数时它都会被覆盖...我此时真的丢失了。
有人能指出我在这个算法上的正确方向吗?我觉得我非常接近,但是错过了关于递归的一些关键点或概念,这些将把这些放在一起。
def makeMove(board, player, location):
gridlist = list(board)
gridlist[location] = player
return ''.join(gridlist)
def printBoard(board):
return board
def winner(board):
for row in winning_combos:
if (board[row[0]] is not ' ') and (equal([board[i] for i in row])):
return board[row[0]]
def equal(row):
return row == [row[0]] * 3
winning_combos = [
[0, 1, 2], [3, 4, 5], [6, 7, 8],
[0, 3, 6], [1, 4, 7], [2, 5, 8],
[0, 4, 8], [2, 4, 6]]
def availableMoves(board):
return [k for k, v in enumerate(board) if v == ' ']
def isComplete(board):
if availableMoves(board) == []:
return True
elif winner(board):
return True
else:
return False
def x_won(board):
return winner(board) == 'x'
def o_won(board):
return winner(board) == 'o'
def tied(board):
return isComplete(board) and winner(board) is None
def get_enemy(player):
if player == 'x':
return 'o'
else:
return 'x'
def score(board):
if x_won(board):
return 10
elif o_won(board):
return -10
elif tied(board):
return 0
def determine(board, player):
if isComplete(board):
return score(board)
best = 0
for move in availableMoves(board):
board = makeMove(board, player, move)
val = determine(board, get_enemy(player))
print val
if val > best:
best = val
return best
答案 0 :(得分:1)
您的代码示例缺少minimax算法的1个重要部分。你做最大的部分,但不是最小的部分。你敢于认为两位球员都会以更高的价值参加比赛。事实并非如此。对手将采用较低的值。因此,修改您确定的功能,以检查它是谁。如果是计算机,请采取与您一直相同的更高价值。但如果是对手,请按照下面这样的较低值:
if(value<best)
best = val;
这可以解决你的问题。