Add diagrams and comments

This commit is contained in:
2025-05-04 14:17:17 +03:00
parent 725777d4fa
commit 651e8ec5aa
3 changed files with 8 additions and 3 deletions

BIN
doc/maze.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -3,14 +3,14 @@
## Протокол пользовательского уровня ## Протокол пользовательского уровня
UML-диаграмма протокола пользовательского уровня представлена на рисунке ниже. UML-диаграмма протокола пользовательского уровня представлена на рисунке ниже.
![UML-диаграмма протокола пользовательского уровня](echo-protocol.svg) ![UML-диаграмма протокола пользовательского уровня](maze.png)
## Описание работы приложения ## Описание работы приложения
Сервер `maze-server` ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 1024). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки `(0, 0)` в конечную точку `(2, 2)`. Добавление дополнительных стен происходит с соблюдением условия достижимости цели. Сервер `MazeServer` ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 1024). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки `(0, 0)` в конечную точку `(2, 2)`. Добавление дополнительных стен происходит с соблюдением условия достижимости цели.
Cхема и нумерация клеток лабиринта представлена на рисунке ниже. Cхема и нумерация клеток лабиринта представлена на рисунке ниже.
![Схема лабиринта](maze_numeration.svg) ![Схема лабиринта](numeration_maze.svg)
Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся. Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся.

View File

@@ -6,6 +6,7 @@
#include "maze.hpp" #include "maze.hpp"
Maze::Maze(bool _test_mode, int _steps){ Maze::Maze(bool _test_mode, int _steps){
// Инициализация графа лабиринта и его ребер
std::vector<Edge> edges = { std::vector<Edge> edges = {
{0, 1, 1, 3}, {0, 0, 3, 2}, {1, 1, 2, 3}, {1, 0, 4, 2}, {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}, {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<bool>(DIRECTIONS, true); graph[i] = std::vector<bool>(DIRECTIONS, true);
} }
// Выставление внешних стен
graph[6][0] = graph[7][0] = graph[8][0] = false; graph[6][0] = graph[7][0] = graph[8][0] = false;
graph[0][2] = graph[1][2] = graph[2][2] = false; graph[0][2] = graph[1][2] = graph[2][2] = false;
graph[0][3] = graph[3][3] = graph[6][3] = false; graph[0][3] = graph[3][3] = graph[6][3] = false;
graph[2][1] = graph[5][1] = graph[8][1] = false; graph[2][1] = graph[5][1] = graph[8][1] = false;
// Добавление внутренних стен
std::mt19937 rng(time(nullptr)); std::mt19937 rng(time(nullptr));
std::shuffle(edges.begin(), edges.end(), rng); std::shuffle(edges.begin(), edges.end(), rng);
int walls_to_add = std::uniform_int_distribution<int>(MIN_WALLS, MAX_WALLS)(rng); int walls_to_add = std::uniform_int_distribution<int>(MIN_WALLS, MAX_WALLS)(rng);
@@ -31,6 +35,7 @@ Maze::Maze(bool _test_mode, int _steps){
const auto& edge = edges[i]; const auto& edge = edges[i];
graph[edge.node1][edge.dir1] = false; graph[edge.node1][edge.dir1] = false;
graph[edge.node2][edge.dir2] = false; graph[edge.node2][edge.dir2] = false;
// Проверка на существование пути
if (!is_path_exists(0, 8)) { if (!is_path_exists(0, 8)) {
graph[edge.node1][edge.dir1] = true; graph[edge.node1][edge.dir1] = true;
graph[edge.node2][edge.dir2] = true; graph[edge.node2][edge.dir2] = true;