From bca3eb1b7c52a297d8f28ad601ef4c5dabdb55ff Mon Sep 17 00:00:00 2001 From: semyanovra Date: Sun, 24 May 2026 14:56:28 +0000 Subject: [PATCH] =?UTF-8?q?[2]=20feat=20-=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE?= =?UTF-8?q?=D1=86=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=B8=D0=B3=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=20=D1=86=D0=B8=D0=BA=D0=BB=20=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B0?= =?UTF-8?q?=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- semyanovra/scr/maze.py | 77 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 10 deletions(-) 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