2017-01-25 3 views
-2

Ich schreibe ein Schachspiel und versuche, jedem einzelnen Stück seine eigenen Eigenschaften und Methoden über Klassen zu geben. Ich habe eine String-Darstellung einer Tafel, die zu Beginn des Spiels auch String-Darstellungen jeder Schachfigur enthält. Ich möchte meine Pfanddarstellungen über eine Pfandklasse in Objekte verwandeln, bin mir aber nicht ganz sicher, wie das geht.Verwirrung über die Verwendung von Klassen

Zum Beispiel, wenn ich jeden weißen Bauer Zeichenfolge (bezeichnet mit „WP“) iterieren will, was macht die Zeile:

for i in range(0, 8): 
    my_board[i][1] = Pawn(i, i) 

tatsächlich tun? Erzeugt es an jeder dieser Positionen Klassenobjekte, die mir permanent den Zugriff auf die Listen über die von mir erstellten Methoden ermöglichen? Wenn ja, würden sie keine eindeutigen Variablennamen benötigen? Oder existiert das Objekt nur als Anfangspositionen, für die es erstellt wurde? Im Idealfall würde ich für jedes Element ein eindeutiges Objekt erstellen, aber ich bin mir nicht sicher, ob ich das richtig implementiert habe oder nicht.

Hier ist der Rest meines Code als Referenz.

class ChessBoard: 
    def __init__(self): 
     self.board = self.create_board 

    def create_board(self): 
     game_board = [] 
     letters = ["A", "B", "C", "D", "E", "F", "G", "H"] 
     for x in range(len(letters)): 
      game_board.append([]) 
      for y in range(1, 9): 
       game_board[x].append(str(letters[x])+str(y)) 

     return game_board 

class Pawn: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def passive_move(self): 
     my_board[self.x][self.y-1] = self 
     self.y -= 1 


def initialise_board(my_board): 
    pieces = ["C ", "Kn", "B ", "Q ", "K ", "B ", "Kn", "C "] 
    for x in range(len(pieces)): 
     my_board[x][0] = pieces[x] 
     my_board[x][7] = pieces[x] 
    for i in range(0, 8): 
     my_board[i][1] = "WP" 
     my_board[i][6] = "BP" 
    return my_board 


def str_represent_board(game_board): 
    board_letters = ["A", "B", "C", "D", "E", "F", "G", "H"] 
    print(3 * " ", end = " ") 
    for i in board_letters: 
     print((i) + 3 * (" "), end = " ") 
    print("\n" + 41 * "_") 
    c = 0 
    for y in range(1, 9): 
     print(y, end = " ") 
     print(1 * " ", end = " ") 
     for z in game_board: 
      print(z[c] + 2 * " ", end = " ") 

     c += 1 
     print(1 * ("\n")) 
    print(41 * "_") 


if __name__ == "__main__": 
    my_board = ChessBoard().create_board() 
    my_board = initialise_board(my_board) 
    str_represent_board(my_board) 
    for i in range(0, 8): 
     my_board[i][1] = Pawn(i, i) 
+0

Was lässt Sie denken 'my_board [row] [column]' _istn_ ein eindeutiger Variablenname? – TigerhawkT3

+0

Aber wenn ich meine passive_move-Methode aufrufen würde, würde das ursprüngliche my_board [row] [col] als Klassenobjekt bleiben oder wäre es die neue Position? – Perplexityy

+0

Diese Frage macht keinen Sinn. Ich vermute, du musst ein Tutorial finden und über Listen und Objekte nachlesen. – TigerhawkT3

Antwort

-1

Ihre Schleife erstellt eine Klasse Instanz für jedes Pfand Position. Jede Klasseninstanz ist unabhängig von den anderen. Es ist so, als würde ich sagen, dass ich für jeden Tag ein Shirt haben möchte. Sie sind identisch, aber sie sind separate Hemden, mit denen ich verschiedene Dinge machen werde. Sie benötigen keine eindeutigen Variablennamen, da sie basierend auf ihrer Position in der Liste unterschieden werden, aber wie Sie sie jetzt haben, hat sie Ihre Zeichenfolgenbezeichnung für diese Zelle überschrieben. Ein besserer Ansatz besteht darin, vielleicht eine nummerierte Liste von Pfandinstanzen zu erstellen, die eine Unterklasse von "Pieces" oder etwas ähnliches sind. Diese Pfandinstanzen haben Positionseigenschaften, die bei einer Bewegung aktualisiert werden können.

+0

'my_board' _is_ global, und diese Funktionen _können_ zugreifen und sogar mutieren. – TigerhawkT3

+0

Sie haben Recht. Tut mir leid, dass ich mir das nicht genau angesehen habe. Aber das vorherige steht noch. – Samwise

Verwandte Themen