diff --git a/doc/maze.png b/doc/maze.png new file mode 100644 index 0000000..a36ad1a Binary files /dev/null and b/doc/maze.png differ diff --git a/doc/multithread_maze_server.md b/doc/multithread_maze_server.md index 5b72585..9cb4543 100644 --- a/doc/multithread_maze_server.md +++ b/doc/multithread_maze_server.md @@ -3,14 +3,14 @@ ## Протокол пользовательского уровня UML-диаграмма протокола пользовательского уровня представлена на рисунке ниже. -![UML-диаграмма протокола пользовательского уровня](echo-protocol.svg) +![UML-диаграмма протокола пользовательского уровня](maze.png) ## Описание работы приложения -Сервер `maze-server` ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 1024). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки `(0, 0)` в конечную точку `(2, 2)`. Добавление дополнительных стен происходит с соблюдением условия достижимости цели. +Сервер `MazeServer` ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 1024). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки `(0, 0)` в конечную точку `(2, 2)`. Добавление дополнительных стен происходит с соблюдением условия достижимости цели. Cхема и нумерация клеток лабиринта представлена на рисунке ниже. -![Схема лабиринта](maze_numeration.svg) +![Схема лабиринта](numeration_maze.svg) Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся. diff --git a/src/server/maze.cpp b/src/server/maze.cpp index ad1d01d..c2a31a6 100644 --- a/src/server/maze.cpp +++ b/src/server/maze.cpp @@ -6,6 +6,7 @@ #include "maze.hpp" Maze::Maze(bool _test_mode, int _steps){ + // Инициализация графа лабиринта и его ребер std::vector edges = { {0, 1, 1, 3}, {0, 0, 3, 2}, {1, 1, 2, 3}, {1, 0, 4, 2}, {2, 0, 5, 2}, {3, 1, 4, 3}, {3, 0, 6, 2}, {4, 1, 5, 3}, @@ -18,11 +19,14 @@ Maze::Maze(bool _test_mode, int _steps){ graph[i] = std::vector(DIRECTIONS, true); } + // Выставление внешних стен graph[6][0] = graph[7][0] = graph[8][0] = false; graph[0][2] = graph[1][2] = graph[2][2] = false; graph[0][3] = graph[3][3] = graph[6][3] = false; graph[2][1] = graph[5][1] = graph[8][1] = false; + + // Добавление внутренних стен std::mt19937 rng(time(nullptr)); std::shuffle(edges.begin(), edges.end(), rng); int walls_to_add = std::uniform_int_distribution(MIN_WALLS, MAX_WALLS)(rng); @@ -31,6 +35,7 @@ Maze::Maze(bool _test_mode, int _steps){ const auto& edge = edges[i]; graph[edge.node1][edge.dir1] = false; graph[edge.node2][edge.dir2] = false; + // Проверка на существование пути if (!is_path_exists(0, 8)) { graph[edge.node1][edge.dir1] = true; graph[edge.node2][edge.dir2] = true;