164 lines
5.5 KiB
Python
164 lines
5.5 KiB
Python
import sys
|
||
import os
|
||
|
||
# Добавляем корневую папку в путь поиска
|
||
sys.path.insert(0, r'C:\ivantsovma\docs\MazeProject')
|
||
|
||
from builders import TextFileMazeBuilder
|
||
from strategies import BFSStrategy, DFSStrategy, AStarStrategy
|
||
from solver import MazeSolver
|
||
|
||
def test_solver_basic():
|
||
print("БАЗОВАЯ РАБОТА MAZESOLVER")
|
||
|
||
# Загружаем лабиринт
|
||
builder = TextFileMazeBuilder()
|
||
maze = builder.build_from_file("mazes/small_maze.txt")
|
||
|
||
print(f"\nЛабиринт загружен: {maze.width}x{maze.height}")
|
||
print(f"Старт: ({maze.start.x}, {maze.start.y})")
|
||
print(f"Выход: ({maze.exit.x}, {maze.exit.y})")
|
||
|
||
# Создаем решатель с BFS стратегией
|
||
solver = MazeSolver(maze, BFSStrategy())
|
||
|
||
# Решаем лабиринт
|
||
print("\nРешение лабиринта (BFS)")
|
||
stats = solver.solve()
|
||
|
||
print(f"\nРезультат:")
|
||
print(f" {stats}")
|
||
|
||
# Показываем путь на карте
|
||
print("\nВизуализация пути:")
|
||
solver.print_maze_with_path()
|
||
|
||
return solver, stats
|
||
|
||
#Тест динамической смены стратегии
|
||
def test_solver_dynamic_strategy():
|
||
print("ДИНАМИЧЕСКАЯ СМЕНА СТРАТЕГИИ")
|
||
|
||
# Загружаем лабиринт
|
||
builder = TextFileMazeBuilder()
|
||
maze = builder.build_from_file("mazes/small_maze.txt")
|
||
|
||
# Создаем решатель без стратегии
|
||
solver = MazeSolver(maze)
|
||
|
||
# Пробуем разные стратегии
|
||
strategies = [
|
||
BFSStrategy(),
|
||
DFSStrategy(),
|
||
AStarStrategy()
|
||
]
|
||
|
||
for strategy in strategies:
|
||
print(f"\nУстановка стратегии: {strategy.name}")
|
||
solver.set_strategy(strategy)
|
||
stats = solver.solve()
|
||
print(f" {stats}")
|
||
|
||
return solver
|
||
|
||
#Сравнение
|
||
def test_solver_comparison():
|
||
print("СРАВНЕНИЕ ВСЕХ СТРАТЕГИЙ")
|
||
|
||
# Загружаем лабиринт
|
||
builder = TextFileMazeBuilder()
|
||
maze = builder.build_from_file("mazes/small_maze.txt")
|
||
|
||
# Создаем решатель
|
||
solver = MazeSolver(maze)
|
||
|
||
# Сравниваем стратегии
|
||
strategies = [BFSStrategy(), DFSStrategy(), AStarStrategy()]
|
||
results = solver.compare_strategies(strategies)
|
||
|
||
#Сводную таблица
|
||
print("СВОДНАЯ ТАБЛИЦА")
|
||
print(f"\n {'Стратегия':<10} {'Время(мс)':<10} {'Посещено':<10} {'Длина пути':<10} {'Статус':<10}")
|
||
|
||
for name, data in results.items():
|
||
stats = data['stats']
|
||
print(f" {name:<10} {stats.time_ms:<10.2f} {stats.visited_cells:<10} {stats.path_length:<10} {'OK' if stats.path_found else 'BULLSHIT'}")
|
||
|
||
return results
|
||
|
||
#Тест на разных лабиринтах
|
||
def test_multiple_mazes():
|
||
print("РАЗНЫЕ ЛАБИРИНТЫ")
|
||
|
||
mazes_files = [
|
||
("mazes/simple_maze.txt", "Простой (5x3)"),
|
||
("mazes/small_maze.txt", "Средний (7x7)")
|
||
]
|
||
|
||
strategies = [BFSStrategy(), DFSStrategy(), AStarStrategy()]
|
||
|
||
for maze_file, maze_name in mazes_files:
|
||
print(f"\n{maze_name}")
|
||
try:
|
||
builder = TextFileMazeBuilder()
|
||
maze = builder.build_from_file(maze_file)
|
||
solver = MazeSolver(maze)
|
||
|
||
for strategy in strategies:
|
||
solver.set_strategy(strategy)
|
||
stats = solver.solve()
|
||
status = "OK" if stats.path_found else "BULLSHIT"
|
||
print(f" {status} {strategy.name}: {stats.time_ms:.2f}мс | {stats.visited_cells} клеток | длина={stats.path_length}")
|
||
except Exception as e:
|
||
print(f" Ошибка загрузки {maze_file}: {e}")
|
||
|
||
def test_no_exit_maze():
|
||
print("ЛАБИРИНТ БЕЗ ВЫХОДА")
|
||
#Создаем простой лабиринт без выхода
|
||
from models import Maze, Cell
|
||
|
||
maze = Maze(5, 5)
|
||
|
||
#Заполняем проходами
|
||
for y in range(5):
|
||
for x in range(5):
|
||
cell = Cell(x, y, is_wall=False)
|
||
maze.set_cell(x, y, cell)
|
||
|
||
#Устанавливаем старт, но НЕ устанавливаем выход!
|
||
start = maze.get_cell(0, 0)
|
||
start.is_start = True
|
||
maze.start = start
|
||
|
||
# Выход не устанавливаем (maze.exit = None)
|
||
|
||
# Создаем стену, чтобы заблокировать путь
|
||
for x in range(5):
|
||
wall = maze.get_cell(x, 4)
|
||
wall.is_wall = True
|
||
|
||
print(f"\nЛабиринт: {maze.width}x{maze.height}")
|
||
print(f"Старт: ({maze.start.x}, {maze.start.y})")
|
||
print(f"Выход: отсутствует (None)")
|
||
|
||
# Пытаемся найти выход
|
||
solver = MazeSolver(maze, BFSStrategy())
|
||
|
||
try:
|
||
stats = solver.solve()
|
||
print(f"\nРезультат:")
|
||
print(f" {stats}")
|
||
except ValueError as e:
|
||
print(f"\nРезультат:")
|
||
print(f"Ошибка: {e}")
|
||
print(f"\nКорректная обработка: программа обнаружила отсутствие выхода")
|
||
|
||
if __name__ == "__main__":
|
||
# Запускаем все тесты
|
||
test_solver_basic()
|
||
test_solver_dynamic_strategy()
|
||
test_solver_comparison()
|
||
test_multiple_mazes()
|
||
test_no_exit_maze()
|
||
|
||
print("ВСЕ ТЕСТЫ ЗАВЕРШЕНЫ") |