Привет! На связи команда Далее. В этой статье расскажем, как мы взяли довольно простую игру-тренажер по кибербезопасности и сделали ее самостоятельным продуктом с тремя отдельными консолями, редактором сценариев, ботами для их проверки и аудиочатом на WebRTC.
В чем суть игры
Игра, над которой мы работали — это тренинг для специалистов по кибербезопасности. Ранее его проводили в оффлайне, в формате настольной игры, а потом мы перевели его в диджитал-версию.
Игра состоит из нескольких ключевых сущностей:
-
атака — угроза со стороны злоумышленников , с которой предстоит справиться игроку согласно сценарию;
-
сценарий — набор атак и условий, по которым проходит каждая конкретная игра;
-
индустрия — отрасль экономики, в которой работает компания в текущем сценарии;
-
игровые карты — визуализация вариантов действий игрока на конкретном ходу исходя из текущих условий ;
-
сообщения — реакции системы на действия игроков, на основе которых игроки совершают последующие шаги;
-
геймборд — визуализация объектов и условий игры для игроков.
Какая была задача
Изначально архитектура игры выглядела так: один сервер, одна консоль, условия для каждой конкретной атаки и сценария жестко зашиты в код. Сложность состояла в отсутствии гибкости, ограниченном количестве сценариев и необходимости подключать разработчиков для любой новой фичи в игровом сценарии. Хотите добавить атаку? Делайте релиз. Хотите добавить карту, атаку, сценарий или любую другую сущность? Опять релиз.
При этом нагрузку система держала плохо. Если подключалось больше сотни человек, приходилось объединять все серверы в разных геозонах в один кластер. Иначе играть было невозможно.
Заказчик (а вместе с ним и мы) хотел гибкости и масштабируемости. Мы пришли к решению создать редактор сценариев — возможность редактировать симуляции без разработчиков и нормальную работу при большой нагрузке.
Что мы переделали в архитектуре
Мы решили радикально пересобрать систему. Архитектуру разнесли на три части: редакторскую, тренерскую и игровую консоли.
1. Редакторская консоль: конструктор сценариев с ботами
Центральным инструментом новой версии стал редактор. Он позволяет собрать сценарий игры как конструктор: выбрать индустрию, настроить инфраструктуру, прописать атаки и карточки для их отражения, задать последствия ходов.
Сценарий сохраняется в виде большого JSON-объекта с возможностью версионирования, а также наследования сценариев — возможность создавать форки сценариев на базе существующих.

Чтобы не проверять руками все возможные ветки, мы сделали ботов. Они проходят игру в разных комбинациях, проверяют условия и подсказывают, где ошибка. Боты также умеют показывать «идеальный сценарий» и худший вариант развития событий. Это сильно упростило жизнь редакторам.
2. Тренерская панель: управление командами и оптимальные сценарии
У каждой игры есть модератор — тренер. Для тренеров мы сделали отдельное SPA. Там можно запускать симуляции, управлять ходами, менять капитанов команд, следить за процессом и общаться с игроками.
Фишка, которая зашла лучше всего — генерация «идеального сценария» после игры. Тренер может показать участникам оптимальные шаги и обсудить, где они допустили ошибки.
Одной из самых востребованных функций стала автоматическая генерация «идеального сценария» по завершении игровой сессии. Этот инструмент позволяет тренеру наглядно продемонстрировать участникам оптимальную последовательность действий и разобрать допущенные ошибки на конкретных этапах.

С технической точки зрения — это автоматизированный обход дерева решений на стороне тренерского бэкенда. Система анализирует граф всех возможных состояний игры, вычисляя веса для каждой ветки развития событий. На основе этих данных алгоритм определяет «золотой путь» (golden path) — последовательность ходов для достижения максимального результата по заданным целевым показателям: например, минимизация ущерба инфраструктуре при сохранении высокой доходности предприятия.

3. Игровая консоль: Golang + WebRTC
Игровой сервер вынесли отдельно и написали его на Golang. Этот инструмент мы выбрали из-за высокой производительности, эффективной работы с конкурентностью (горутины) и экономичного потребления памяти, что было критично для удержания состояния игры при высоких нагрузках. Он общается с браузерами через Centrifugo по веб-сокетам и держит в памяти состояние игры. В итоге один сервер спокойно обслуживает сотни команд и тысячи игроков.
Фронтенд переписали на Vue.js и добавили несколько важных вещей:
-
встроенный аудиочат (на PION Ion SDK), который умеет работать в двух режимах: командный конф-колл и тренерский стрим, где говорит только тренер;
-
авторизацию по email и через уникальные ссылки;
-
«открытую игру», где команды собираются автоматически, без ручной настройки;
-
инфраструктуру как отдельную сущность: на объектах геймборда расположены лампочки, которые меняют цвета в зависимости от выполнения условий игроками и статуса атаки: объект под атакой — лампочка загорается красным, вне атаки — зеленым;
-
возможность отменить ход в течение пары минут.
Статистика для оценки результатов
Мы сделали отдельный сервер статистики, который собирает и анализирует несколько показателей:
-
измеряемые показатели: количество команд, которые сыграли в игру, уровни, полученный командой, бонусные баллы;
-
вычисляемые: худший и идеальный сценарий, приемлемый и наибольший доход при отражении атаки, количество карт, связанных с атакой, средний результат в выборке за одну игру, количество команд, которые получили наибольший доход при отражении атаки и другие.
На основе собранных данных генерируются отчеты в разных разрезах:
-
индивидуальный отчет команды, доступный после завершения игры;
-
отчеты по играм всех команд;
-
сводные отчеты с выборкой по индустрии, периодам, сценариям, атакам, доступные администратору.
Сервер статистики позволяет сравнивать результаты команд между собой. Игроки получают свои данные сразу после симуляции, тренеры видят динамику по сценариям, а администраторы — сводные отчеты по индустриям и периодам.
Какие технические решения использовали
-
Ядро бизнес-логики и панели (редакторскую и тренерскую) мы сделали на Symfony.
-
Игровой сервер написали на Golang, потому что нужна была высокая производительность и работа «в памяти».
-
Для real-time взаимодействия игроков и тренеров подключили Centrifugo: это позволило игре «выдерживать» одновременное подключение тысяч пользователей.
-
Фронтенд унифицировали на Vue.js — так проще сопровождать.
-
Результат — система работает стабильно в трех геозонах (Европа, США, Азия), каждая сама по себе и без плясок с кластерами. Выдерживает единовременное подключение более 500 команд.
Итог
На MVP у нас ушло около восьми месяцев, а полный цикл разработки занял почти два года. В проекте участвовали пять человек: два PHP-разработчика, два фронтендера и один Golang-разработчик, он же тимлид.
Итоговая версия стала быстрее, гибче и удобнее. Сценарии теперь живут вне кода, нагрузку сервер держит без проблем, тренеры получили инструменты для управления и анализа, а игроки — более интересный и технологичный процесс.
В общем, из относительно простой симуляции мы сделали полноценный обучающий продукт, который можно масштабировать и расширять как угодно.
ссылка на оригинал статьи https://habr.com/ru/articles/1059524/