from abc import ABC, abstractmethod


class Player:
    def __init__(self, start_cell):
        self.current_cell = start_cell


class Command(ABC):
    @abstractmethod
    def execute(self) -> bool:
        """Выполняет действие. Возвращает True, если ход успешен."""
        pass

    @abstractmethod
    def undo(self) -> None:
        """Откатывает действие назад."""
        pass


class MoveCommand(Command):
    def __init__(self, player: Player, maze, dx: int, dy: int):
        self.player = player
        self.maze = maze
        self.dx = dx
        self.dy = dy
        self.previous_cell = None

    def execute(self) -> bool:
        new_x = self.player.current_cell.x + self.dx
        new_y = self.player.current_cell.y + self.dy

        next_cell = self.maze.getCell(new_x, new_y)

        if next_cell and next_cell.isPassable():
            self.previous_cell = self.player.current_cell
            self.player.current_cell = next_cell
            return True

        print("Ошибка: Там стена или край лабиринта!")
        return False

    def undo(self) -> None:
        if self.previous_cell:
            self.player.current_cell = self.previous_cell
