Doxygen config

This commit is contained in:
2025-05-01 01:27:21 +03:00
parent 8823945938
commit d6966f69db
12 changed files with 2666 additions and 15 deletions

3
.gitignore vendored
View File

@@ -3,4 +3,5 @@ CMakeFiles/
cmake* cmake*
CMakeC* CMakeC*
Makefile Makefile
maze_* maze_*
documentation/

2496
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -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
```

View File

@@ -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`.
Клиент подключается к серверу, отправляет своё имя и получает интерактивную игру в лабиринт. Клиент подключается к серверу, отправляет своё имя и получает интерактивную игру в лабиринт.
Поддерживаемые команды: Поддерживаемые команды:

View File

@@ -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);
}; };

View File

@@ -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

View File

@@ -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);
}; };

View File

@@ -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() {

View File

@@ -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";

View File

@@ -1,3 +1,8 @@
/*! @file maze.cpp
Исходный файл класса лабиринта для игры.
@author ParkSuMin
@date 2025.04.30 */
#include "maze.hpp" #include "maze.hpp"
#include <iostream> #include <iostream>

View File

@@ -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) {
@@ -133,7 +138,7 @@ void Server::start(int steps, bool service_mode) {
if (service_mode) { if (service_mode) {
std::cout << "Service mode is ON" << std::endl; std::cout << "Service mode is ON" << std::endl;
} }
int new_socket; int new_socket;
if (listen(server_socket, MAX_CLIENTS) < 0) { if (listen(server_socket, MAX_CLIENTS) < 0) {

View File

@@ -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";