【发布时间】:2012-09-24 13:46:07
【问题描述】:
嗨!我正在制作一个国际象棋引擎,但 make/unmake 方法有一些问题。
我有一个 Piece 类来保存棋子的类型(棋子、皇后等)和位置,还有一个 Move 类来保存目标方格、移动的棋子和捕获的棋子。
问题是,当我调用 makeMove 方法时,它会将棋子的位置更改为 Piece 对象内的目标正方形。但是现在,我不能用 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 !?
【问题讨论】:
-
你应该保留一个移动列表。这样,您只需将最后一步从堆栈中弹出,然后执行相反的操作,您就可以了。您可能需要一个
reverseMove方法和一个uncapturePiece方法。 -
@FredLarson:很好的链接。我以前不知道这一点。
-
如果您保留所有移动的列表,您还可以从列表中删除最后一个移动,然后将移动应用到起始位置的棋盘。这可以避免需要任何单独的撤消逻辑。