안녕하세요! 체스 엔진을 만들었고 make/unmake 메소드에 몇 가지 문제가 있습니다.체스 프로그래밍 제작 및 이동 취소
저는 조각 (전당포, 여왕 등)의 유형과 위치를 보유하고있는 Piece 클래스와 대상 사각형, 이동 된 조각 및 캡처 한 조각을 보유하는 Move 클래스가 있습니다.
문제는 makeMove 메서드를 호출 할 때 조각의 위치가 Piece 개체의 정사각형에 맞게 변경된다는 것입니다. 그러나 이제 Move 객체를 사용하여 unmakeMove를 호출 할 수 없습니다. 이동 지점의 위치가 변경되었으므로 이제 이동에 대한 정보가 없기 때문입니다. 어떻게이 문제를 해결하겠습니까?
대단히 감사합니다!
class Engine(object):
def __init__(self):
self.board = Board()
self.move_list = []
def make_move(self, from, to):
#board.makeMove returns a "memento object".
self.move_list.append(board.makeMove(from, to))
...
def undo_move(self):
board.undo(self.move_list.pop())
...
...
을 그리고의는이 구조의 이동 객체가 있다고 가정 해 봅시다 :
내 댓글 프레드 라슨이 게시 link on the Memento pattern을 바탕으로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' 메쏘드가 필요할 것입니다. –
[Memento Pattern] (http://en.wikipedia.org/wiki/Memento_pattern)에서 확인하십시오. –
@FredLarson : 좋은 링크. 나는 이전에 이것을 인식하지 못했습니다. –