{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "9d15670f-4ae1-48f5-801c-7a1a84cafba3", "metadata": {}, "outputs": [], "source": [ "import os\n", "from typing import List, Optional, Set\n", "from modelsMaze import Maze\n", "from modelsCell import Cell\n", "from visualizationObserver import Observer\n", "\n", "class ConsoleView(Observer):\n", " \"\"\"Консольная визуализация лабиринта.\"\"\"\n", " \n", " # Символы для отображения\n", " SYMBOLS = {\n", " 'wall': '█',\n", " 'path': '·',\n", " 'start': 'S',\n", " 'exit': 'E',\n", " 'player': 'P',\n", " 'solution': '★'\n", " }\n", " \n", " def __init__(self, maze: Maze):\n", " self.maze = maze\n", " self.player_pos: Optional[Cell] = None\n", " self.solution_path: Set[Cell] = set()\n", " self.messages: List[str] = []\n", " \n", " def update(self, event: str) -> None:\n", " \"\"\"Обработка событий от MazeSolver.\"\"\"\n", " self.messages.append(f\"[СОБЫТИЕ] {event}\")\n", " self.render()\n", " \n", " def set_solution_path(self, path: List[Cell]) -> None:\n", " \"\"\"Установить найденный путь для отображения.\"\"\"\n", " self.solution_path = set(path)\n", " \n", " def set_player_position(self, cell: Cell) -> None:\n", " \"\"\"Установить позицию игрока.\"\"\"\n", " self.player_pos = cell\n", " \n", " def render(self) -> None:\n", " \"\"\"Отрисовать лабиринт в консоли.\"\"\"\n", " # Очистка консоли (опционально)\n", " # os.system('cls' if os.name == 'nt' else 'clear')\n", " \n", " print(\"\\n\" + \"=\" * (self.maze.width * 2 + 4))\n", " print(f\"Лабиринт {self.maze.width}×{self.maze.height}\")\n", " print(\"=\" * (self.maze.width * 2 + 4))\n", " \n", " for y in range(self.maze.height):\n", " row = \"\"\n", " for x in range(self.maze.width):\n", " cell = self.maze.get_cell(x, y)\n", " if not cell:\n", " row += \" \"\n", " continue\n", " \n", " if self.player_pos and cell == self.player_pos:\n", " row += self.SYMBOLS['player'] + \" \"\n", " elif cell.is_start:\n", " row += self.SYMBOLS['start'] + \" \"\n", " elif cell.is_exit:\n", " row += self.SYMBOLS['exit'] + \" \"\n", " elif cell in self.solution_path:\n", " row += self.SYMBOLS['solution'] + \" \"\n", " elif cell.is_wall:\n", " row += self.SYMBOLS['wall'] * 2\n", " else:\n", " row += self.SYMBOLS['path'] * 2\n", " print(row)\n", " \n", " print(\"-\" * (self.maze.width * 2 + 4))\n", " \n", " # Показать последние сообщения\n", " if self.messages:\n", " print(\"Последние события:\")\n", " for msg in self.messages[-3:]:\n", " print(f\" {msg}\")\n", " \n", " print()\n", " \n", " def clear_messages(self) -> None:\n", " \"\"\"Очистить сообщения.\"\"\"\n", " self.messages.clear()" ] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:base] *", "language": "python", "name": "conda-base-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.9" } }, "nbformat": 4, "nbformat_minor": 5 }