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-диаграмма протокола пользовательского уровня представлена на рисунке ниже.
|
UML-диаграмма протокола пользовательского уровня представлена на рисунке ниже.
|
||||||

|

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

|

|
||||||
|
|
||||||
Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся.
|
Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся.
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user