from abc import ABC, abstractmethod from maze_model import Maze, Cell class Observer(ABC): @abstractmethod def update(self, event: dict) -> None: ... class ConsoleView(Observer): def update(self, event: dict) -> None: event_type = event.get("type") if event_type == "maze_loaded": print("\n[ConsoleView] Лабиринт загружен:") self.render(event["maze"]) elif event_type == "path_found": print("\n[ConsoleView] Путь найден!") self.render(event["maze"], path=event.get("path"), player=event.get("player")) elif event_type == "no_path": print("\n[ConsoleView] Путь не найден.") elif event_type == "move": print(f"\n[ConsoleView] Игрок переместился в ({event['x']}, {event['y']})") self.render(event["maze"], path=event.get("path"), player=event.get("player")) def render(self, maze: Maze, path: list[Cell] | None = None, player: Cell | None = None) -> None: path_set = set(path) if path else set() for y in range(maze.height): row_str = "" for x in range(maze.width): cell = maze.get_cell(x, y) if player and cell == player: row_str += "@" elif cell.is_start: row_str += "S" elif cell.is_exit: row_str += "E" elif cell in path_set: row_str += "*" elif cell.is_wall: row_str += "#" else: row_str += "." print(row_str)