forked from UNN/2026-rff_mp
51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
import time
|
|
from core.search_stats import SearchStats
|
|
|
|
|
|
class MazeSolver:
|
|
def __init__(self, maze, strategy=None):
|
|
self.maze = maze
|
|
self.strategy = strategy
|
|
self.observers = []
|
|
|
|
def setStrategy(self, strategy):
|
|
self.strategy = strategy
|
|
|
|
def addObserver(self, observer):
|
|
if observer not in self.observers:
|
|
self.observers.append(observer)
|
|
|
|
def removeObserver(self, observer):
|
|
if observer in self.observers:
|
|
self.observers.remove(observer)
|
|
|
|
def notify(self, event):
|
|
for observer in self.observers:
|
|
observer.update(event)
|
|
|
|
def solve(self):
|
|
if self.strategy is None:
|
|
raise ValueError("Strategy is not set")
|
|
self.notify({"type": "search_started", "strategy": self.strategy.name})
|
|
|
|
start_time = time.perf_counter()
|
|
path = self.strategy.findPath(self.maze, self.maze.startCell, self.maze.exitCell)
|
|
end_time = time.perf_counter()
|
|
|
|
stats = SearchStats(
|
|
timeMs=(end_time - start_time) * 1000.0,
|
|
visitedCells=getattr(self.strategy, "visitedCount", 0),
|
|
pathLength=len(path),
|
|
path=path,
|
|
found=bool(path),
|
|
algorithm=getattr(self.strategy, "name", "")
|
|
)
|
|
|
|
if stats.found:
|
|
self.notify({"type": "path_found", "strategy": stats.algorithm, "length": stats.pathLength})
|
|
else:
|
|
self.notify({"type": "path_not_found", "strategy": stats.algorithm})
|
|
|
|
self.notify({"type": "search_finished", "stats": stats})
|
|
return stats
|