diff --git a/semyanovra/scr/maze.py b/semyanovra/scr/maze.py index fcefc9f..56295a3 100644 --- a/semyanovra/scr/maze.py +++ b/semyanovra/scr/maze.py @@ -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!") - - # Test movement - test_move = MoveAction(walker, (1, 0), maze) - if test_move.execute(): - print("Moved right!") - view._render_maze_with_player(maze) \ No newline at end of file + view._render_maze(maze) + + 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() \ No newline at end of file