54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
|
|
from abc import ABC, abstractmethod
|
|||
|
|
from typing import List, Optional
|
|||
|
|
|
|||
|
|
from maze import Maze, Cell
|
|||
|
|
|
|||
|
|
|
|||
|
|
class Observer(ABC):
|
|||
|
|
"""Интерфейс наблюдателя (Observer pattern)."""
|
|||
|
|
|
|||
|
|
@abstractmethod
|
|||
|
|
def update(self, event: str):
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ConsoleView(Observer):
|
|||
|
|
"""
|
|||
|
|
Консольное представление лабиринта.
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
def __init__(self):
|
|||
|
|
self.events: List[str] = []
|
|||
|
|
|
|||
|
|
def update(self, event: str):
|
|||
|
|
"""Получаем уведомление о событии."""
|
|||
|
|
self.events.append(event)
|
|||
|
|
print(f"[Observer] Событие: {event}")
|
|||
|
|
|
|||
|
|
def render(self, maze: Maze, player_position: Cell = None, path: List[Cell] = None):
|
|||
|
|
"""
|
|||
|
|
Отрисовка лабиринта в консоли.
|
|||
|
|
"""
|
|||
|
|
path_set = set(path) if path else set()
|
|||
|
|
|
|||
|
|
for y in range(maze.height):
|
|||
|
|
row = []
|
|||
|
|
for x in range(maze.width):
|
|||
|
|
cell = maze.get_cell(x, y)
|
|||
|
|
|
|||
|
|
if player_position and cell == player_position:
|
|||
|
|
row.append('P')
|
|||
|
|
elif cell in path_set:
|
|||
|
|
row.append('*')
|
|||
|
|
else:
|
|||
|
|
row.append(str(cell))
|
|||
|
|
|
|||
|
|
print(''.join(row))
|
|||
|
|
print()
|
|||
|
|
|
|||
|
|
def render_stats(self, stats):
|
|||
|
|
"""Отрисовка статистики поиска."""
|
|||
|
|
print(f"Алгоритм: {stats.algorithm_name}")
|
|||
|
|
print(f"Время: {stats.time_ms:.4f} мс")
|
|||
|
|
print(f"Посещено клеток: {stats.visited_cells}")
|
|||
|
|
print(f"Длина пути: {stats.path_length}")
|