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() |