2012-08-08 2 views
1

안녕하세요! 체스 엔진을 만들었고 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 !? 
+5

이동 목록을 보관해야합니다. 그런 식으로 마지막 스택을 스택에서 튕겨 내고 그 반대 방향으로 플레이하면 황금이됩니다. 아마도'reverseMove' 메쏘드와'uncapturePiece' 메쏘드가 필요할 것입니다. –

+3

[Memento Pattern] (http://en.wikipedia.org/wiki/Memento_pattern)에서 확인하십시오. –

+0

@FredLarson : 좋은 링크. 나는 이전에 이것을 인식하지 못했습니다. –

답변

2

, 여기 당신이 수행 할 수 있습니다 무엇의 예를 구현 한 것입니다 :

:

class Move(object): 
    def __init__(self, from_coords, to_coords, capture=None): 
     self.from = from_coords 
     self.to = to_coords 
     self.capture = capture 

당신은 Board 객체는 다음과 같은 방법을 구현하는 것이있어

class Board(object): 
    ... 
    def make_move(self, from_coords, to_coords): 
     #move logic here 
     return Move(from_coords, to_coords, capturedPiece) 

    def undo_move(self, move_object): 
     self.make_move(move_object.to_coords, move_object.from_coords) 
     self.uncapture(move_object.capture, move_object.to_coords) 

분명히 위의 코드는 단지 개념적입니다. 실제 구현은 나머지 코드가 어떻게 구성되어 있는지에 달려 있습니다.

참고 : 속성 액세스가 명시적이고 따라하기 쉽기 때문에 Move 개체에 클래스를 사용했습니다. 실제로이 기본 객체는 단순히 (from, to, capturedpiece) 형식의 튜플 일 수 있습니다.

관련 문제