簡體   English   中英

類內遞歸,Python

[英]Recursion within Class, Python

我正在嘗試創建一個類,該類可以從游戲井字游戲中為棋盤生成決策樹。 我正在使用Tic-Tac-Toe帖子中來自用戶“ ssoler”的評論:如何填充決策樹? 作為課程的基礎,但我認為該課程沒有用。 對於一個我無法看到所有輸出,因為空閑使用“ ...”將其縮寫。 同樣,我過去對類和遞歸的使用也很差。 我的目標是將Minimax算法和alpha-beta修剪應用於該類輸出的樹。

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顛倒了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM