【发布时间】:2010-10-18 02:26:59
【问题描述】:
我已经浪费了一整天的时间来尝试使用 minimax 算法来制作无与伦比的 tictactoe AI。一路上我错过了一些东西(脑筋急转弯)。
我不是在这里寻找代码,只是更好地解释我哪里出错了。
这是我当前的代码(由于某种原因,minimax 方法总是返回 0):
from copy import deepcopy
class Square(object):
def __init__(self, player=None):
self.player = player
@property
def empty(self):
return self.player is None
class Board(object):
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 __init__(self, squares={}):
self.squares = squares
for i in range(9):
if self.squares.get(i) is None:
self.squares[i] = Square()
@property
def available_moves(self):
return [k for k, v in self.squares.iteritems() if v.empty]
@property
def complete(self):
for combo in self.winning_combos:
combo_available = True
for pos in combo:
if not pos in self.available_moves:
combo_available = False
if combo_available:
return self.winner is not None
return True
@property
def player_won(self):
return self.winner == 'X'
@property
def computer_won(self):
return self.winner == 'O'
@property
def tied(self):
return self.complete == True and self.winner is None
@property
def winner(self):
for player in ('X', 'O'):
positions = self.get_squares(player)
for combo in self.winning_combos:
win = True
for pos in combo:
if pos not in positions:
win = False
if win:
return player
return None
@property
def heuristic(self):
if self.player_won:
return -1
elif self.tied:
return 0
elif self.computer_won:
return 1
def get_squares(self, player):
return [k for k,v in self.squares.iteritems() if v.player == player]
def make_move(self, position, player):
self.squares[position] = Square(player)
def minimax(self, node, player):
if node.complete:
return node.heuristic
a = -1e10000
for move in node.available_moves:
child = deepcopy(node)
child.make_move(move, player)
a = max([a, -self.minimax(child, get_enemy(player))])
return a
def get_enemy(player):
if player == 'X':
return 'O'
return 'X'
【问题讨论】:
-
看看你的代码和你误入歧途的地方可能是值得的。
-
@Anthony Forloney - 查看我的编辑。
-
我发现这很容易用图表来想象,遗憾的是我没有给你,但会尝试用文字来描述。树的顶部是当前状态下棋盘的单个节点。这是游戏开始时的空白板。在下面的下一个级别是棋盘的副本,其中包含您本回合可以采取的所有可能动作(其中 9 个),然后在这 9 个中的每一个下方,每个动作都有 8 个新棋盘,然后您可以在对手的第一个动作之后采取转(所以你在深度 2 有 72 个板)。在底部,你有 9!板总数,每个板的值为 +1/-1/0。
-
@Conspicuous Compiler - 您能否将其放入答案并详细说明。这正是我正在寻找的。span>
-
...其中 +1 是您的对手获胜,-1 是您获胜,0 是猫。然后从每个叶子向上,在每个节点处,该值是所有子树的最大值。您继续直到到达根,然后选择具有最低值的子树之一。 (大部分时间可能会打成平手。)
标签: python minimax tic-tac-toe