#!/usr/bin/env python # coding: utf-8 # In[ ]: import os from typing import List, Optional, Set from modelsMaze import Maze from modelsCell import Cell from visualizationObserver import Observer class ConsoleView(Observer): """Консольная визуализация лабиринта.""" # Символы для отображения SYMBOLS = { 'wall': '█', 'path': '·', 'start': 'S', 'exit': 'E', 'player': 'P', 'solution': '★' } def __init__(self, maze: Maze): self.maze = maze self.player_pos: Optional[Cell] = None self.solution_path: Set[Cell] = set() self.messages: List[str] = [] def update(self, event: str) -> None: """Обработка событий от MazeSolver.""" self.messages.append(f"[СОБЫТИЕ] {event}") self.render() def set_solution_path(self, path: List[Cell]) -> None: """Установить найденный путь для отображения.""" self.solution_path = set(path) def set_player_position(self, cell: Cell) -> None: """Установить позицию игрока.""" self.player_pos = cell def render(self) -> None: """Отрисовать лабиринт в консоли.""" # Очистка консоли (опционально) # os.system('cls' if os.name == 'nt' else 'clear') print("\n" + "=" * (self.maze.width * 2 + 4)) print(f"Лабиринт {self.maze.width}×{self.maze.height}") print("=" * (self.maze.width * 2 + 4)) for y in range(self.maze.height): row = "" for x in range(self.maze.width): cell = self.maze.get_cell(x, y) if not cell: row += " " continue if self.player_pos and cell == self.player_pos: row += self.SYMBOLS['player'] + " " elif cell.is_start: row += self.SYMBOLS['start'] + " " elif cell.is_exit: row += self.SYMBOLS['exit'] + " " elif cell in self.solution_path: row += self.SYMBOLS['solution'] + " " elif cell.is_wall: row += self.SYMBOLS['wall'] * 2 else: row += self.SYMBOLS['path'] * 2 print(row) print("-" * (self.maze.width * 2 + 4)) # Показать последние сообщения if self.messages: print("Последние события:") for msg in self.messages[-3:]: print(f" {msg}") print() def clear_messages(self) -> None: """Очистить сообщения.""" self.messages.clear()