2026-rff_mp/MininaVD/docs2/data2/visualizationConsole_view.ipynb

117 lines
4.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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
}