You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
cd /home/almusha/cppbackend/sprint2/problems/command_line/solution
Открывает итоговую папку решения
Можно проверять структуру
Посмотреть дерево проекта
tree -L 2
Показывает структуру проекта на глубину 2 уровня
Видно, что data и static находятся на месте
cd /home/almusha/cppbackend/sprint2/problems/command_line/solution
tree -L 2
Фактическая структура solution после подготовки
📌 Что проверено командой tree -L 2 в solution-папке задания command_line
📖 Что реально находится в проекте после копирования основы из time_control и замены data / static
🧠 Почему эта проверка важна перед сборкой и запуском сервера
✅ Итог
Корневые файлы проекта
В корне solution находятся CMakeLists.txt, Dockerfile, README.md, conanfile.txt, папки data, src, static
Это подтверждает, что проект содержит сборочные файлы, Dockerfile, документацию, зависимости, данные, исходный код и статику
Корень проекта готов
Папка data
В data лежит config.json
Этот файл передаётся серверу через параметр -c ../data/config.json или --config-file
Конфиг на месте
Папка src
В src находятся файлы сервера: main.cpp, http_server.cpp, request_handler.cpp, model.cpp, json_loader.cpp, logger.cpp, заголовки и вспомогательные файлы
Это подтверждает, что исходный код игрового сервера перенесён из предыдущего решения и готов к доработке под CLI
Исходники на месте
Папка static
В static находятся HTML, favicon, manifest, изображения, JavaScript и другие статические файлы
Эта папка передаётся серверу через параметр -w ../static или --www-root
Статика на месте
Проверка глубины 2
Команда tree -L 2 показывает структуру на два уровня
Этого достаточно, чтобы быстро убедиться, что основные файлы и каталоги находятся там, где нужно
Структура проверена
almusha@compute-vm-2-2-20-ssd-1775824473365:~/cppbackend/sprint2/problems/command_line/solution$ tree -L 2
.
├── CMakeLists.txt
├── Dockerfile
├── README.md
├── conanfile.txt
├── data
│ └── config.json
├── src
│ ├── boost_json.cpp
│ ├── http_server.cpp
│ ├── http_server.h
│ ├── json_loader.cpp
│ ├── json_loader.h
│ ├── logger.cpp
│ ├── logger.h
│ ├── main.cpp
│ ├── model.cpp
│ ├── model.h
│ ├── player_tokens.h
│ ├── players.h
│ ├── request_handler.cpp
│ ├── request_handler.h
│ ├── sdk.h
│ ├── tagged.h
│ └── use_cases.h
└── static
├── abc..html
├── about.html
├── android-chrome-192x192.png
├── android-chrome-512x512.png
├── apple-touch-icon.png
├── assets
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── file with spaces.html
├── game.html
├── game_old.html
├── images
├── index.html
├── js
└── site.webmanifest
---
## Поддержанные параметры командной строки
| 📌 Параметр командной строки игрового сервера | 📖 Полная форма и короткая форма | 🧠 Что задаёт параметр | ✅ Итог |
| --------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------- | ---------------------------------- |
| Help | `-h`, `--help` | Показывает справку по доступным параметрам | Help работает |
| Tick period | `-t`, `--tick-period milliseconds` | Задаёт период автоматического обновления игрового времени в миллисекундах | Автоматический tick настраивается |
| Config file | `-c`, `--config-file file` | Задаёт путь к JSON-конфигу игрового сервера | Конфиг передаётся через CLI |
| WWW root | `-w`, `--www-root dir` | Задаёт путь к папке статических файлов | Static root передаётся через CLI |
| Randomize spawn points | `--randomize-spawn-points` | Включает случайные точки появления собак | Random spawn включается параметром |
```text
-h, --help
-t, --tick-period milliseconds
-c, --config-file file
-w, --www-root dir
--randomize-spawn-points
Help
📌 Как проверить справку игрового сервера
💻 Команда
📖 Что должно быть в ожидаемом выводе
✅ Итог
Запуск help
./bin/game_server --help
Сервер должен вывести список разрешённых параметров: help, tick-period, config-file, www-root, randomize-spawn-points
Справка отображается
./bin/game_server --help
Ожидаемый вывод:
Allowed options:
-h [ --help ] produce help message
-t [ --tick-period ] milliseconds set tick period
-c [ --config-file ] file set config file path
-w [ --www-root ] dir set static files root
--randomize-spawn-points spawn dogs at random positions
Класс для автоматического обновления игрового времени
Ticker создаёт Boost.Asio steady_timer, ждёт заданный период, вызывает Application::Tick(delta), после срабатывания снова ставит таймер и работает внутри strand
Он нужен, чтобы игровой сервер мог сам обновлять состояние модели с заданным периодом
Автоматический tick реализуется через Ticker
📌 Действие Ticker
📖 Подробное описание
🧠 Практический смысл
✅ Итог
Создаёт steady_timer
Используется таймер Boost.Asio
Таймер позволяет выполнять действие через заданный период
Таймер создан
Ждёт заданный период
Период берётся из --tick-period
Например, 50 миллисекунд
Интервал задан
Вызывает Application::Tick(delta)
После ожидания вызывается обновление модели
Игровой мир делает шаг времени
Tick вызывается
Снова ставит таймер
После срабатывания таймер планируется заново
Обновление становится периодическим
Tick повторяется
Работает внутри strand
Все операции с моделью выполняются последовательно
Это защищает состояние игры
Потокобезопасность соблюдается
создаёт Boost.Asio steady_timer
ждёт заданный период
вызывает Application::Tick(delta)
после срабатывания снова ставит таймер
работает внутри strand
Почему используется strand
📌 Зачем нужен strand в игровом сервере
📖 Подробное объяснение проблемы
🧠 Что гарантирует strand
✅ Итог
Защита игрового состояния
strand нужен, чтобы обращения к игровому состоянию выполнялись последовательно
Если один поток обрабатывает API-запрос, а другой одновременно вызывает Tick, оба могут менять состояние игры
strand предотвращает одновременное изменение модели
Возможная гонка данных
Без strand один поток может обрабатывать API-запрос, а другой одновременно вызывать Tick
Оба потока меняют состояние игры одновременно
Возникает race condition
Последовательное выполнение
strand гарантирует, что такие операции не выполнятся одновременно
Операции с моделью идут одна за другой
Модель защищена
один поток обрабатывает API-запрос
другой поток одновременно вызывает Tick
оба меняют состояние игры
strand гарантирует, что такие операции не выполнятся одновременно.
Сборка
📌 Шаг сборки решения command_line
💻 Команда
📖 Что делает команда
✅ Итог
Перейти в solution
cd /home/almusha/cppbackend/sprint2/problems/command_line/solution
Запрет ручного /api/v1/game/tick в автоматическом режиме
Если сервер запущен с --tick-period, endpoint tick возвращает ошибку
Нельзя одновременно управлять временем вручную и автоматически
Поведение защищено
разбор командной строки через Boost.ProgramOptions
параметры --help, --tick-period, --config-file, --www-root
параметр --randomize-spawn-points
два режима работы игрового времени
автоматический Tick через Boost.Asio timer
запрет ручного /api/v1/game/tick в автоматическом режиме