2017-01-25 52 views
-2

我正在写一个国际象棋游戏,并试图通过类给每个独特的作品提供自己的属性和方法。我有一个棋盘的字符串表示形式,其中还包含游戏开始时每个棋子的字符串表示形式。我想通过Pawn类将我的棋子表示变成对象,但不完全知道如何做到这一点。关于使用类的困惑

例如,如果我想遍历每个白色棋子字符串(由“WP”表示),这是什么行:

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

实际上呢?它是否在这些位置的每一个位置都创建类对象,这使我可以永久访问通过我创建的方法在列表中移动它们?如果是这样,他们不需要唯一的变量名吗?或者,对象是否只存在于创建它的初始位置?理想情况下,我会为每个项目创建一个独特的对象,但我不确定我是否正确实施了该项目。

下面是我的代码的其余部分供参考。

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

是什么让你觉得'my_board [row] [column]'_isn't_一个唯一的变量名? – TigerhawkT3

+0

但是,如果我要调用我的passive_move方法,原来的my_board [row] [col]是作为类对象保留还是作为新的位置? – Perplexityy

+0

这个问题没有意义。我怀疑你需要找到一个教程,并阅读清单和对象。 – TigerhawkT3

回答

-1

你的循环会为每个棋子位置类实例。每个类实例都是独立的。这有点像说我每天都需要一件衬衫。他们是相同的,但他们是独立的衬衫,我会做不同的事情。它们不需要唯一的变量名称,因为它们根据它们在列表中的位置进行区分,但是现在它的方式是它为该单元格重写了字符串标签。一个更好的方法是创建一个典型的Pawn实例列表,它是“Pieces”或类似的子类。这些典当实例具有可以在移动时更新的位置属性。

+0

'my_board' _is_ global,并且这些函数可以访问并甚至改变它。 – TigerhawkT3

+0

你是对的。对不起,我没有仔细看。然而,以前依然如此。 – Samwise