2026-rff_mp/shahovaa/zadanie 2/maze_solver/observers.py
2026-05-19 22:39:51 +03:00

41 lines
1.1 KiB
Python

from __future__ import annotations
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import Any
from .models import Cell, Maze
@dataclass(frozen=True)
class Event:
event_type: str
payload: dict[str, Any] = field(default_factory=dict)
class Observer(ABC):
@abstractmethod
def update(self, event: Event) -> None:
raise NotImplementedError
class ConsoleView(Observer):
def update(self, event: Event) -> None:
if event.event_type == "search_started":
print(f"Search started: {event.payload['strategy']}")
elif event.event_type in {"path_found", "path_not_found"}:
stats = event.payload["stats"]
print(
f"{event.event_type}: strategy={stats.strategy_name}, "
f"time={stats.time_ms:.3f} ms, visited={stats.visited_cells}, "
f"path_length={stats.path_length}"
)
def render(
self,
maze: Maze,
player_position: Cell | None = None,
path: list[Cell] | None = None,
) -> str:
return maze.to_text(path=path, player=player_position)