55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
|
|
"""
|
|||
|
|
demo.py - короткая демонстрация всех паттернов на маленьком лабиринте.
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from maze_solver import (
|
|||
|
|
TextFileMazeBuilder, MazeSolver, ConsoleView,
|
|||
|
|
BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy,
|
|||
|
|
Player, MoveCommand, CommandHistory,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
print("=== Builder: загружаем small_10x10.txt ===")
|
|||
|
|
builder = TextFileMazeBuilder()
|
|||
|
|
maze = builder.build_from_file("mazes/small_10x10.txt")
|
|||
|
|
|
|||
|
|
view = ConsoleView(verbose=True)
|
|||
|
|
view.update({"type": "maze_loaded", "maze": maze})
|
|||
|
|
|
|||
|
|
print("\nСам лабиринт:")
|
|||
|
|
print(maze.render_text())
|
|||
|
|
|
|||
|
|
print("\n=== Strategy: пробуем все 4 алгоритма ===")
|
|||
|
|
solver = MazeSolver(maze)
|
|||
|
|
solver.attach(view)
|
|||
|
|
|
|||
|
|
for cls in (BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy):
|
|||
|
|
solver.set_strategy(cls())
|
|||
|
|
stats = solver.solve()
|
|||
|
|
print(f"--- {stats['strategy']} путь длиной {stats['path_length']} ---")
|
|||
|
|
print(maze.render_text(path=stats['path']))
|
|||
|
|
print()
|
|||
|
|
|
|||
|
|
print("=== Command: пройдёмся вручную и сделаем undo ===")
|
|||
|
|
player = Player(maze.start)
|
|||
|
|
history = CommandHistory()
|
|||
|
|
print(f"стартовая позиция: ({player.x},{player.y})")
|
|||
|
|
|
|||
|
|
# Несколько шагов вправо
|
|||
|
|
for d in "DDDD":
|
|||
|
|
ok = history.do(MoveCommand(maze, player, d))
|
|||
|
|
print(f" move {d}: {'ok' if ok else 'blocked'} -> ({player.x},{player.y})")
|
|||
|
|
|
|||
|
|
print("Откатываем 2 хода (undo, undo):")
|
|||
|
|
history.undo()
|
|||
|
|
history.undo()
|
|||
|
|
print(f" теперь игрок в ({player.x},{player.y})")
|
|||
|
|
|
|||
|
|
print("\nЛабиринт с игроком:")
|
|||
|
|
print(maze.render_text(player=player))
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|