67 lines
3.3 KiB
C++
67 lines
3.3 KiB
C++
/*! @file maze.hpp
|
||
Заголовочный файл класса лабиринта для игры.
|
||
@author ParkSuMin
|
||
@date 2025.04.30 */
|
||
|
||
#ifndef MAZE_HPP
|
||
#define MAZE_HPP
|
||
|
||
#include <vector>
|
||
#include <unordered_map>
|
||
#include <ctime>
|
||
#include <climits>
|
||
#include <random>
|
||
|
||
/*! Размер лабиринта (количество узлов). */
|
||
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<int, std::vector<bool>> 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
|