# Реализация сетевого серверного приложения "Лабиринт" на основе многопоточности При подключении клиента сервер порождает новый поток для работы с этим клиентом. ## Протокол пользовательского уровня UML-диаграмма протокола пользовательского уровня представлена на рисунке ниже. ![UML-диаграмма протокола пользовательского уровня](echo-protocol.svg) ## Описание работы приложения Сервер `maze-server` ожидает подключения клиентов по протоколу TCP на заданный порт (по умолчанию 1024). После установления соединения сервер запрашивает имя игрока, а затем начинает игру в лабиринте. Лабиринт генерируется случайным образом при старте каждой новой игровой сессии. Гарантируется наличие хотя бы одного пути из начальной точки `(0, 0)` в конечную точку `(2, 2)`. Добавление дополнительных стен происходит с соблюдением условия достижимости цели. Cхема и нумерация клеток лабиринта представлена на рисунке ниже. ![Схема лабиринта](maze_numeration.svg) Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся. ### Запуск сервера Приложение сервера при запуске принимает следующие необязательные ключи: - `-h` — задаёт имя хоста, к которому будет привязан сокет; - `-p` — задаёт номер порта для прослушивания; - `-n` — задаёт максимальное количество шагов, разрешённое для одного игрока; - `-s` — включает сервисный режим (без ограничений по количеству шагов). ```bash ./maze-server -h localhost -p 1024 -n 10 -s ``` По умолчанию сокет сервера связывается с адресом `localhost:1024`, игрокам разрешено 10 шагов, сервисный режим выключен. Завершение работы сервера — `Ctrl+C`. Клиент подключается к серверу, отправляет своё имя и получает интерактивную игру в лабиринт. Поддерживаемые команды: - `вперёд` — перемещение вверх; - `направо` — перемещение вправо; - `налево` — перемещение влево; - `назад` — перемещение вниз; - `cдаюсь` — завершение игры досрочно. Если игрок исчерпал все ходы, но не дошёл до финиша, он считается проигравшим. Финиш находится в позиции (2, 2) (координаты x, y). ### Запуск клиента Приложение клиента при запуске принимает два необязательных ключа: - `-h` — задаёт имя хоста сервера для подключения; - `-p` — задаёт номер порта сервера. ```bash ./maze_client -h localhost -p 1024 ``` По умолчанию клиент пытается подключиться к адресу `localhost:1024`.