嗨!我正在做一个象棋引擎,我在make/unmake方法上有一些问题。在
我有一个棋子类,它保存棋子的类型(棋子、皇后等)和位置,还有一个移动类保存目标方块、移动棋子和俘获的棋子。在
问题是,当我调用makeMove方法时,它将工件的位置更改为工件对象内部的目标正方形。但是现在,我不能用Move对象来调用unmakeMove,因为现在我没有关于移动的来源的信息,因为我刚刚改变了片段的位置。你将如何解决这个问题?在
非常感谢!在
class Board:
# Previous methods omitted.
def makeMove(self, move, player):
""" Makes a move on the board and changes Piece object. Returns None. """
self.moved_piece = move.getPiece()
self.captured_piece = move.getCapturedPiece(self)
if self.captured_piece: # Remove captured piece from player's piece dict.
player.removePiece(self.captured_piece)
self.setPiece(move.getTargetSquare(), self.moved_piece) # Set moved piece on target square.
self.setPiece(self.moved_piece.getPosition(), EMPTY) # Make the origin square empty.
self.moved_piece.changePosition(move.getTargetSquare()) # Change piece object's position.
def unmakeMove(self, move, player):
""" Unmakes a move. Returns None. """
self.moved_piece = move.getPiece()
self.captured_piece = move.getCapturedPiece(self)
self.setPiece(self.moved_piece.getPosition(), captured_piece) # Set captured piece or empty square to target square.
# Set piece to original square. HOW !?
根据我的评论和Fred Larson发布的link on the Memento pattern,下面是一个您可能想做的事情的示例实现:
假设你有一个移动对象,这个结构:
^{pr2}$您的
Board
对象将实现以下方法:显然,上面的代码只是概念性的。实际实现将取决于其余代码的结构。在
注意:我为
Move
对象使用了一个类,因为属性访问是显式的,而且很容易理解。实际上,像这样基本的对象可以是(from, to, capturedpiece)
形式的元组。在相关问题 更多 >
编程相关推荐