2026-rff_mp/ProninVV/task-2-oop/MazeSolver.py

58 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
from Maze import Maze
from strategy import PathFindingStrategy
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:
def __init__(self, maze: Maze, strategy: PathFindingStrategy):
self._maze = maze
self._strategy = strategy
self._observers = []
def addObserver(self, observer):
"""Регистрация нового наблюдателя (например, ConsoleView)"""
self._observers.append(observer)
def notify(self, event):
"""Уведомление всех подписчиков о событии"""
for observer in self._observers:
observer.update(event)
def setStrategy(self, strategy):
self._strategy = strategy
def solve(self):
if not self._maze or not self._strategy:
raise ValueError("Не задан лабиринт или стратегия поиска!")
start_time = time.perf_counter()
path, visited_count = self._strategy.findPath(
self._maze, self._maze.start, self._maze.exit)
end_time = time.perf_counter()
execution_time_ms = (end_time - start_time) * 1000
path_length = len(path)
from ConsoleView import Event
self.notify(Event("path_found", {"maze": self._maze, "path": path}))
return SearchStats(execution_time_ms, visited_count, path_length, path)