我需要帮助从游戏奥赛罗的可能动作中制作树,稍后我将使用 MiniMax 算法。游戏在 Player vs AI 模式下进行,我在船上总是“1”,而 AI 在船上总是“2”。这就是我目前为 AI 获得最佳移动的功能的样子:
def findMoveForAI(board, player, depth, start):
best_score_for_move = -float('inf')
play_x = play_y = -1
moves = validMoves(board, player)
if not moves:
return (play_x , play_y)
for x, y in moves:
# this is where I would like to make tree
(temp, total_fillped) = PlayMove(copy.deepcopy(board), x, y, player)
move_eval = AlphaBeta(temp, player, depth, -999999999999, 999999999999, True, start)
if move_eval > best_score_for_move :
best_score_for_move = move_eval
play_x = x; play_y= y
return (play_x , play_y)
所以,我的想法是,在标记的地方,我在那一刻为 AI 的每一个可能的移动制作树,然后在上面做 MiniMax 并获得最好的移动。问题是,我不知道如何制作树。我有class TreeNode
,class Tree
但显然,我不知道如何使用它们。这就是这两个类的样子。
class TreeNode(object):
def __init__(self, data):
self.parent = None
self.children = []
self.data = data
def is_root(self):
return self.parent is None
def is_leaf(self):
return len(self.children) == 0
def add_child(self, x):
x.parent = self
self.children.append(x)
class Tree(object):
def __init__(self):
self.root = None
另外,如果需要,这就是我初始化板的方式。
board = [['.' for x in range(8)] for y in range(8)]
我真的很感激任何形式的帮助,因为我觉得应该用递归来完成,但这真的不是我最强的一面。
这是我尝试过的:
def makeTree(tree, board, player, depth):
if depth > 0:
new_player = change_player(player)
possible_moves = validMoves(board, new_player)
for x, y in possible_moves:
new_board = PlayMove(copy.deepcopy(board), x, y, new_player)[0]
child_tree = makeTree(tree, new_board, new_player, depth - 1)
tree.add_child(child_tree)
return tree
提前致谢。