/*! @file maze.hpp Заголовочный файл класса лабиринта для игры. @author ParkSuMin @date 2025.04.30 */ #ifndef MAZE_HPP #define MAZE_HPP #include #include #include #include #include /*! Размер лабиринта (количество узлов). */ const int MAZE_SIZE = 9; /*! Количество направлений движения (вперёд, направо, назад, налево). */ const int DIRECTIONS = 4; /*! Минимальное количество стен в лабиринте. */ const int MIN_WALLS = 3; /*! Максимальное количество стен в лабиринте. */ const int MAX_WALLS = 5; /*! Класс лабиринта для игры. */ class Maze{ private: std::unordered_map> graph; ///< Граф лабиринта, где узлы связаны направлениями. int moves_left; ///< Количество оставшихся ходов. bool test_mode; ///< Флаг тестового режима (без ограничения ходов). /*! Проверяет наличие пути между двумя узлами. @details Использует поиск в ширину (BFS) для проверки существования пути от start до end. @param start Начальный узел. @param end Конечный узел. @return true, если путь существует, false — иначе. */ bool is_path_exists(int start, int end); /*! Структура, представляющая ребро в графе лабиринта. */ struct Edge { int node1; ///< Первый узел ребра. int dir1; ///< Направление от первого узла. int node2; ///< Второй узел ребра. int dir2; ///< Направление от второго узла. }; public: /*! Создаёт лабиринт. @details Инициализирует граф лабиринта, добавляет случайные стены и задаёт количество ходов. @param flag Флаг тестового режима (true — без ограничения ходов). @param steps Количество ходов, доступных игроку (игнорируется в тестовом режиме). */ Maze(bool flag, int steps); /*! Возвращает количество оставшихся ходов. @return Целое число, представляющее оставшиеся ходы. */ int get_moves_left() const; /*! Устанавливает количество оставшихся ходов. @param _steps Новое значение количества ходов. */ void set_moves_left(int _steps); /*! Проверяет наличие стены в указанном направлении от узла. @param node Узел лабиринта. @param direction Направление (0 — вперёд, 1 — направо, 2 — назад, 3 — налево). @return true, если в указанном направлении стена, false — иначе. */ bool is_wall(int node, int direction) const; }; #endif