Найти в Дзене
Константин Чалых

Как я создавал «Шашки Онлайн»: от идеи до публикации в RuStore

В начале 2025 года я задался целью: создать мультиплатформенную игру в шашки, которая будет работать в VK, Telegram, как обычный веб-сайт и как нативное Android-приложение. Хотелось, чтобы можно было играть и с ИИ, и с живыми людьми, а вся статистика сохранялась. Проект получил название «Шашки Онлайн», и сегодня он доступен в RuStore.
В этой статье я хочу поделиться не просто готовым результатом,
Оглавление

В начале 2025 года я задался целью: создать мультиплатформенную игру в шашки, которая будет работать в VK, Telegram, как обычный веб-сайт и как нативное Android-приложение. Хотелось, чтобы можно было играть и с ИИ, и с живыми людьми, а вся статистика сохранялась. Проект получил название «Шашки Онлайн», и сегодня он доступен в RuStore.

В этой статье я хочу поделиться не просто готовым результатом, а самим процессом разработки — с архитектурными решениями, технологическим стеком, проблемами, с которыми столкнулся, и планами на будущее.

Приложение доступно в нескольких форматах:

Идея и первые шаги

С самого начала я решил, что игра должна быть мультиплатформенной. Это означало, что нужно поддерживать четыре среды:

  • VK Mini App — через VK Bridge https://vk.com/app53936365
  • Telegram WebApp — через Telegram API https://t.me/Shashkionline_bot
  • Обычный Web — с традиционной авторизацией
  • Android-приложение — нативное, с возможностью играть офлайн и онлайн

Это определило архитектуру: клиент-сервер с единым бэкендом, но разными точками входа на фронтенде. Для Android-версии я использовал WebView, который загружает веб-интерфейс, но с дополнительными нативными функциями (уведомления, работа с файлами для аватаров).

Архитектура проекта

Проект построен на гибридной архитектуре:

  • PHP 7.4+ на сервере — обрабатывает API-запросы, работает с MySQL.
  • JavaScript (ES6+) на клиенте — вся игровая логика, отрисовка доски, взаимодействие с пользователем.
  • Firebase — для realtime-синхронизации в онлайн-играх и хранения данных обучения ИИ.
  • Android (Java/Kotlin) — обертка для WebView с нативными функциями.

Структура папок сложилась такая:

text

shashki/

├── app/ # Основное приложение

│ ├── api/ # REST API (users, games, sync)

│ ├── classes/ # PHP классы

│ ├── js/ # JavaScript модули (CheckersGame.js, CheckersAI.js, online-game.js)

│ ├── css/ # Стили

│ ├── checkers/ # Игровой движок (устаревшее, но оставил для истории)

│ └── config.php # Конфигурация (базы, ключи, настройки)

├── android/ # Нативный Android проект

│ ├── app/ # Код Android-приложения

│ └── build.gradle # Сборка

├── index.php # Главная страница (точка входа)

├── online_game.php # Страница онлайн-игры

└── docs/ # Подробная документация, включая этот анализ

Базы данных: MySQL + Firebase

Одно из ключевых решений — использовать две базы данных:

  • MySQL — основное хранилище. Здесь хранятся пользователи, игры, приглашения, рейтинги. Все сложные запросы и транзакции — тут.
  • Firebase Realtime Database — для всего, что требует скорости: онлайн-статусы, активные игры, ходы в реальном времени. А также для хранения статистики обучения ИИ.

Почему Firebase для обучения ИИ?

ИИ в игре не статичен. Он использует минимакс с альфа-бета отсечением, но этого мало. Я добавил систему самообучения: каждая сыгранная партия (с согласия пользователя) анализируется. Информация о том, какие ходы в каких позициях привели к победе или поражению, сохраняется в Firebase. При следующем запуске ИИ подгружает эту статистику и адаптирует свою стратегию под стиль игры конкретного соперника.

Это оказалось удобно: Firebase сам обеспечивает синхронизацию, масштабирование и доступность данных между сессиями и устройствами.

Универсальная авторизация

Самым сложным было сделать единую систему авторизации для всех платформ. Я написал модуль universal-auth.js, который автоматически определяет платформу по параметрам запроса и вызывает нужный метод:

  • В VK — через vkBridge.send('VKWebAppGetUserInfo')
  • В Telegram — через Telegram.WebApp.initDataUnsafe
  • В Web — через Firebase Auth
  • В Android — через кастомный интерфейс, который передает данные из нативного приложения в WebView

В MySQL таблица users хранит user_id (уникальный идентификатор в формате {platform}_{id}), platform, и все стандартные поля профиля. Это позволяет легко связывать пользователя независимо от того, откуда он зашел.

