Doxygen config
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@ cmake*
|
|||||||
CMakeC*
|
CMakeC*
|
||||||
Makefile
|
Makefile
|
||||||
maze_*
|
maze_*
|
||||||
|
documentation/
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
Клиент должен работать по разработанному сетевому протоколу.
|
Клиент должен работать по разработанному сетевому протоколу.
|
||||||
|
|
||||||
## Разработанное приложение
|
## Разработанное приложение
|
||||||
Реализация [сервера на основе многопоточности](doc/multithread_maze_server.md) и клиента эхо-приложения.
|
Реализация [сервера на основе многопоточности](doc/multithread_maze_server.md) и клиента игры-приложения.
|
||||||
|
|
||||||
## Требования
|
## Требования
|
||||||
Для сборки и запуска необходима Unix-система и компилятор C++ с поддержкой стандарта c++23.
|
Для сборки и запуска необходима Unix-система и компилятор C++ с поддержкой стандарта c++23.
|
||||||
@@ -29,3 +29,9 @@ cmake ..
|
|||||||
make
|
make
|
||||||
```
|
```
|
||||||
Собранные таким способом приложения сервера и клиента будут находиться в папке `build`.
|
Собранные таким способом приложения сервера и клиента будут находиться в папке `build`.
|
||||||
|
|
||||||
|
## (Опционально) Генерация документации
|
||||||
|
Для генерации документации необходимо установить [Doxygen](https://www.doxygen.nl/download.html) и выполнить команду:
|
||||||
|
```bash
|
||||||
|
doxygen Doxyfile
|
||||||
|
```
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ Cхема и нумерация клеток лабиринта представ
|
|||||||
./maze-server -h localhost -p 1024 -n 10 -s
|
./maze-server -h localhost -p 1024 -n 10 -s
|
||||||
```
|
```
|
||||||
По умолчанию сокет сервера связывается с адресом `localhost:1024`, игрокам разрешено 10 шагов, сервисный режим выключен.
|
По умолчанию сокет сервера связывается с адресом `localhost:1024`, игрокам разрешено 10 шагов, сервисный режим выключен.
|
||||||
Завершения работы сервера — `Ctrl+C`.
|
|
||||||
|
Завершение работы сервера — `Ctrl+C`.
|
||||||
|
|
||||||
Клиент подключается к серверу, отправляет своё имя и получает интерактивную игру в лабиринт.
|
Клиент подключается к серверу, отправляет своё имя и получает интерактивную игру в лабиринт.
|
||||||
Поддерживаемые команды:
|
Поддерживаемые команды:
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/*! @file client.hpp
|
||||||
|
Заголовочный файл клиента для игры в лабиринт на базе сокетов.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#ifndef CLIENT_HPP
|
#ifndef CLIENT_HPP
|
||||||
#define CLIENT_HPP
|
#define CLIENT_HPP
|
||||||
|
|
||||||
@@ -8,15 +13,31 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
|
||||||
|
/*! Класс клиента для взаимодействия с сервером игры в лабиринт. */
|
||||||
class Client{
|
class Client{
|
||||||
private:
|
private:
|
||||||
int sock;
|
int sock; ///< Сокет для соединения с сервером.
|
||||||
public:
|
public:
|
||||||
|
/*! Конструктор по умолчанию.
|
||||||
|
@details Конструктор создаёт сокет клиента и связывает его с предоставленным операционной системой адресом. В
|
||||||
|
случае ошибки вызывает исключение.
|
||||||
|
@throw std::runtime_error При ошибке создания или связывания сокета. */
|
||||||
Client();
|
Client();
|
||||||
|
|
||||||
void run(const std::string&, const unsigned short);
|
/*! Запускает клиентское приложение.
|
||||||
|
@details Устанавливает соединение с сервером по указанному хосту и порту, после чего вызывает игровой цикл.
|
||||||
|
@param host Адрес сервера (название хоста или IP-адрес).
|
||||||
|
@param port Порт сервера для подключения. */
|
||||||
|
void run(const std::string& host, const unsigned short port);
|
||||||
|
|
||||||
|
/*! Основной игровой цикл.
|
||||||
|
@details Обрабатывает ввод пользователя, отправляет команды на сервер и получает ответы. */
|
||||||
void game();
|
void game();
|
||||||
|
|
||||||
|
/*! Отправляет тестовый запрос (ping) на сервер.
|
||||||
|
@details Используется для проверки доступности сервера.
|
||||||
|
@param server_address Структура адреса сервера.
|
||||||
|
@return Целое число, указывающее результат выполнения (0 — успех, иначе — ошибка). */
|
||||||
int ping(struct sockaddr_in);
|
int ping(struct sockaddr_in);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/*! @file maze.hpp
|
||||||
|
Заголовочный файл класса лабиринта для игры.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#ifndef MAZE_HPP
|
#ifndef MAZE_HPP
|
||||||
#define MAZE_HPP
|
#define MAZE_HPP
|
||||||
|
|
||||||
@@ -7,29 +12,55 @@
|
|||||||
#include <climits>
|
#include <climits>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
|
/*! Размер лабиринта (количество узлов). */
|
||||||
const int MAZE_SIZE = 9;
|
const int MAZE_SIZE = 9;
|
||||||
|
/*! Количество направлений движения (вперёд, направо, назад, налево). */
|
||||||
const int DIRECTIONS = 4;
|
const int DIRECTIONS = 4;
|
||||||
|
/*! Минимальное количество стен в лабиринте. */
|
||||||
const int MIN_WALLS = 3;
|
const int MIN_WALLS = 3;
|
||||||
|
/*! Максимальное количество стен в лабиринте. */
|
||||||
const int MAX_WALLS = 5;
|
const int MAX_WALLS = 5;
|
||||||
|
|
||||||
|
/*! Класс лабиринта для игры. */
|
||||||
class Maze{
|
class Maze{
|
||||||
private:
|
private:
|
||||||
std::unordered_map<int, std::vector<bool>> graph;
|
std::unordered_map<int, std::vector<bool>> graph; ///< Граф лабиринта, где узлы связаны направлениями.
|
||||||
int moves_left;
|
int moves_left; ///< Количество оставшихся ходов.
|
||||||
|
bool test_mode; ///< Флаг тестового режима (без ограничения ходов).
|
||||||
|
|
||||||
|
/*! Проверяет наличие пути между двумя узлами.
|
||||||
|
@details Использует поиск в ширину (BFS) для проверки существования пути от start до end.
|
||||||
|
@param start Начальный узел.
|
||||||
|
@param end Конечный узел.
|
||||||
|
@return true, если путь существует, false — иначе. */
|
||||||
bool is_path_exists(int start, int end);
|
bool is_path_exists(int start, int end);
|
||||||
|
|
||||||
|
/*! Структура, представляющая ребро в графе лабиринта. */
|
||||||
struct Edge {
|
struct Edge {
|
||||||
int node1, dir1;
|
int node1; ///< Первый узел ребра.
|
||||||
int node2, dir2;
|
int dir1; ///< Направление от первого узла.
|
||||||
|
int node2; ///< Второй узел ребра.
|
||||||
|
int dir2; ///< Направление от второго узла.
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
bool test_mode;
|
/*! Создаёт лабиринт.
|
||||||
|
@details Инициализирует граф лабиринта, добавляет случайные стены и задаёт количество ходов.
|
||||||
|
@param flag Флаг тестового режима (true — без ограничения ходов).
|
||||||
|
@param steps Количество ходов, доступных игроку (игнорируется в тестовом режиме). */
|
||||||
Maze(bool flag, int steps);
|
Maze(bool flag, int steps);
|
||||||
|
|
||||||
|
/*! Возвращает количество оставшихся ходов.
|
||||||
|
@return Целое число, представляющее оставшиеся ходы. */
|
||||||
int get_moves_left() const;
|
int get_moves_left() const;
|
||||||
|
|
||||||
|
/*! Устанавливает количество оставшихся ходов.
|
||||||
|
@param _steps Новое значение количества ходов. */
|
||||||
void set_moves_left(int _steps);
|
void set_moves_left(int _steps);
|
||||||
|
|
||||||
|
/*! Проверяет наличие стены в указанном направлении от узла.
|
||||||
|
@param node Узел лабиринта.
|
||||||
|
@param direction Направление (0 — вперёд, 1 — направо, 2 — назад, 3 — налево).
|
||||||
|
@return true, если в указанном направлении стена, false — иначе. */
|
||||||
bool is_wall(int node, int direction) const;
|
bool is_wall(int node, int direction) const;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/*! @file server.hpp
|
||||||
|
Заголовочный файл сервера для игры в лабиринт на базе сокетов.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#ifndef SERVER_HPP
|
#ifndef SERVER_HPP
|
||||||
#define SERVER_HPP
|
#define SERVER_HPP
|
||||||
|
|
||||||
@@ -11,18 +16,43 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
/*! Максимальное количество клиентов, которые могут быть в очереди на подключение. */
|
||||||
const int MAX_CLIENTS = 512;
|
const int MAX_CLIENTS = 512;
|
||||||
|
|
||||||
|
/*! Размер буфера для обмена данными между сервером и клиентом. */
|
||||||
const int BUFFER_SIZE = 1024;
|
const int BUFFER_SIZE = 1024;
|
||||||
|
|
||||||
|
/*! Класс сервера для игры в лабиринт с использованием сокетов (протокол TCP). */
|
||||||
class Server {
|
class Server {
|
||||||
private:
|
private:
|
||||||
bool service_mode;
|
bool service_mode; ///< Флаг сервисного режима (тестовый режим без ограничения ходов).
|
||||||
int server_socket;
|
int server_socket; ///< Серверный сокет для обработки клиентских подключений.
|
||||||
|
|
||||||
|
/*! Обрабатывает подключение одного клиента.
|
||||||
|
@details Создаёт лабиринт для клиента, принимает команды, обновляет состояние игры и отправляет ответы.
|
||||||
|
@param socket Сокет клиента.
|
||||||
|
@param flag Флаг сервисного режима.
|
||||||
|
@param steps Количество ходов, доступных игроку (игнорируется в сервисном режиме). */
|
||||||
void handle_client(int socket, bool flag, int steps);
|
void handle_client(int socket, bool flag, int steps);
|
||||||
|
|
||||||
|
/*! Проверяет статус игры.
|
||||||
|
@details Проверяет, остались ли ходы у игрока, и активен ли тестовый режим.
|
||||||
|
@param maze Экземпляр объекта класса лабиринта.
|
||||||
|
@return true, если игра продолжается, false — если игра завершена. */
|
||||||
bool check_status(Maze& maze);
|
bool check_status(Maze& maze);
|
||||||
public:
|
public:
|
||||||
|
/*! Создаёт экземпляр сервера.
|
||||||
|
@details Инициализирует серверный сокет, связывает его с указанным хостом и портом.
|
||||||
|
@throw std::runtime_error При ошибке создания сокета, получения хоста или привязки.
|
||||||
|
@param host Адрес сервера (название хоста или IP-адрес).
|
||||||
|
@param port Порт сервера для подключения клиентов. */
|
||||||
Server(const std::string& host, const unsigned short port);
|
Server(const std::string& host, const unsigned short port);
|
||||||
|
|
||||||
|
/*! Запускает сервер.
|
||||||
|
@details Начинает прослушивание входящих подключений и создаёт отдельные потоки для обработки клиентов.
|
||||||
|
@throw std::runtime_error При ошибке прослушивания или принятия соединения.
|
||||||
|
@param steps Количество ходов, доступных каждому игроку.
|
||||||
|
@param service_flag Флаг активации сервисного режима. */
|
||||||
void start(int steps, bool service_flag);
|
void start(int steps, bool service_flag);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/*! @file client.cpp
|
||||||
|
Исходный файл клиента для игры в лабиринт на базе сокетов.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
|
|
||||||
// void print_instructions() {
|
// void print_instructions() {
|
||||||
|
|||||||
@@ -1,5 +1,30 @@
|
|||||||
|
/*! @file client_main.cpp
|
||||||
|
Главный файл клиента для игры в лабиринт на базе сокетов.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
|
|
||||||
|
/*! Главная функция клиента.
|
||||||
|
@details Обрабатывает аргументы командной строки, создаёт экземпляр клиента и запускает его.
|
||||||
|
@throw std::runtime_error При ошибке работы клиента.
|
||||||
|
@throw std::exception При непредвиденной ошибке.
|
||||||
|
@dot
|
||||||
|
digraph main {
|
||||||
|
ranksep=0.25;
|
||||||
|
node [shape=box,fontsize="10",fixedsize=true,width=2,height=0.3]
|
||||||
|
edge [arrowsize=0.5]
|
||||||
|
Beg [label="Начало",shape=ellipse]
|
||||||
|
End [label="Конец",shape=ellipse]
|
||||||
|
A [label="Проверка аргументов"]
|
||||||
|
B [label="Создание клиента"]
|
||||||
|
C [label="Запуск клиента"]
|
||||||
|
D [label="Обработка исключений"]
|
||||||
|
Beg->A->B->C->End
|
||||||
|
B->D
|
||||||
|
C->D->End
|
||||||
|
}
|
||||||
|
@enddot */
|
||||||
int main(int argc, char** argv){
|
int main(int argc, char** argv){
|
||||||
int opt;
|
int opt;
|
||||||
std::string host = "localhost";
|
std::string host = "localhost";
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/*! @file maze.cpp
|
||||||
|
Исходный файл класса лабиринта для игры.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#include "maze.hpp"
|
#include "maze.hpp"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/*! @file server.cpp
|
||||||
|
Исходный файл сервера для игры в лабиринт на базе сокетов.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#include "server.hpp"
|
#include "server.hpp"
|
||||||
|
|
||||||
bool Server::check_status(Maze &maze) {
|
bool Server::check_status(Maze &maze) {
|
||||||
|
|||||||
@@ -1,5 +1,30 @@
|
|||||||
|
/*! @file server_main.cpp
|
||||||
|
Главный файл сервера для игры в лабиринт на базе сокетов.
|
||||||
|
@author ParkSuMin
|
||||||
|
@date 2025.04.30 */
|
||||||
|
|
||||||
#include "server.hpp"
|
#include "server.hpp"
|
||||||
|
|
||||||
|
/*! Главная функция сервера.
|
||||||
|
@details Обрабатывает аргументы командной строки, создаёт экземпляр сервера и запускает его.
|
||||||
|
@throw std::runtime_error При ошибке работы сервера.
|
||||||
|
@throw std::exception При непредвиденной ошибке.
|
||||||
|
@dot
|
||||||
|
digraph main {
|
||||||
|
ranksep=0.25;
|
||||||
|
node [shape=box,fontsize="10",fixedsize=true,width=2,height=0.3]
|
||||||
|
edge [arrowsize=0.5]
|
||||||
|
Beg [label="Начало",shape=ellipse]
|
||||||
|
End [label="Конец",shape=ellipse]
|
||||||
|
A [label="Проверка аргументов"]
|
||||||
|
B [label="Создание сервера"]
|
||||||
|
C [label="Запуск сервера"]
|
||||||
|
D [label="Обработка исключений"]
|
||||||
|
Beg->A->B->C->End
|
||||||
|
B->D
|
||||||
|
C->D->End
|
||||||
|
}
|
||||||
|
@enddot */
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
int opt;
|
int opt;
|
||||||
std::string host = "localhost";
|
std::string host = "localhost";
|
||||||
|
|||||||
Reference in New Issue
Block a user