forked from UNN/2026-rff_mp
93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
|
|
import sys
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
#Добавляем корневую папку
|
|||
|
|
sys.path.insert(0, r'C:\ivantsovma\docs\MazeProject')
|
|||
|
|
|
|||
|
|
from builders import TextFileMazeBuilder
|
|||
|
|
from strategies import BFSStrategy
|
|||
|
|
from visualization.observer import Event, EventType
|
|||
|
|
from visualization.console_view import ConsoleView
|
|||
|
|
from visualization.game_controller import GameController
|
|||
|
|
|
|||
|
|
def play_maze():
|
|||
|
|
print("НАЙДИ ВЫХОД ИЗ ЛАБИРИНТА")
|
|||
|
|
|
|||
|
|
#Загружаем лабиринт
|
|||
|
|
builder = TextFileMazeBuilder()
|
|||
|
|
|
|||
|
|
#Выбор лабиринта
|
|||
|
|
print("\nВыберите лабиринт:")
|
|||
|
|
print("1. Простой лабиринт (simple_maze.txt)")
|
|||
|
|
print("2. Сложный лабиринт (small_maze.txt)")
|
|||
|
|
|
|||
|
|
choice = input("Ваш выбор (1/2): ").strip()
|
|||
|
|
|
|||
|
|
if choice == "1":
|
|||
|
|
maze_file = "mazes/simple_maze.txt"
|
|||
|
|
else:
|
|||
|
|
maze_file = "mazes/small_maze.txt"
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
maze = builder.build_from_file(maze_file)
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Ошибка загрузки лабиринта: {e}")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
#Создаём контроллер и отображение
|
|||
|
|
controller = GameController(maze)
|
|||
|
|
view = ConsoleView()
|
|||
|
|
|
|||
|
|
#Подписываем view на события контроллера
|
|||
|
|
controller.attach(view)
|
|||
|
|
|
|||
|
|
#Уведомляем о загрузке лабиринта
|
|||
|
|
controller.notify(Event(EventType.MAZE_LOADED, maze))
|
|||
|
|
|
|||
|
|
#Находим и показываем оптимальный путь (для подсказки)
|
|||
|
|
bfs = BFSStrategy()
|
|||
|
|
optimal_path = bfs.find_path(maze, maze.start, maze.exit)
|
|||
|
|
controller.notify(Event(EventType.PATH_FOUND, optimal_path))
|
|||
|
|
|
|||
|
|
print("\nУправление:")
|
|||
|
|
print(" w - вверх s - вниз a - влево d - вправо")
|
|||
|
|
print(" u - отменить q - выход")
|
|||
|
|
|
|||
|
|
# Игровой цикл
|
|||
|
|
while True:
|
|||
|
|
view.render()
|
|||
|
|
|
|||
|
|
# Проверка победы
|
|||
|
|
if controller.get_player_position() == maze.exit:
|
|||
|
|
view.render()
|
|||
|
|
print("\nВЫ НАШЛИ ВЫХОД!")
|
|||
|
|
break
|
|||
|
|
|
|||
|
|
# Чтение команды
|
|||
|
|
cmd = input("\nВведите команду: ").lower().strip()
|
|||
|
|
|
|||
|
|
if cmd == 'q':
|
|||
|
|
print("Выход из игры...")
|
|||
|
|
break
|
|||
|
|
elif cmd == 'u':
|
|||
|
|
controller.undo()
|
|||
|
|
elif cmd == 'w':
|
|||
|
|
controller.move((0, -1))
|
|||
|
|
elif cmd == 's':
|
|||
|
|
controller.move((0, 1))
|
|||
|
|
elif cmd == 'a':
|
|||
|
|
controller.move((-1, 0))
|
|||
|
|
elif cmd == 'd':
|
|||
|
|
controller.move((1, 0))
|
|||
|
|
else:
|
|||
|
|
print("Неизвестная команда! Используйте w/a/s/d, u или q")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
try:
|
|||
|
|
play_maze()
|
|||
|
|
except KeyboardInterrupt:
|
|||
|
|
print("\n\nИгра прервана пользователем")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"\nОшибка: {e}")
|
|||
|
|
import traceback
|
|||
|
|
traceback.print_exc()
|