From 9ae55f1244623bb4a6b456b2c334efbda391675b Mon Sep 17 00:00:00 2001 From: novikovsd Date: Mon, 25 May 2026 09:20:38 +0000 Subject: [PATCH] observer and command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit реализованы классы визуализации и пошагового решения --- novikovsd/maze.py | 98 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/novikovsd/maze.py b/novikovsd/maze.py index aba16e3..e14e424 100644 --- a/novikovsd/maze.py +++ b/novikovsd/maze.py @@ -234,11 +234,105 @@ class MazeSolver: return path, stats class Observer(ABC): + @abstractmethod + def update(self, event: str, data: Any): + pass class ConsoleView(Observer): + def __init__(self): + self.player_pos = None + self.path = [] + + def update(self, event: str, data: Any): + if event == "maze_loaded": + self.maze = data["maze"] + self.render() + elif event == "player_moved": + self.player_pos = data["player_cell"] + self.render() + elif event == "path_found": + self.path = data["path"] + self.render() + elif event == "solved": + self.path = data["path"] + self.render() + + def render(self, maze: Maze = None, player_cell: Cell = None, path: List[Cell] = None): + if maze: + self.maze = maze + if player_cell: + self.player_pos = player_cell + if path is not None: + self.path = path + + if not hasattr(self, 'maze'): + print("Нет лабиринта для отображения") + return + + for y in range(self.maze.height): + row = "" + for x in range(self.maze.width): + cell = self.maze.get_cell(x, y) + if cell is None: + row += " " + continue + if self.player_pos and cell == self.player_pos: + row += "P" + elif cell == self.maze.start: + row += "S" + elif cell == self.maze.exit: + row += "E" + elif self.path and cell in self.path: + row += "." + elif cell.is_wall: + row += "#" + else: + row += " " + print(row) + print() class MoveCommand(ABC): - + @abstractmethod + def execute(self): + pass + @abstractmethod + def undo(self): + pass + class Player: + def __init__(self, start_cell: Cell): + self.current_cell = start_cell -class MoveCommandImpl(MoveCommand): \ No newline at end of file + def move_to(self, cell: Cell): + self.current_cell = cell + +class MoveCommandImpl(MoveCommand): + def __init__(self, player: Player, direction: str, maze: Maze): + self.player = player + self.direction = direction + self.maze = maze + self.previous_cell = player.current_cell + + def execute(self): + dx, dy = 0, 0 + if self.direction == 'w': + dy = -1 + elif self.direction == 's': + dy = 1 + elif self.direction == 'a': + dx = -1 + elif self.direction == 'd': + dx = 1 + else: + return False + + 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): + self.player.move_to(self.previous_cell) \ No newline at end of file