117 lines
3.7 KiB
Python
117 lines
3.7 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
|
|||
|
|
|
|||
|
|
def test_strategies():
|
|||
|
|
print("ТЕСТИРОВАНИЕ STRATEGY ПАТТЕРНА")
|
|||
|
|
|
|||
|
|
# Загружаем лабиринт
|
|||
|
|
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})")
|
|||
|
|
|
|||
|
|
# Создаем стратегии
|
|||
|
|
strategies = [
|
|||
|
|
BFSStrategy(),
|
|||
|
|
DFSStrategy(),
|
|||
|
|
AStarStrategy()
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
print("РЕЗУЛЬТАТЫ ПОИСКА ПУТИ")
|
|||
|
|
|
|||
|
|
for strategy in strategies:
|
|||
|
|
print(f"\n--- {strategy.name} ---")
|
|||
|
|
|
|||
|
|
# Ищем путь
|
|||
|
|
path = strategy.find_path(maze, maze.start, maze.exit)
|
|||
|
|
|
|||
|
|
if path:
|
|||
|
|
print(f"Путь найден!")
|
|||
|
|
print(f"Посещено клеток: {strategy.visited_count}")
|
|||
|
|
print(f"Длина пути: {len(path)} шагов")
|
|||
|
|
print(f"Путь: ", end="")
|
|||
|
|
for i, cell in enumerate(path[:5]):
|
|||
|
|
print(f"({cell.x},{cell.y})", end="")
|
|||
|
|
if i < len(path[:5]) - 1:
|
|||
|
|
print(" → ", end="")
|
|||
|
|
if len(path) > 5:
|
|||
|
|
print(f" ... → ({path[-1].x},{path[-1].y})")
|
|||
|
|
else:
|
|||
|
|
print()
|
|||
|
|
else:
|
|||
|
|
print(f"Путь не найден!")
|
|||
|
|
|
|||
|
|
# Визуализация
|
|||
|
|
print("ВИЗУАЛИЗАЦИЯ ЛАБИРИНТА С ПУТЕМ (BFS)")
|
|||
|
|
|
|||
|
|
# Находим путь BFS
|
|||
|
|
bfs = BFSStrategy()
|
|||
|
|
path = bfs.find_path(maze, maze.start, maze.exit)
|
|||
|
|
path_set = set(path)
|
|||
|
|
|
|||
|
|
print("\n " + " " * 4 + "0 1 2 3 4 5 6")
|
|||
|
|
for y in range(maze.height):
|
|||
|
|
line = f" {y} │ "
|
|||
|
|
for x in range(maze.width):
|
|||
|
|
cell = maze.get_cell(x, y)
|
|||
|
|
if cell in path_set and cell != maze.start and cell != maze.exit:
|
|||
|
|
line += "● "
|
|||
|
|
elif cell == maze.start:
|
|||
|
|
line += "S "
|
|||
|
|
elif cell == maze.exit:
|
|||
|
|
line += "E "
|
|||
|
|
elif cell.is_wall:
|
|||
|
|
line += "# "
|
|||
|
|
else:
|
|||
|
|
line += "· "
|
|||
|
|
print(line)
|
|||
|
|
|
|||
|
|
print("\n Условные обозначения:")
|
|||
|
|
print(" # - стена")
|
|||
|
|
print(" · - проход")
|
|||
|
|
print(" ● - путь")
|
|||
|
|
print(" S - старт")
|
|||
|
|
print(" E - выход")
|
|||
|
|
|
|||
|
|
def test_simple_maze():
|
|||
|
|
print("ТЕСТ НА ПРОСТОМ ЛАБИРИНТЕ")
|
|||
|
|
|
|||
|
|
builder = TextFileMazeBuilder()
|
|||
|
|
maze = builder.build_from_file("mazes/simple_maze.txt")
|
|||
|
|
|
|||
|
|
print(f"\nЛабиринт 5x3:")
|
|||
|
|
for y in range(maze.height):
|
|||
|
|
line = ""
|
|||
|
|
for x in range(maze.width):
|
|||
|
|
cell = maze.get_cell(x, y)
|
|||
|
|
if cell.is_wall:
|
|||
|
|
line += "#"
|
|||
|
|
elif cell.is_start:
|
|||
|
|
line += "S"
|
|||
|
|
elif cell.is_exit:
|
|||
|
|
line += "E"
|
|||
|
|
else:
|
|||
|
|
line += " "
|
|||
|
|
print(f" {line}")
|
|||
|
|
|
|||
|
|
strategies = [BFSStrategy(), DFSStrategy(), AStarStrategy()]
|
|||
|
|
|
|||
|
|
for strategy in strategies:
|
|||
|
|
path = strategy.find_path(maze, maze.start, maze.exit)
|
|||
|
|
if path:
|
|||
|
|
print(f"\n {strategy.name}: путь найден за {len(path)} шагов")
|
|||
|
|
else:
|
|||
|
|
print(f"\n {strategy.name}: путь НЕ найден")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
test_strategies()
|
|||
|
|
test_simple_maze()
|
|||
|
|
print("ТЕСТИРОВАНИЕ ЗАВЕРШЕНО")
|