В начале 2025 года я задался целью: создать мультиплатформенную игру в шашки, которая будет работать в VK, Telegram, как обычный веб-сайт и как нативное Android-приложение. Хотелось, чтобы можно было играть и с ИИ, и с живыми людьми, а вся статистика сохранялась. Проект получил название «Шашки Онлайн», и сегодня он доступен в RuStore.
В этой статье я хочу поделиться не просто готовым результатом, а самим процессом разработки — с архитектурными решениями, технологическим стеком, проблемами, с которыми столкнулся, и планами на будущее.
Приложение доступно в нескольких форматах:
- Нативное Android-приложение (APK для Android 7+) — опубликовано в RuStore: https://www.rustore.ru/catalog/app/ru.shashki.chalykk
- Веб-версия доступна по адресу: https://chalykh.art/shashki/h — доступна по адресу
- VK Mini App https://vk.com/app53936365 и Telegram WebApp 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 МБ, поддерживаются все современные устройства.
Что пошло не так: проблемы и уязвимости
Ни один проект не идеален. В ходе разработки и последующего анализа я выявил несколько проблем:
Критические
- Открытый CORS — в коде было разрешено все. Срочно ограничил списком доверенных доменов.
- Секреты в конфиге — раньше хранились прямо в коде. Теперь все ключи и пароли вынесены в переменные окружения.
- Отсутствие CSRF-защиты. В конфиге csrf_protection: true, но реально она не реализована — исправляю.
Средние
- Неполная серверная валидация. В файле app/api/games.php функции applyMoveToBoard(), checkGameEnd(), determineWinner() — пока заглушки. Вся логика пока на клиенте, что небезопасно.
- Нет rate limiting. В конфиге настройки есть, но в коде не реализованы. Это делает API уязвимым для DDoS.
- Дублирование кода. Похожие куски кода встречаются в разных местах — нужно выносить в классы.
Планы по улучшению
На основе этого анализа я составил план:
Безопасность (высший приоритет)
- ✅ Ограничить CORS конкретными доменами.
- ✅ Перевести все секреты в переменные окружения.
- ⬜ Реализовать CSRF-защиту.
- ⬜ Добавить rate limiting через middleware.
Производительность
- ⬜ Внедрить Redis для кэширования частых запросов.
- ⬜ Оптимизировать SQL-запросы, добавить индексы.
- ⬜ Сделать синхронизацию Firebase-MySQL асинхронной, через очередь.
Завершение логики
- ⬜ Перенести полную валидацию ходов на сервер.
- ⬜ Реализовать функции проверки окончания игры и определения победителя на сервере.
Тестирование
- ⬜ Написать unit-тесты для критических функций (игровая логика, API).
- ⬜ Добавить интеграционные тесты.
Что дальше?
Проект «Шашки Онлайн» — это не просто готовая игра, а живая платформа, которая будет развиваться. В ближайших планах:
- Улучшить ИИ, увеличив глубину поиска и добавив обучение на основе сыгранных партий.
- Добавить систему друзей и личные сообщения.
- Запустить турниры и лиги с рейтинговой системой.
- Оптимизировать Android-версию, добавить push-уведомления.
Итог
Разработка «Шашек» дала мне огромный опыт:
- Построение мультиплатформенной архитектуры (Web + VK + Telegram + Android).
- Интеграция с Firebase для realtime и машинного обучения.
- Осознание важности безопасности и тестирования на ранних этапах.
- Работа с RuStore как с платформой дистрибуции.
Исходный код проекта закрыт, но я делюсь опытом и наработками в блоге. Если у вас есть вопросы или вы хотите обсудить сотрудничество — заходите на Chalykh.ART.
Хотите создать своё приложение или улучшить существующее? На Chalykh.ART мы помогаем на всех этапах: от идеи до публикации и поддержки.