1

やあ!チェスエンジンを作っていますが、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 !?
4

1 に答える 1

2

私のコメントとFredLarsonが投稿したMementoパターンへのリンクに基づいて、次の実装例を示します。

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())
    ...
    ...

そして、この構造の移動オブジェクトがあるとしましょう。

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)

于 2012-08-08T21:25:19.693 に答える