2017-01-16 191 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()