2017-01-16 6 views
0

Ich versuche ein Schachspiel zu schreiben, und bekomme den obigen Fehler, wenn ich versuche, meinen Bauern zu bewegen. Mein erster Anruf von my_board[0][0].passive_move() funktioniert einwandfrei und verschiebt das Objekt korrekt in die zweite Liste. Aber wenn ich es sofort wieder anrufe, bekomme ich den Fehler im Titel, anstatt das Objekt in die dritte Liste zu verschieben.AttributeError: 'str' Objekt hat kein Attribut (Methode)

__author__ = 'admin' 

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

    def __str__(self): 
     return "Pawn" 

    def passive_move(self): 
     self.board[self.y+1][self.x] = self 
     self.board[self.y][self.x] = chr(self.y+65)+str(self.x+1) 
     self.y += 1 

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 

if __name__ == "__main__": 
    my_board = ChessBoard().create_board() 

    for x in range(len(my_board)): 
     my_board[0][x] = Pawn(0, x) 


    my_board[0][0].passive_move() 
    my_board[0][0].passive_move() 


    print(my_board) 
+1

Sie verstehen, was die zweite Zeile in 'Pawn.passive_move()' tut, richtig? –

+0

Ersetzt es nicht die vorherige Position des Objekts mit der ursprünglichen Koordinate? Zumindest war das meine Absicht. – Perplexityy

+1

... Nein, es injiziert eine Zeichenfolge in die Liste. –

Antwort

0

Das Problem ist, dass Sie passive_move zweimal auf der gleichen Platine sind Aufruf Koordinaten:

my_board[0][0].passive_move() 
my_board[0][0].passive_move() 

Nach dem ersten Aufruf, den Bauern, die ursprünglich an diesem Platz war, wird man bewegt haben auf und also wird das Quadrat eine Zeichenfolge anstelle einer Pawn Instanz enthalten. Da Strings keine Methode passive_move haben, erhalten Sie einen Fehler vom zweiten Aufruf.

Beachten Sie, dass wenn Sie nur einmal board indizierten und eine Referenz auf die Pawn Instanz speichern, die Sie erhalten, könnten Sie sagen, dass es sich zweimal bewegen soll. Versuchen Sie etwas wie folgt:

pawn = my_board[0][0] 
pawn.passive_move() 
pawn.passive_move() 
Verwandte Themen