Разработка мобильного приложения для шахмат (онлайн)
Шахматное приложение с онлайн-игрой — классическая задача с нетривиальными техническими решениями. Главная сложность не в рендере доски, а в синхронизации состояния партии между двумя клиентами в реальном времени с минимальной задержкой и корректной обработкой таймера.
WebSocket и синхронизация ходов
Ход должен отображаться у противника мгновенно. HTTP polling не подходит — нужен WebSocket. На iOS — URLSessionWebSocketTask (нативный, без зависимостей) или Starscream. На Android — OkHttp WebSocket. Для Flutter — web_socket_channel.
Протокол обмена: клиент отправляет ход в UCI-нотации (e2e4), сервер валидирует позицию, рассылает обновление обоим игрокам. Важно: клиент не доверяет себе в плане легальности хода — всю валидацию делает сервер. Иначе клиент с модифицированным приложением может делать нелегальные ходы.
// Android — отправка хода
webSocket.send(Json.encodeToString(MoveMessage(
gameId = currentGameId,
move = "e2e4",
remainingTimeMs = timerViewModel.whiteTimeMs
)))
Обработка разрыва соединения: при потере WebSocket клиент переходит на HTTP polling каждые 2 секунды, пытается реконнект с exponential backoff. Партия продолжается — игрок с плохим соединением не должен терять время автоматически.
Таймер: синхронизация без доверия клиенту
Таймер в онлайн-шахматах — источник споров. Если держать таймер только на клиенте, недобросовестный игрок может его замедлить. Правильная схема: сервер хранит white_remaining_ms и black_remaining_ms, обновляет при каждом ходе, отправляет актуальные значения клиентам. Клиент отображает таймер (анимация убывания), но не является источником истины.
При реконнекте клиент запрашивает текущее состояние партии и синхронизирует отображение таймера с сервером.
Рендер доски
Для нативных приложений: Canvas API (Android) или CAShapeLayer + CALayer (iOS) достаточны для рендера статичной доски. Анимация хода — перемещение ImageView/UIImageView с фигурой через ValueAnimator / UIView.animate.
В Flutter — популярный пакет flutter_chess_board как отправная точка, но его рендер не всегда удовлетворяет по производительности на старых устройствах. Кастомный CustomPainter с Canvas.drawImage для фигур даёт лучший контроль.
Фигуры — SVG, конвертированные в растровые изображения при разных разрешениях. Не PNG сразу — SVG позволяет перекрашивать фигуры для разных тем доски.
Шахматный движок для игры с AI
Для партии против компьютера нужен шахматный движок. Stockfish — стандарт индустрии, открытый, сильнейший. Для мобильного приложения:
-
iOS: Stockfish компилируется как C++ библиотека через SPM или как статический
.aфайл. UCI-протокол черезPipeв отдельномThread. Не на main thread — анализ позиции блокирует UI. -
Android: Stockfish через JNI или готовый wrapper
stockfish-android. -
Flutter:
stockfishпакет (wraps native library).
Глубина поиска управляется через UCI-команды: setoption name Skill Level value 10 (0–20 для разных уровней сложности), go movetime 1000 (время на ход в мс).
Матчмейкинг и рейтинг
Рейтинг Эло — стандарт. Формула простая, реализуется на сервере: newRating = oldRating + K * (score - expectedScore), где K = 32 для новых игроков, 16 для опытных.
Матчмейкинг: поиск соперника в диапазоне ±100 Эло с таймаутом расширения поиска каждые 10 секунд. Очередь в Redis Sorted Set, score = timestamp постановки в очередь, при поиске берём ближайшего по рейтингу из актуальных участников.
Ориентиры по срокам
Приложение с игрой против AI (Stockfish) без онлайн — 4–5 недель. С онлайн-игрой, таймером, матчмейкингом и рейтингом — 8–12 недель.







