2017-01-16 3 views
0

Я пытаюсь написать шахматную игру и получить вышеуказанную ошибку при попытке переместить мою Пешку. Мой первый звонок my_board[0][0].passive_move() отлично работает и правильно перемещает объект во второй список. Но если я снова его вызову, я получу ошибку в заголовке, вместо того, чтобы переместить объект в третий список.AttributeError: объект 'str' не имеет атрибута (метода)

__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

Вы понимаете, что делает вторая строка в 'Pawn.passive_move()', правильно? –

+0

Не заменяет ли предыдущую позицию объекта исходной координатой? По крайней мере, это было моим намерением. – Perplexityy

+1

... Нет, он вводит строку в список. –

ответ

0

Вопрос заключается в том, что вы звоните passive_move дважды на одной плате координаты:

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

После первого звонка, пешки, который был первоначально на этой площади будет перемещен вверх один, и поэтому квадрат будет содержать строку, а не экземпляр Pawn. Поскольку строки не имеют метода passive_move, вы получаете сообщение об ошибке со второго вызова. Обратите внимание, что если вы только проиндексировали board один раз и сохранили ссылку на экземпляр Pawn, который вы получите, вы можете сказать, что он перемещается дважды. Попробуйте что-то вроде этого:

pawn = my_board[0][0] 
pawn.passive_move() 
pawn.passive_move() 
Смежные вопросы