Игровой backend-сервер на C++20 с REST API, таймерной игровой моделью и хранением результатов в PostgreSQL.
Игрок подключается к игровой карте, управляет персонажем, получает очки за игровой процесс, а после периода бездействия автоматически завершает игровую сессию с сохранением результата в таблицу рекордов.
- подключение игрока;
- получение состояния игры;
- управление движением;
- игровые тики;
- получение таблицы рекордов.
- карты и дороги;
- ограничение перемещения;
- генерация предметов;
- начисление очков.
- хранение результатов в PostgreSQL;
- пул соединений;
- пагинация таблицы рекордов.
- автоматическое завершение неактивных игроков (
dogRetirementTime); - сериализация и восстановление состояния сервера.
- C++20
- Boost.Asio
- Boost.Beast
- Boost.JSON
- Boost.Log
- PostgreSQL
- libpqxx
- CMake
- Conan
- Docker
- Catch2
Проект реализован в виде многослойной архитектуры:
HTTP Request
↓
API Layer
(api_handler)
↓
Application Layer
(игровые сценарии)
↓
Domain Layer
(карты, игроки, лут, игровая логика)
↓
Persistence Layer
(PostgreSQL + connection pool)
Основные компоненты:
application.*— бизнес-логика игровых сценариев;model.*— доменная модель: карты, игроки, движение, предметы;api_handler.*— обработка HTTP API;request_handler.*,http_server.*— транспортный слой;retirement_db.*,connection_pool.h— работа с PostgreSQL;serializing_listener.*— сериализация и восстановление состояния.
- CMake >= 3.11
- Conan 1.x
- Компилятор с поддержкой C++20
mkdir build
cd build
conan install .. --build=missing \
-s build_type=Release \
-s compiler.libcxx=libstdc++11
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build ../game_server -c ../data/config.json -w ../staticexport GAME_DB_URL="postgres://user:password@host:5432/dbname"
./game_server -c ../data/config.json -w ../staticdocker build -t game-backend .docker run --rm -p 8080:8080 \
-e GAME_DB_URL="postgres://user:password@host:5432/dbname" \
game-backend| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/game/join |
Подключение игрока |
| GET | /api/v1/game/state |
Получение состояния игры |
| POST | /api/v1/game/player/action |
Действия игрока |
| POST | /api/v1/game/tick |
Игровой тик |
| GET | /api/v1/game/records?start=0&maxItems=100 |
Получение таблицы рекордов |
- REST API с Bearer-авторизацией;
- игровая модель с таймерной логикой;
- автоматический retirement игроков;
- хранение результатов в PostgreSQL;
- пул соединений с БД;
- пагинация рекордов;
- сериализация состояния сервера;
- модульная многослойная архитектура.