关于使用类的困惑

时间:2017-01-25 03:23:39

标签: python class methods

我正在写一个国际象棋游戏,并试图通过课程为每个独特的作品提供自己的属性和方法。我有一个棋盘的字符串表示,它还包含游戏开始时每个棋子的字符串表示。我想通过Pawn类将我的pawn表示转换为对象,但不完全确定如何做到这一点。

例如,如果我想迭代每个白色典当字符串(用#34表示; 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)

1 个答案:

答案 0 :(得分:-1)

你的循环为每个pawn位置创建一个类实例。每个类实例独立于其他类实例。这有点像说我每天都想要一件衬衫。它们是相同的,但它们是单独的衬衫,我将做不同的事情。它们不需要唯一的变量名称,因为它们根据它们在列表中的位置而有所区别,但是现在它的方式,它覆盖了该单元格的字符串标签。更好的方法是创建一个编号的pawn实例列表,这些实例是" Pieces"的子类。或类似的东西。这些pawn实例具有可在移动时更新的位置属性。