forked from UNN/2026-rff_mp
[2] feat - полноценный игровой цикл и интеграция алгоритмов
This commit is contained in:
parent
b29a0309a1
commit
bca3eb1b7c
|
|
@ -348,6 +348,7 @@ class ConsoleDisplay(EventListener):
|
||||||
print()
|
print()
|
||||||
print("=" * (maze.width * 2 + 4))
|
print("=" * (maze.width * 2 + 4))
|
||||||
print(f" Player position: ({self._walker.current.x}, {self._walker.current.y})")
|
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):
|
def _render_path(self, path):
|
||||||
if not path:
|
if not path:
|
||||||
|
|
@ -415,17 +416,73 @@ class MoveAction(Action):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
# ----------------------------- Главный игровой цикл -----------------------------
|
||||||
|
def play_game():
|
||||||
builder = TxtLabyrinthBuilder()
|
builder = TxtLabyrinthBuilder()
|
||||||
maze = builder.build_from_file("maze/level1.txt")
|
maze = builder.build_from_file("maze/level1.txt")
|
||||||
|
|
||||||
walker = Walker(maze.start, maze)
|
walker = Walker(maze.start, maze)
|
||||||
view = ConsoleDisplay(walker)
|
view = ConsoleDisplay(walker)
|
||||||
view._render_maze_with_player(maze)
|
view._render_maze(maze)
|
||||||
print("Player created at start position!")
|
|
||||||
|
solver = Pathfinder(maze)
|
||||||
# Test movement
|
solver.attach(view)
|
||||||
test_move = MoveAction(walker, (1, 0), maze)
|
|
||||||
if test_move.execute():
|
print("\n CONTROLS:")
|
||||||
print("Moved right!")
|
print(" H (left) J (down) K (up) L (right)")
|
||||||
view._render_maze_with_player(maze)
|
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