2026-rff_mp/ivanchenkoam/maze_project/main.py

204 lines
6.3 KiB
Python
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.

"""Главный файл программы"""
import sys
from pathlib import Path
from builders import TextFileMazeBuilder
from solver import MazeSolver
from strategies import BFSStrategy, DFSStrategy, AStarStrategy
from visualization import ConsoleView
from commands import MoveCommand
from models import Player
from experiments import ExperimentRunner
def create_test_maze_files():
"""Создание тестовых лабиринтов"""
Path("mazes").mkdir(exist_ok=True)
# Лабиринт 1: Маленький запутанный (10×10)
small_maze = [
"##########",
"#S #",
"# ####### #",
"# # #",
"##### # # #",
"# # #",
"# ### ### #",
"# # #",
"# #### E#",
"##########"
]
# Лабиринт 2: Простой прямой путь (10×10)
simple_maze = [
"##########",
"#S #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# E#",
"##########"
]
# Лабиринт 3: Без выхода (10×10)
no_exit_maze = [
"##########",
"#S #",
"# ####### #",
"# # #",
"##### # # #",
"# # #",
"# ### ### #",
"# # #",
"# #######",
"##########"
]
# Лабиринт 4: Спиральный
spiral_maze = [
"##########",
"#S #",
"# ####### #",
"# # # #",
"# # ### # #",
"# # # # #",
"# # ### # #",
"# # # #",
"# #######E#",
"##########"
]
with open("mazes/small_maze.txt", "w", encoding="utf-8") as f:
f.write('\n'.join(small_maze))
with open("mazes/simple_maze.txt", "w", encoding="utf-8") as f:
f.write('\n'.join(simple_maze))
with open("mazes/no_exit_maze.txt", "w", encoding="utf-8") as f:
f.write('\n'.join(no_exit_maze))
with open("mazes/spiral_maze.txt", "w", encoding="utf-8") as f:
f.write('\n'.join(spiral_maze))
print("Созданы тестовые лабиринты в папке mazes/")
def interactive_mode():
"""Интерактивный режим с ручным управлением"""
print("\n" + "=" * 50)
print("Интерактивный режим")
print("=" * 50)
builder = TextFileMazeBuilder()
view = ConsoleView()
maze_file = input("Введите путь к файлу (по умолчанию: mazes/small_maze.txt): ")
if not maze_file:
maze_file = "mazes/small_maze.txt"
try:
maze = builder.build_from_file(maze_file)
view.update("maze_loaded", {"maze": maze})
except Exception as e:
print(f"Ошибка: {e}")
return
print("\nСтратегии:")
print("1. BFS (кратчайший путь)")
print("2. DFS (быстрый, но не оптимальный)")
print("3. A* (оптимальный с эвристикой)")
choice = input("Выберите (1-3): ")
strategies = {
"1": BFSStrategy(),
"2": DFSStrategy(),
"3": AStarStrategy()
}
strategy = strategies.get(choice, BFSStrategy())
print(f"\nВыбрана стратегия: {strategy.name}")
solver = MazeSolver(maze, strategy)
path, stats = solver.solve()
if path:
view.update("path_found", {"path": path, "maze": maze})
print(f"\n{stats}")
else:
view.update("path_not_found", {})
print("Путь не найден!")
# Демонстрация Command (пошаговое движение)
print("\n" + "-" * 30)
print("Демонстрация паттерна Command (пошаговое движение)")
print("-" * 30)
if path:
player = Player(maze.start)
print("\nПошаговое движение по найденному пути (Enter - следующий шаг, q - выход):")
for i, cell in enumerate(path[1:], 1):
cmd = MoveCommand(player, cell)
cmd.execute()
view.render(maze, player.current_cell, path[:i+1])
print(f"Шаг {i}/{len(path)-1}")
key = input("Нажмите Enter для продолжения или 'q' для выхода: ")
if key.lower() == 'q':
break
if player.current_cell == maze.exit:
print("\n🎉 Вы достигли выхода!")
def experiment_mode():
"""Экспериментальный режим сравнения алгоритмов"""
print("\n" + "=" * 50)
print("Экспериментальное сравнение алгоритмов")
print("=" * 50)
create_test_maze_files()
runner = ExperimentRunner()
maze_files = [
"mazes/small_maze.txt",
"mazes/simple_maze.txt",
"mazes/no_exit_maze.txt",
"mazes/spiral_maze.txt"
]
results = runner.run_all_experiments(maze_files, runs=10)
print("\n" + "=" * 50)
print("Сводная таблица результатов:")
print("=" * 50)
print(f"{'Лабиринт':<15} {'Стратегия':<10} {'Ср. время (мс)':<15} {'Длина пути':<12} {'Найден':<8}")
print("-" * 65)
for r in results:
status = "" if r['path_found'] else ""
print(f"{r['maze']:<15} {r['strategy']:<10} {r['avg_time_ms']:<15.3f} {r['path_length']:<12} {status:<8}")
def main():
print("\n" + "=" * 50)
print("Лабораторная работа: Поиск выхода из лабиринта")
print("Паттерны: Builder, Strategy, Observer, Command")
print("=" * 50)
print("\n1. Интерактивный режим (ручное управление)")
print("2. Экспериментальный режим (сравнение алгоритмов)")
choice = input("\nВыберите (1-2): ")
if choice == "1":
interactive_mode()
elif choice == "2":
experiment_mode()
else:
print("Неверный выбор!")
if __name__ == "__main__":
main()