from abc import ABC, abstractmethod class Command(ABC): #Выполняет команду @abstractmethod def execute(self): pass #Отменяет команду @abstractmethod def undo(self): pass class MoveCommand(Command): def __init__(self, player, direction, maze, notifier=None): self.player = player self.direction = direction # (dx, dy) self.maze = maze self.notifier = notifier self.previous_cell = player.current_cell #Перемещает игрока в указанном направлении def execute(self): dx, dy = self.direction new_x = self.player.current_cell.x + dx new_y = self.player.current_cell.y + dy new_cell = self.maze.get_cell(new_x, new_y) # Проверяем, можно ли пройти if new_cell and new_cell.is_passable(): self.player.move_to(new_cell) return True return False #возвращает на предыдущую клетку def undo(self): if self.previous_cell: self.player.move_to(self.previous_cell) return True return False class Player: #Игрок в лабиринте def __init__(self, start_cell): self.current_cell = start_cell self.start_cell = start_cell #Перемещает игрока на новую клетку def move_to(self, cell): self.current_cell = cell #Сбрасывает игрока на стартовую позицию def reset(self): self.current_cell = self.start_cell