[2] feat - полноценный игровой цикл и интеграция алгоритмов

This commit is contained in:
semyanovra 2026-05-24 14:56:28 +00:00
parent b29a0309a1
commit bca3eb1b7c

View File

@ -348,6 +348,7 @@ class ConsoleDisplay(EventListener):
print()
print("=" * (maze.width * 2 + 4))
print(f" Player position: ({self._walker.current.x}, {self._walker.current.y})")
print(" S - start E - exit # - wall . - path P - player")
def _render_path(self, path):
if not path:
@ -415,17 +416,73 @@ class MoveAction(Action):
return False
if __name__ == "__main__":
# ----------------------------- Главный игровой цикл -----------------------------
def play_game():
builder = TxtLabyrinthBuilder()
maze = builder.build_from_file("maze/level1.txt")
walker = Walker(maze.start, maze)
view = ConsoleDisplay(walker)
view._render_maze_with_player(maze)
print("Player created at start position!")
view._render_maze(maze)
# Test movement
test_move = MoveAction(walker, (1, 0), maze)
if test_move.execute():
print("Moved right!")
solver = Pathfinder(maze)
solver.attach(view)
print("\n CONTROLS:")
print(" H (left) J (down) K (up) L (right)")
print(" U - undo Q - quit")
print("\n AUTO SEARCH:")
print(" B - BFS D - DFS A - A*")
print("\n" + "=" * 50)
action_stack = []
while True:
cmd = input("\n Command > ").lower()
if cmd == 'q':
print("\n Goodbye!")
break
elif cmd == 'b':
solver.set_algorithm(BFS())
stats = solver.solve()
if stats:
print(f"\n BFS: time={stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}")
elif cmd == 'd':
solver.set_algorithm(DFS())
stats = solver.solve()
if stats:
print(f"\n DFS: time={stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}")
elif cmd == 'a':
solver.set_algorithm(AStar())
stats = solver.solve()
if stats:
print(f"\n A*: time={stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}")
elif cmd in ['h', 'j', 'k', 'l']:
dir_map = {'h': (-1, 0), 'l': (1, 0), 'k': (0, -1), 'j': (0, 1)}
action = MoveAction(walker, dir_map[cmd], maze)
if action.execute():
action_stack.append(action)
view._render_maze_with_player(maze)
if walker.current == maze.exit:
print("\n CONGRATULATIONS! YOU FOUND THE EXIT!")
print(f" Total moves: {len(action_stack)}")
break
else:
print("\n Cannot go there! It's a wall.")
elif cmd == 'u':
if action_stack:
last = action_stack.pop()
last.undo()
view._render_maze_with_player(maze)
print("\n Undo last move")
else:
print("\n Nothing to undo")
else:
print("\n Unknown command. Use h,j,k,l to move, u to undo, q to quit")
print("\n Game over. Thanks for playing!")
if __name__ == "__main__":
play_game()