我一直在研究我的国际象棋游戏项目,并解决实现检查和将死逻辑的挑战。尽管阻碍了攻击国王的棋子的路径,但当棋子继续移动时,出现了一个问题。
我意识到没有内置机制来验证移动的合法性,因此我决定将其作为单独的方法添加到 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 直观地表示出来
“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