在棋盘对象中使用深度复制来验证使用 python 的国际象棋游戏实现中的合法动作时出错

问题描述 投票:0回答:1

我一直在研究我的国际象棋游戏项目,并解决实现检查和将死逻辑的挑战。尽管阻碍了攻击国王的棋子的路径,但当棋子继续移动时,出现了一个问题。

我意识到没有内置机制来验证移动的合法性,因此我决定将其作为单独的方法添加到 Piece 类中。该方法内部的逻辑是创建存储在单独变量中的板的副本,确保它与原始板具有不同的引用。操纵这个新的参考,然后我检查棋盘在移动后是否处于检查状态。如果是,则该移动被视为非法,因此该方法返回 false,否则返回 true。 我决定使用复制模块中的深度复制功能,但是运行程序后,此错误显示:

TypeError: cannot pickle 'pygame.surface.Surface' object

这是该方法的实际代码块:

    def is_legal_move(self,x,y,board):
        row,col = self.get_new_coordinates(x,y)
        #Almacenar tablero en una nueva variable para luego hacer los calculos de validación del movimiento
        board_copy = copy.deepcopy(board)
        board_copy.generate_moves()
        #Se iguala la pieza actual en el tablero a una nueva referencia
        piece_sample = board_copy.virtual_board[self.get_row()][self.get_column()]
        king = board_copy.get_king()
        enemy_pieces = board_copy.get_pieces()
        new_destination = (row,col)

        #Mover pieza de forma virtual
        board_copy.update_board_status(self.get_row(),self.get_column(),row,col,piece_sample)

        is_in_check = board_copy.is_in_check(king,enemy_pieces)

        if not board.checked_status:
            if is_in_check and (new_destination in self.moves):
                return False
            elif new_destination in self.moves:
               return True
            
        return False

virtual_board 是 Board 类的一个属性。这是一个矩阵,我可以在其中可视化和操作棋盘的计算机表示,因此在那里完成的更改可以用 pygame 直观地表示出来

python pygame chess
1个回答
0
投票

“deepcopy”函数使用 pickling 来创建对象的深层副本。如果该对象无法被腌制,则会引发类型错误。 (这就是这里发生的事情) https://docs.python.org/3/library/copy.html

更好的方法是创建自定义复制功能

def customCopyBoard(self, board):
   #Assuming you have a constructor for your Board class
   newBoard = Board()
   for row in range(len(board.virtual_board)):
      for col in range(len(board.virtual_board[row])):
         p = board.virtual_board[row][col]
         if p is not None:
            newBoard.virtual_board[row][col] = p.copy()
   return newBoard
© www.soinside.com 2019 - 2024. All rights reserved.