Add diagrams and comments
This commit is contained in:
BIN
doc/maze.png
Normal file
BIN
doc/maze.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
@@ -3,14 +3,14 @@
|
||||
|
||||
## Протокол пользовательского уровня
|
||||
UML-диаграмма протокола пользовательского уровня представлена на рисунке ниже.
|
||||

|
||||

|
||||
|
||||
## Описание работы приложения
|
||||
Сервер `maze-server` ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 1024). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки `(0, 0)` в конечную точку `(2, 2)`. Добавление дополнительных стен происходит с соблюдением условия достижимости цели.
|
||||
Сервер `MazeServer` ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 1024). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки `(0, 0)` в конечную точку `(2, 2)`. Добавление дополнительных стен происходит с соблюдением условия достижимости цели.
|
||||
|
||||
Cхема и нумерация клеток лабиринта представлена на рисунке ниже.
|
||||
|
||||

|
||||

|
||||
|
||||
Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся.
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "maze.hpp"
|
||||
|
||||
Maze::Maze(bool _test_mode, int _steps){
|
||||
// Инициализация графа лабиринта и его ребер
|
||||
std::vector<Edge> 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<bool>(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<int>(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;
|
||||
|
||||
Reference in New Issue
Block a user