forked from UNN/2026-rff_mp
90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
|
|
#!/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()
|
|||
|
|
|