2026-rff_mp/smirnovad/lab2/docs/data/observer.py
2026-05-17 16:50:47 +03:00

55 lines
1.7 KiB
Python

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)