[2] feat - полноценный игровой цикл и интеграция алгоритмов
This commit is contained in:
parent
b29a0309a1
commit
bca3eb1b7c
|
|
@ -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()
|
||||
Loading…
Reference in New Issue
Block a user