2016-06-15 27 views
0

Ich konnte keinen Pythonbaum finden, den ich verwenden könnte, um eine Baumstruktur für Schachöffnungen zu schaffen, also versuchte ich, mein eigenes zu schreiben. Um tiefer in den Baum vorzudringen, versuche ich einen Substamm zurückzugeben, wenn ich eine neue Position hinzufüge, aber es scheint, dass alle Positionen zur Wurzel hinzugefügt werden, und mir wird kein Verweis auf die Subroot gegeben, wie ich es erwarte, obwohl ich hat überprüft und root hat auch viele Enkelkinder.Nicht erwünschter Wert für Pythonbaum

import chess.pgn 

class Node(object): 
    children = [] 
    score = None 
    def __init__(self, fen): 
     self.fen = fen 
    def add(self, fen): 
     for c in self.children: 
      if c.fen == (fen): 
       print("working") 
       return c 
     self.children.append(Node(fen)) 
     return self.children[-1] 

root = Node('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1') 
def createTree(fileName): 
    pgn = open(fileName) 
    game = chess.pgn.read_game(pgn) 
    while(game):  
     next_move = game.variations[0] 
     fen = next_move.board().fen() 
     global root 
     currentRoot = root.add(fen) 

     while(not next_move.is_end() and next_move.board().fullmove_number <= 5): 
      next_move = next_move.variations[0] 
      fen = next_move.board().fen() 
      currentRoot = currentRoot.add(fen) 
      print(currentRoot.children) 
     game = chess.pgn.read_game(pgn) 

file = r"C:\all.pgn" 
createTree(file) 
for n in root.children: 
    print(n.fen) 
+0

Bitte geben Sie einen Download-Link zu der von Ihnen verwendeten 'chess.pgn'-Bibliothek an. –

+0

https://pypi.python.org/pypi/python-chess – Josh

Antwort

0

Ihr Code schlägt fehl, weil Sie class variables.

Grundsätzlich missbraucht haben, wenn Sie children außerhalb jeder Funktion erklären es an der Klasse-Ebene scoped ist, und alle Node Objekte die gleiche Liste teilen. Sie möchten es innerhalb __init__ als self.children so definieren, dass es auf Instanzebene beschränkt ist.

class Node: 
    def __init__(self, fen): 
     self.fen = fen 
     self.score = None 
     self.children = [] 
    ... 
+0

Das macht Sinn. Hoffe es behebt es! – Josh

+0

@Josh Denken Sie daran, wenn der Code für Sie arbeitete, wählen Sie bitte als akzeptierte Antwort. Vielen Dank! –

+0

Es hat es behoben. Und ich war in der Lage, einige rekursive Methoden zu machen, um es auch zu durchlaufen – Josh