Розробка мобільного додатка для шахмат (онлайн)
Шахматний додаток з онлайн-грою — класична задача з нетривіальними технічними рішеннями. Головна складність не в рендері дошки, а в синхронізації стану партії між двома клієнтами в реальному часі з мінімальною затримкою та правильною обробкою таймера.
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(обгортає нативну бібліотеку).
Глибина пошуку управляється через 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 тижнів.







