2026-05-19 19:06:13 +00:00
|
|
|
|
import time
|
2026-05-20 19:52:01 +00:00
|
|
|
|
from Maze import Maze
|
|
|
|
|
|
from strategy import PathFindingStrategy
|
2026-05-19 19:06:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SearchStats:
|
|
|
|
|
|
def __init__(self, execution_time, visited_count, path_length, path):
|
|
|
|
|
|
self.execution_time = execution_time
|
|
|
|
|
|
self.visited_count = visited_count
|
|
|
|
|
|
self.path_length = path_length
|
|
|
|
|
|
self.path = path
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
|
return ("f == Статистика поиска == =\n"
|
|
|
|
|
|
f"Время выполнения: {self.execution_time_ms:.4f} мс\n"
|
|
|
|
|
|
f"Посещено клеток: {self.visited_count}\n"
|
|
|
|
|
|
f"Длина пути: {self.path_length} клеток\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MazeSolver:
|
2026-05-20 19:52:01 +00:00
|
|
|
|
def __init__(self, maze: Maze, strategy: PathFindingStrategy):
|
2026-05-19 19:06:13 +00:00
|
|
|
|
self._maze = maze
|
|
|
|
|
|
self._strategy = strategy
|
2026-05-20 19:52:01 +00:00
|
|
|
|
self._observers = []
|
|
|
|
|
|
|
|
|
|
|
|
def addObserver(self, observer):
|
|
|
|
|
|
"""Регистрация нового наблюдателя (например, ConsoleView)"""
|
|
|
|
|
|
self._observers.append(observer)
|
|
|
|
|
|
|
|
|
|
|
|
def notify(self, event):
|
|
|
|
|
|
"""Уведомление всех подписчиков о событии"""
|
|
|
|
|
|
for observer in self._observers:
|
|
|
|
|
|
observer.update(event)
|
2026-05-19 19:06:13 +00:00
|
|
|
|
|
|
|
|
|
|
def setStrategy(self, strategy):
|
|
|
|
|
|
self._strategy = strategy
|
|
|
|
|
|
|
|
|
|
|
|
def solve(self):
|
|
|
|
|
|
|
2026-05-20 19:52:01 +00:00
|
|
|
|
if not self._maze or not self._strategy:
|
2026-05-19 19:06:13 +00:00
|
|
|
|
raise ValueError("Не задан лабиринт или стратегия поиска!")
|
|
|
|
|
|
|
|
|
|
|
|
start_time = time.perf_counter()
|
|
|
|
|
|
|
2026-05-20 19:52:01 +00:00
|
|
|
|
path, visited_count = self._strategy.findPath(
|
|
|
|
|
|
self._maze, self._maze.start, self._maze.exit)
|
2026-05-19 19:06:13 +00:00
|
|
|
|
|
|
|
|
|
|
end_time = time.perf_counter()
|
|
|
|
|
|
|
|
|
|
|
|
execution_time_ms = (end_time - start_time) * 1000
|
|
|
|
|
|
|
|
|
|
|
|
path_length = len(path)
|
|
|
|
|
|
|
2026-05-20 19:52:01 +00:00
|
|
|
|
from ConsoleView import Event
|
|
|
|
|
|
self.notify(Event("path_found", {"maze": self._maze, "path": path}))
|
|
|
|
|
|
|
2026-05-19 19:06:13 +00:00
|
|
|
|
return SearchStats(execution_time_ms, visited_count, path_length, path)
|