Class、Python 内的递归
Recursion within Class, Python
我正在尝试创建一个 class 来为 Tic-Tac-Toe 游戏中的棋盘生成决策树。我正在使用用户 "ssoler" 对 post Tic-Tac-Toe: How to populate decision tree? 的评论作为 class 的基础,但我认为 class 不起作用。一方面,我看不到所有输出,因为空闲时使用“...”缩写了它们。我过去对 classes 和递归的使用也很差。我的目标是将 Minimax 算法和 alpha-beta 修剪应用于 class.
输出的树
win_comb=((0,1,2),(3,4,5),(6,7,8),(6,3,0),(7,4,1),(8,5,2),(6,4,2),(8,4,0))
Board = [1, 2, 3, 4, 5, 6, 7, 8, 9]
whose_move = 1
child_nodes = []
class Node():
def __init__(self,Board,win_comb,whose_move, child_nodes):
self.c_g_s = Board
self.node = None
self.new_node = None
self.child_nodes = child_nodes
self.win_comb = win_comb
self.w_m = whose_move
def create_tree(self):
for index,each in enumerate(self.c_g_s):
if each == index + 1:
self.new_node = self.c_g_s
if self.w_m == 1:
self.new_node[index] = "X"
self.w_m = 0
else:
self.new_node[index] = "O"
self.w_m = 1
self.new_node = tuple(self.new_node)
if self.available_moves():
self.new_node = self.c_g_s
self.child_nodes.append(self.create_tree())
else:
child_nodes.append(self.new_node)
if self.child_nodes:
return [self.node,self.child_nodes]
return
def available_moves(self):
for index, each in enumerate(self.c_g_s):
if index + 1 == each:
return False
return True
n = Node(Board,win_comb,whose_move,child_nodes)
print(n.create_tree())
我猜你的程序的这种简化会产生你想要的东西,所有可能的板作为一棵树。现在,您可以使用获胜组合列表来显着修剪生成的分支:
winning_combinations = ((0,1,2), (3,4,5), (6,7,8), (6,3,0), (7,4,1), (8,5,2), (6,4,2), (8,4,0))
board = [1, 2, 3, 4, 5, 6, 7, 8, 9]
whose_move = 1
class Node():
def __init__(self, board, whose_move):
self.board = board
self.whose_move = whose_move
def create_tree(self, board=None, whose_move=None):
if board is None:
board = self.board
if whose_move is None:
whose_move = self.whose_move
child_nodes = []
for index, square in enumerate(board):
if square == index + 1: # if square not taken
new_board = list(board) # make a shallow copy
if whose_move == 1:
new_board[index] = "X"
whose_move = 0
else:
new_board[index] = "O"
whose_move = 1
if self.available_moves(new_board):
child_nodes.append(self.create_tree(new_board, whose_move))
else:
child_nodes.append(new_board)
return child_nodes
def available_moves(self, board):
for index, square in enumerate(board):
if square == index + 1: # if square not taken
return True
return False
node = Node(board, whose_move)
print(node.create_tree())
关键是不要在你的对象中存储你想要临时改变以查看可能发生什么的东西(例如,董事会和轮到谁了) - 创建这些局部变量。此外,您的 available_moves() 方法颠倒了 True 和 False。
我正在尝试创建一个 class 来为 Tic-Tac-Toe 游戏中的棋盘生成决策树。我正在使用用户 "ssoler" 对 post Tic-Tac-Toe: How to populate decision tree? 的评论作为 class 的基础,但我认为 class 不起作用。一方面,我看不到所有输出,因为空闲时使用“...”缩写了它们。我过去对 classes 和递归的使用也很差。我的目标是将 Minimax 算法和 alpha-beta 修剪应用于 class.
输出的树win_comb=((0,1,2),(3,4,5),(6,7,8),(6,3,0),(7,4,1),(8,5,2),(6,4,2),(8,4,0))
Board = [1, 2, 3, 4, 5, 6, 7, 8, 9]
whose_move = 1
child_nodes = []
class Node():
def __init__(self,Board,win_comb,whose_move, child_nodes):
self.c_g_s = Board
self.node = None
self.new_node = None
self.child_nodes = child_nodes
self.win_comb = win_comb
self.w_m = whose_move
def create_tree(self):
for index,each in enumerate(self.c_g_s):
if each == index + 1:
self.new_node = self.c_g_s
if self.w_m == 1:
self.new_node[index] = "X"
self.w_m = 0
else:
self.new_node[index] = "O"
self.w_m = 1
self.new_node = tuple(self.new_node)
if self.available_moves():
self.new_node = self.c_g_s
self.child_nodes.append(self.create_tree())
else:
child_nodes.append(self.new_node)
if self.child_nodes:
return [self.node,self.child_nodes]
return
def available_moves(self):
for index, each in enumerate(self.c_g_s):
if index + 1 == each:
return False
return True
n = Node(Board,win_comb,whose_move,child_nodes)
print(n.create_tree())
我猜你的程序的这种简化会产生你想要的东西,所有可能的板作为一棵树。现在,您可以使用获胜组合列表来显着修剪生成的分支:
winning_combinations = ((0,1,2), (3,4,5), (6,7,8), (6,3,0), (7,4,1), (8,5,2), (6,4,2), (8,4,0))
board = [1, 2, 3, 4, 5, 6, 7, 8, 9]
whose_move = 1
class Node():
def __init__(self, board, whose_move):
self.board = board
self.whose_move = whose_move
def create_tree(self, board=None, whose_move=None):
if board is None:
board = self.board
if whose_move is None:
whose_move = self.whose_move
child_nodes = []
for index, square in enumerate(board):
if square == index + 1: # if square not taken
new_board = list(board) # make a shallow copy
if whose_move == 1:
new_board[index] = "X"
whose_move = 0
else:
new_board[index] = "O"
whose_move = 1
if self.available_moves(new_board):
child_nodes.append(self.create_tree(new_board, whose_move))
else:
child_nodes.append(new_board)
return child_nodes
def available_moves(self, board):
for index, square in enumerate(board):
if square == index + 1: # if square not taken
return True
return False
node = Node(board, whose_move)
print(node.create_tree())
关键是不要在你的对象中存储你想要临时改变以查看可能发生什么的东西(例如,董事会和轮到谁了) - 创建这些局部变量。此外,您的 available_moves() 方法颠倒了 True 和 False。