forked from UNN/2026-rff_mp
146 lines
4.6 KiB
Python
146 lines
4.6 KiB
Python
|
|
import sys
|
|||
|
|
from maze_builder import TextFileMazeBuilder
|
|||
|
|
from pathfinding_strategies import BFSStrategy, DFSStrategy, AStarStrategy
|
|||
|
|
from maze_solver import MazeSolver
|
|||
|
|
from visualization import ConsoleView, GameController, EventType
|
|||
|
|
from experiments import ExperimentRunner, print_analysis
|
|||
|
|
from analysis import plot_results
|
|||
|
|
|
|||
|
|
def create_sample_maze():
|
|||
|
|
sample_maze = [
|
|||
|
|
"S ##### ",
|
|||
|
|
"# # ### ",
|
|||
|
|
"# # # # ",
|
|||
|
|
"# # ### # ",
|
|||
|
|
"# # # ",
|
|||
|
|
"### # ### ",
|
|||
|
|
"# # # ",
|
|||
|
|
"# ####### ",
|
|||
|
|
"# E ",
|
|||
|
|
"##########"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
filename = "sample_maze.txt"
|
|||
|
|
with open(filename, 'w', encoding='utf-8') as f:
|
|||
|
|
f.write('\n'.join(sample_maze))
|
|||
|
|
|
|||
|
|
return filename
|
|||
|
|
|
|||
|
|
|
|||
|
|
def interactive_mode():
|
|||
|
|
|
|||
|
|
|
|||
|
|
builder = TextFileMazeBuilder()
|
|||
|
|
filename = create_sample_maze()
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
maze = builder.build_from_file(filename)
|
|||
|
|
print(f"Лабиринт загружен: {maze.width}x{maze.height}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Ошибка загрузки: {e}")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
view = ConsoleView()
|
|||
|
|
controller = GameController(maze, view)
|
|||
|
|
|
|||
|
|
strategies = {
|
|||
|
|
'1': BFSStrategy(),
|
|||
|
|
'2': DFSStrategy(),
|
|||
|
|
'3': AStarStrategy(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
print("\nДоступные алгоритмы поиска пути:")
|
|||
|
|
print(" 1. BFS (поиск в ширину) - кратчайший путь")
|
|||
|
|
print(" 2. DFS (поиск в глубину) - быстрый, не оптимальный")
|
|||
|
|
print(" 3. A* - оптимальный с эвристикой")
|
|||
|
|
|
|||
|
|
# Выбор стратегии
|
|||
|
|
while True:
|
|||
|
|
choice = input("\nВыберите алгоритм (1-3): ").strip()
|
|||
|
|
if choice in strategies:
|
|||
|
|
strategy = strategies[choice]
|
|||
|
|
break
|
|||
|
|
print("Неверный выбор. Попробуйте снова.")
|
|||
|
|
|
|||
|
|
# Поиск пути
|
|||
|
|
print(f"\nИспользуем: {strategy.name}")
|
|||
|
|
print("Поиск пути...")
|
|||
|
|
|
|||
|
|
solver = MazeSolver(maze, strategy)
|
|||
|
|
stats = solver.solve()
|
|||
|
|
|
|||
|
|
if stats.path_found:
|
|||
|
|
print(f" Путь найден! Победа! Длина: {stats.path_length} шагов")
|
|||
|
|
print(f" Время: {stats.time_ms:.3f} мс")
|
|||
|
|
|
|||
|
|
path = strategy.find_path(maze, maze.start, maze.exit)
|
|||
|
|
controller.set_path(path)
|
|||
|
|
|
|||
|
|
# Интерактивное управление
|
|||
|
|
print("\nДемонстрация паттерна Command:")
|
|||
|
|
print(" Используйте W/A/S/D для перемещения")
|
|||
|
|
print(" Нажмите U для отмены последнего хода")
|
|||
|
|
print(" Нажмите Q для выхода")
|
|||
|
|
print("\nТочка '.' показывает найденный путь")
|
|||
|
|
print("Буква 'P' показывает текущую позицию игрока")
|
|||
|
|
|
|||
|
|
controller._render()
|
|||
|
|
|
|||
|
|
while True:
|
|||
|
|
key = input("\n> ").lower()
|
|||
|
|
if key == 'q':
|
|||
|
|
break
|
|||
|
|
elif key == 'w':
|
|||
|
|
from visualization import Direction
|
|||
|
|
controller.move(Direction.UP)
|
|||
|
|
elif key == 's':
|
|||
|
|
from visualization import Direction
|
|||
|
|
controller.move(Direction.DOWN)
|
|||
|
|
elif key == 'a':
|
|||
|
|
from visualization import Direction
|
|||
|
|
controller.move(Direction.LEFT)
|
|||
|
|
elif key == 'd':
|
|||
|
|
from visualization import Direction
|
|||
|
|
controller.move(Direction.RIGHT)
|
|||
|
|
elif key == 'u':
|
|||
|
|
controller.undo()
|
|||
|
|
print("Ход отменён!")
|
|||
|
|
else:
|
|||
|
|
print("Команды: W(вверх), S(вниз), A(влево), D(вправо), U(отмена), Q(выход)")
|
|||
|
|
else:
|
|||
|
|
print("Путь не найден, грустно")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def experimental_mode():
|
|||
|
|
print("эксперименты")
|
|||
|
|
print("Запуск экспериментов на лабиринтах разной сложности...")
|
|||
|
|
|
|||
|
|
runner = ExperimentRunner()
|
|||
|
|
results = runner.run_all_experiments()
|
|||
|
|
print_analysis(results)
|
|||
|
|
|
|||
|
|
#графики
|
|||
|
|
plot_results(results)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
|
|||
|
|
|
|||
|
|
print("\nВыберите режим работы:")
|
|||
|
|
print(" 1. Интерактивный режим (с визуализацией)")
|
|||
|
|
print(" 2. Экспериментальный режим (замеры производительности)")
|
|||
|
|
print(" 3. Выход")
|
|||
|
|
|
|||
|
|
choice = input("\nВаш выбор (1-3): ").strip()
|
|||
|
|
|
|||
|
|
if choice == '1':
|
|||
|
|
interactive_mode()
|
|||
|
|
elif choice == '2':
|
|||
|
|
experimental_mode()
|
|||
|
|
else:
|
|||
|
|
print("Adios!")
|
|||
|
|
sys.exit(0)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|