2026-05-24 16:39:37 +00:00
|
|
|
from builders.text_file_maze_builder import TextFileMazeBuilder
|
|
|
|
|
from core.player import Player
|
|
|
|
|
from observer.console_view import ConsoleView
|
|
|
|
|
from solver.maze_solver import MazeSolver
|
|
|
|
|
from strategies.astar_strategy import AStarStrategy
|
|
|
|
|
from strategies.bfs_strategy import BFSStrategy
|
|
|
|
|
from strategies.dfs_strategy import DFSStrategy
|
|
|
|
|
from controller.game_controller import GameController
|
2026-05-23 15:45:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
2026-05-24 16:39:37 +00:00
|
|
|
BASE_DIR = Path(__file__).resolve().parent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run_demo():
|
|
|
|
|
builder = TextFileMazeBuilder()
|
|
|
|
|
maze = builder.buildFromFile(str(BASE_DIR / "mazes" / "maze_small.txt"))
|
|
|
|
|
|
|
|
|
|
view = ConsoleView()
|
|
|
|
|
view.update({"type": "maze_loaded", "message": "Maze loaded"})
|
|
|
|
|
view.render(maze)
|
|
|
|
|
|
|
|
|
|
solver = MazeSolver(maze)
|
|
|
|
|
solver.addObserver(view)
|
|
|
|
|
|
|
|
|
|
for strategy in (BFSStrategy(), DFSStrategy(), AStarStrategy()):
|
|
|
|
|
solver.setStrategy(strategy)
|
|
|
|
|
stats = solver.solve()
|
|
|
|
|
|
|
|
|
|
print()
|
|
|
|
|
print(f"=== {strategy.name} ===")
|
|
|
|
|
print(f"Time: {stats.timeMs:.3f} ms")
|
|
|
|
|
print(f"Visited cells: {stats.visitedCells}")
|
|
|
|
|
print(f"Path length: {stats.pathLength}")
|
|
|
|
|
print(f"Path found: {'yes' if stats.found else 'no'}")
|
|
|
|
|
|
|
|
|
|
view.render(maze, path=stats.path)
|
|
|
|
|
|
|
|
|
|
player = Player(maze.startCell)
|
|
|
|
|
controller = GameController(maze, player, view)
|
2026-05-23 15:45:47 +00:00
|
|
|
|
2026-05-24 16:39:37 +00:00
|
|
|
print("Manual mode: W/A/S/D move, Z undo, Q quit")
|
|
|
|
|
view.render(maze, player_position=player.currentCell)
|
2026-05-23 15:45:47 +00:00
|
|
|
|
2026-05-24 16:39:37 +00:00
|
|
|
while True:
|
|
|
|
|
cmd = input("Command: ").strip().upper()
|
|
|
|
|
if cmd == "Q":
|
|
|
|
|
break
|
|
|
|
|
if cmd == "Z":
|
|
|
|
|
controller.undo()
|
|
|
|
|
elif cmd in {"W", "A", "S", "D"}:
|
|
|
|
|
controller.move(cmd)
|
|
|
|
|
else:
|
|
|
|
|
print("Unknown command")
|
2026-05-23 15:45:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2026-05-24 16:39:37 +00:00
|
|
|
run_demo()
|