Игровой движок и ИИ

Сердце игры — класс CheckersGame в файле app/js/CheckersGame.js. Он отвечает за:

  • Инициализацию доски 8x8
  • Проверку правил (обязательные взятия, превращение в дамки)
  • Обработку ходов
  • Определение победителя

ИИ реализован в CheckersAI.js. Алгоритм — классический минимакс с альфа-бета отсечением. Глубина поиска зависит от уровня сложности:

  • Легкий: глубина 2
  • Средний: глубина 3
  • Сложный: глубина 4-5

Оценочная функция учитывает:

  • Количество шашек и дамок (вес 100)
  • Контроль центра (вес 10)
  • Продвижение к дамке (вес 5)
  • Безопасность у краев (вес 3)
  • Мобильность (количество возможных ходов)

Онлайн-игра и синхронизация

Класс OnlineGameManager (файл online-game.js) управляет мультиплеером. Когда игрок создает игру или присоединяется к ней, запись появляется в Firebase. Ходы записываются туда же, и оба клиента получают обновления в реальном времени через Firebase listeners.

Параллельно данные дублируются в MySQL для истории и статистики. Это создает нагрузку, но обеспечивает надежность.

Нативное Android-приложение

Для публикации в RuStore потребовалось создать нативную оболочку. Я использовал простой, но эффективный подход:

  • WebView загружает веб-версию игры
  • Добавлен интерфейс для обмена данными между JavaScript и нативным кодом (через addJavascriptInterface)
  • Реализованы нативные функции: выбор аватара из галереи, уведомления о ходе соперника
  • Сборка APK для Android 7+ (API level 24)

Приложение прошло модерацию RuStore и теперь доступно для скачивания всем желающим. Размер APK — 45.7 МБ, поддерживаются все современные устройства.

Что пошло не так: проблемы и уязвимости

Ни один проект не идеален. В ходе разработки и последующего анализа я выявил несколько проблем:

Критические

  1. Открытый CORS — в коде было разрешено все. Срочно ограничил списком доверенных доменов.
  2. Секреты в конфиге — раньше хранились прямо в коде. Теперь все ключи и пароли вынесены в переменные окружения.
  3. Отсутствие CSRF-защиты. В конфиге csrf_protection: true, но реально она не реализована — исправляю.

Средние

  1. Неполная серверная валидация. В файле app/api/games.php функции applyMoveToBoard(), checkGameEnd(), determineWinner() — пока заглушки. Вся логика пока на клиенте, что небезопасно.
  2. Нет rate limiting. В конфиге настройки есть, но в коде не реализованы. Это делает API уязвимым для DDoS.
  3. Дублирование кода. Похожие куски кода встречаются в разных местах — нужно выносить в классы.

Планы по улучшению

На основе этого анализа я составил план:

Безопасность (высший приоритет)

  • ✅ Ограничить CORS конкретными доменами.
  • ✅ Перевести все секреты в переменные окружения.
  • ⬜ Реализовать CSRF-защиту.
  • ⬜ Добавить rate limiting через middleware.

Производительность

  • ⬜ Внедрить Redis для кэширования частых запросов.
  • ⬜ Оптимизировать SQL-запросы, добавить индексы.
  • ⬜ Сделать синхронизацию Firebase-MySQL асинхронной, через очередь.

Завершение логики

  • ⬜ Перенести полную валидацию ходов на сервер.
  • ⬜ Реализовать функции проверки окончания игры и определения победителя на сервере.

Тестирование

  • ⬜ Написать unit-тесты для критических функций (игровая логика, API).
  • ⬜ Добавить интеграционные тесты.

Что дальше?

Проект «Шашки Онлайн» — это не просто готовая игра, а живая платформа, которая будет развиваться. В ближайших планах:

  • Улучшить ИИ, увеличив глубину поиска и добавив обучение на основе сыгранных партий.
  • Добавить систему друзей и личные сообщения.
  • Запустить турниры и лиги с рейтинговой системой.
  • Оптимизировать Android-версию, добавить push-уведомления.

Итог

Разработка «Шашек» дала мне огромный опыт:

  • Построение мультиплатформенной архитектуры (Web + VK + Telegram + Android).
  • Интеграция с Firebase для realtime и машинного обучения.
  • Осознание важности безопасности и тестирования на ранних этапах.
  • Работа с RuStore как с платформой дистрибуции.

Исходный код проекта закрыт, но я делюсь опытом и наработками в блоге. Если у вас есть вопросы или вы хотите обсудить сотрудничество — заходите на Chalykh.ART.

Хотите создать своё приложение или улучшить существующее? На Chalykh.ART мы помогаем на всех этапах: от идеи до публикации и поддержки.