Compare commits
2 Commits
f0c7bb3f18
...
8823945938
| Author | SHA1 | Date | |
|---|---|---|---|
| 8823945938 | |||
| 4402bbfe3f |
@@ -12,7 +12,7 @@
|
|||||||
Клиент должен работать по разработанному сетевому протоколу.
|
Клиент должен работать по разработанному сетевому протоколу.
|
||||||
|
|
||||||
## Разработанное приложение
|
## Разработанное приложение
|
||||||
Реализация [сервера на основе многопоточности](doc/multiprocess_echo_server.md) и клиента эхо-приложения.
|
Реализация [сервера на основе многопоточности](doc/multithread_maze_server.md) и клиента эхо-приложения.
|
||||||
|
|
||||||
## Требования
|
## Требования
|
||||||
Для сборки и запуска необходима Unix-система и компилятор C++ с поддержкой стандарта c++23.
|
Для сборки и запуска необходима Unix-система и компилятор C++ с поддержкой стандарта c++23.
|
||||||
|
|||||||
@@ -6,10 +6,14 @@ UML-диаграмма протокола пользовательского у
|
|||||||

|

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

|
||||||
|
|
||||||
|
Клиент отправляет команды движения ("вперёд", "направо", "налево", "назад") или команду "сдаюсь" для завершения игры. Сервер обрабатывает команды, проверяет возможность хода, обновляет состояние лабиринта и отправляет клиенту текстовый ответ с результатом хода, количеством оставшихся ходов и текущей позицией (в формате координат). Игра завершается, если игрок достигает конечной точки (позиция 8), исчерпывает ходы или сдаётся.
|
||||||
|
|
||||||
|
|
||||||
### Запуск сервера
|
### Запуск сервера
|
||||||
Приложение сервера при запуске принимает следующие необязательные ключи:
|
Приложение сервера при запуске принимает следующие необязательные ключи:
|
||||||
@@ -37,8 +41,10 @@ UML-диаграмма протокола пользовательского у
|
|||||||
Если игрок исчерпал все ходы, но не дошёл до финиша, он считается проигравшим. Финиш находится в позиции (2, 2) (координаты x, y).
|
Если игрок исчерпал все ходы, но не дошёл до финиша, он считается проигравшим. Финиш находится в позиции (2, 2) (координаты x, y).
|
||||||
|
|
||||||
### Запуск клиента
|
### Запуск клиента
|
||||||
Приложение клиента при запуске принимает три необязательных ключа `-h`, `-p` и `-n` с параметрами.
|
Приложение клиента при запуске принимает два необязательных ключа:
|
||||||
Ключи `-h` и `-p` задают сетевой адрес (название хоста и номер порта соответственно) сервера для подключения.
|
- `-h` — задаёт имя хоста сервера для подключения;
|
||||||
|
|
||||||
|
- `-p` — задаёт номер порта сервера.
|
||||||
```bash
|
```bash
|
||||||
./maze_client -h localhost -p 1024
|
./maze_client -h localhost -p 1024
|
||||||
```
|
```
|
||||||
|
|||||||
4
doc/numeration_maze.svg
Normal file
4
doc/numeration_maze.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 29 KiB |
@@ -22,8 +22,8 @@ private:
|
|||||||
void handle_client(int socket, bool flag, int steps);
|
void handle_client(int socket, bool flag, int steps);
|
||||||
bool check_status(Maze& maze);
|
bool check_status(Maze& maze);
|
||||||
public:
|
public:
|
||||||
Server(const std::string& host, const unsigned short port, bool service_flag);
|
Server(const std::string& host, const unsigned short port);
|
||||||
void start(int steps = 10);
|
void start(int steps, bool service_flag);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -4,12 +4,7 @@ bool Server::check_status(Maze &maze) {
|
|||||||
return (!maze.test_mode && maze.get_moves_left() > 0);
|
return (!maze.test_mode && maze.get_moves_left() > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Server::Server(const std::string& h, const unsigned short p, bool _service){
|
Server::Server(const std::string& h, const unsigned short p){
|
||||||
service_mode = _service;
|
|
||||||
if (service_mode) {
|
|
||||||
std::cout << "Service mode is ON" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
sockaddr_in server_address;
|
sockaddr_in server_address;
|
||||||
|
|
||||||
if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||||||
@@ -134,7 +129,11 @@ void Server::handle_client(int client_socket, bool mode, int steps) {
|
|||||||
std::cout << "Игрок " << player_name << " отключился" << std::endl;
|
std::cout << "Игрок " << player_name << " отключился" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::start(int steps) {
|
void Server::start(int steps, bool service_mode) {
|
||||||
|
if (service_mode) {
|
||||||
|
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) {
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Server server(host, port, service_mode);
|
Server server(host, port);
|
||||||
server.start(steps);
|
server.start(steps, service_mode);
|
||||||
} catch (const std::runtime_error& e){
|
} catch (const std::runtime_error& e){
|
||||||
std::cerr << "Server application error: " << e.what() << std::endl;
|
std::cerr << "Server application error: " << e.what() << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user