Собствен продукт · Игра и учене на шах

Шахматна платформа, изградена от първия ход.

chessGM е безплатно шахматно приложение: онлайн партии на живо, ботове, които играят като хора, пълен анализ на партии с гласов треньор, задачи с рейтинг и курсове – на английски, бенгалски и хинди. Шахматния двигател, сървъра, приложенията и гласовата услуга написахме сами и ги поддържаме на собствена инфраструктура.

На живо в мрежата и в Google Play (Android). Приложението за iOS е в преглед при Apple: идва скоро в App Store.

  • Web (PWA)
  • Android
  • iOS
  • iPadOS
задачи с рейтинг, всяка проверена от двигател
15 200
курса и път, който започва от нулата
60
Elo срещу Stockfish 19, ограничен до 3000 (200 партии; по скалата на Stockfish)
+164
p99 при запис на ход в тест на натоварването с 2 500 едновременни партии
3 ms

Вътре в приложението

Истински екрани от работещото приложение, както се виждат в описанията в магазините.

Какво получават играчите

  • Онлайн игра на живо

    Бързо намиране на противник в буллет, блиц, рапид и класически контрол, с рейтинг или без, със сървърни часовници, рейтинг Glicko-2, приятели, покани, съобщения и наблюдение на партии.

  • Ботове, които играят като хора

    13 оригинални героя и ботове по мотиви от публичните партии на известни играчи (без връзка с тях). Всеки прави грешките, които би направил човек с неговия рейтинг.

  • Анализ на партия с треньор

    Стрелки за груби грешки върху дъската, „See the line“ с говорими стъпки, значки за оценка на ходовете и панел на треньора, който обяснява защо. Точността е калибрирана по 739 публични партии от chess.com (типична разлика около 4 пункта), а оценките на ходовете са нагласени спрямо Game Review на chess.com. Без връзка с chess.com.

  • Задачи и Puzzle Rush

    Около 15 200 задачи с рейтинг, с теми, подсказки и задача на деня. Puzzle Rush за 3 мин, 5 мин и Survival, плюс онлайн Rush Battle със собствен рейтинг.

  • Курсове с интервално повторение

    30 курса по дебюти с по около 50 варианта, 30 по тактика, курсове по миттелшпил и ендшпил и път за начинаещи от рейтинг 200. Всеки вариант е проверен от двигател и се преговаря с FSRS.

  • Треньор, който обяснява и говори

    Нашият шахматен двигател и правила за обяснение, а не чатбот, пишат какво е намерено, какво е пропуснато и защо един ход е лош – на английски, бенгалски и хинди. Гласова услуга с гласови модели с отворен код го изговаря; гласовете са машинно генерирани. Не се вика никаква външна AI услуга.

  • Работи офлайн и може да ви известява

    Задачите, ботовете, партиите за двама и дъската за анализ работят офлайн в уебсайта и в приложението за Android. Известията от сайта работят в браузъри за компютър и Android, а на iPhone – след добавяне на сайта на началния екран.

  • Безплатно, с дневни лимити и съгласие

    Без покупки в приложението. Някои функции имат безплатни дневни лимити (10 подсказки, 3 дълбоки анализа, 3 обаждания, 3 партии с гласов чат), а наградена реклама в приложенията добавя още по една от всяка. Новите играчи започват без реклами, а рекламите следват избора за съгласие на играча (персонализирани реклами само със съгласие). Влизате с Google, Apple или имейл и изтривате профила си в приложението.

  • Победете ботовете стъпало по стъпало

    Стълбица от 13 тренировъчни бота – от най-лесния до най-трудния, с наше собствено ръководство за всеки, партньори за упражнения, анализ на партии, поставени като текст, задачи от вашите грешки и запазен напредък. Никога не се свързва с чужди ботове.

  • Научете как да победите противника си

    Въведете потребителско име от chess.com: браузърът ви чете последните публични партии на този играч от публичния API на chess.com, а chessGM ги превръща в план със стъпки и напомняния. Без връзка с Chess.com.

  • Гласов чат и обаждания

    Само глас, без видео. Звукът отива директно между двете устройства (през релей само когато директна връзка не е възможна); нашият сървър предава само съобщенията за установяване на връзката и нищо не се записва или съхранява. Безплатно всеки ден: 3 партии с гласов чат и 3 приети обаждания.

  • Дъски и фигури

    Собствени комплекти фигури и дъски на chessGM, плюс четири премиум комплекта с оригинални рисунки: Ebony & Boxwood, Royal Gold, Marble и Crystal. Всички са безплатни; „Premium“ е само етикет.

Изградено от нулата

Всеки слой е наш – от правилата на играта до сървъра, на който работи.

  1. Един Go сървър

    Един-единствен Go изпълним файл обслужва HTTP API и WebSocket центъра и управлява часовниците на партиите, подбора на противници, флот от 1200 акаунта на вътрешни ботове (винаги означени като ботове), както и двигателите за задачи и курсове.

    • Go
    • WebSocket
    • SQLite (WAL)
    • Glicko-2
  2. Собствен шахматен двигател

    Генериране на ходове с битбордове, проверено с perft, и търсене с алфа-бета, всичко написано на Go. Пълната сила добавя малка невронна мрежа (NNUE), която обучихме сами, главно върху отворените оценки на lichess, като някои позиции са оценени от Stockfish като учител; не се ползват тежести от мрежи на други двигатели. Измерва се на около 3160 по скалата UCI_Elo на Stockfish 19 (мачове от 200 партии при 10+0,1, една нишка; предишният двигател измерваше 2840) – скала, която не е нито Elo на ФИДЕ, нито на сайт. По-новите версии са още по-силни. Същият двигател работи на сървъра с по-голяма мрежа и, компилиран до WebAssembly, в браузъра и приложенията с по-малка. Анализът на партии, треньорът и по-слабите ботове ползват по-ранния замразен двигател, затова техните числа остават непроменени.

    • Go
    • Bitboards
    • NNUE
    • WebAssembly
  3. Уеб приложение

    Статично SvelteKit приложение на TypeScript, със service worker за офлайн игра и езици, които се зареждат само при нужда.

    • SvelteKit
    • TypeScript
    • Service worker
    • PWA
  4. Приложения за iOS и Android

    Приложения с Capacitor с вграден вход, реклами със съгласие, известия, вградено говорене и офлайн копие на приложението, включено във версията за iOS.

    • Capacitor
    • AdMob
    • Firebase Cloud Messaging
    • APNs
  5. Гласова услуга

    Услуга за синтез на реч на Go с малък помощник на C върху sherpa-onnx, която пуска отворени невронни гласови модели и кешира казаното. Същите модели работят и в браузъра.

    • Go
    • C
    • sherpa-onnx
    • onnxruntime-web
  6. Гласов чат и обаждания

    Peer-to-peer WebRTC аудио между двете устройства, с релей, когато директният път е блокиран. Сървърът само предава съобщенията за установяване на връзката и отчита безплатните дневни лимити.

    • WebRTC
    • TURN

Операции

Поддържаме сървърите сами

Без услуга за бекенд на играта по средата: наш собствен сървър, наши собствени внедрявания, наш собствен мониторинг.

  • Един самостоятелно управляван Linux сървър зад nginx и Cloudflare, с TLS от край до край
  • Сървърът на играта работи като systemd услуга; WebSocket връзките минават през nginx
  • Внедряване с една команда: изграждане, качване на издание с времеви печат, превключване, проверка на състоянието и запазване на старите издания за мигновено връщане назад
  • Много внедрявания на ден, всяко се превключва за секунди, със страница за изчакване по време на рестарта
  • SQLite в режим WAL с нощни резервни копия
  • Content Security Policy, IP адреси на клиенти, на които се вярва само от Cloudflare, отказ на записи между различни източници, ограничения на WebSocket заявките

Трудни проблеми, които решихме

Частите, които играчите никога не виждат, с числата, които измерихме.

  1. Запис на всеки ход, без да се забавя играта

    Проблемът
    При натоварване записът на всеки ход направо в базата данни вдигаше най-бавните записи до около 100 ms.
    Какво направихме
    Ходовете се събират на пакети и се записват зад играта на всеки 250 ms, в SQLite с режим WAL, докато часовниците остават на сървъра.

    Резултат p99 при запис на ход от около 100 ms → 3 ms с 2 500 едновременни партии в тест на натоварването. Заявка за профил 17 ms → 1,1 ms.

  2. Точност, на която играчите могат да вярват

    Проблемът
    Играчите сравняват резултата си за точност с числата, които вече познават от големите шахматни сайтове.
    Какво направихме
    Калибрирахме модела си за точност по 739 реални партии спрямо публикуваните резултати на chess.com (без връзка с тях) и го тествахме върху партии, които не беше виждал.

    Резултат Типична разлика от около 4 пункта точност върху отделени партии, с корелация 0,9. Оценките на ходовете съвпадат с тези на chess.com точно в около половината случаи, а броят им е близък.

  3. Задачи с точно един отговор

    Проблемът
    Задача с два добри отговора или такава, която вече е виждана като огледален образ, изглежда повредена на играча.
    Какво направихме
    Генерираме задачите сами от самостоятелна игра на двигателя и партии на модел на човек. Дълбоко търсене на двигателя доказва, че всеки ход на решаващия е единственият, а дубликатите се премахват, включително огледалните по цвят и по дъска.

    Резултат Около 15 200 задачи с рейтинг, от които около 4 900 нови от последното пускане.

  4. Офлайн на iPhone, а рекламите работят

    Проблемът
    Уеб изгледът на Apple позволява офлайн service worker само с домейни, свързани с приложението, а те чупят AdMob.
    Какво направихме
    Следващата версия за iOS носи собствено офлайн копие на уеб приложението, с вградено споделено хранилище, което се синхронизира, когато връзката се върне.

    Резултат Пълна офлайн игра на iOS за +0,06 MB размер на приложението, в следващата версия за магазина.

  5. Бързо и при бавни мрежи

    Проблемът
    Много от играчите ни са на мобилни данни, а страницата за анализ подскачаше, докато се зареждаше.
    Какво направихме
    Статична сборка, езици, зареждани при поискване, резервирано място за всяка дъска и панел и кеш чрез service worker.

    Резултат Първо съдържателно изобразяване от 2,8 s → 1,0 s при бавно 4G. Изместване на оформлението на страницата за анализ 0,81 → 0.

  6. Резултати, които никой не може да фалшифицира

    Проблемът
    Класациите подканят към измама, когато телефонът решава кое е верен отговор и колко време е отнело.
    Какво направихме
    Отговорите в Puzzle Rush се проверяват на сървъра и се засичат по часовника на сървъра. Ако в рамките на 5 секунди не се намери човек, в Rush Battle влиза вътрешен бот, който решава със скорост и точност, моделирани по рейтинга му.

    Резултат Честни класации и ботове, които почти не натоварват процесора: ботовете в Rush симулират решаването, вместо да пускат двигателя, а ходът на бот в партия отнема няколко милисекунди.

  7. Двигател с невронна мрежа без ферма от графични карти

    Проблемът
    По-силният двигател трябваше да работи в браузър и на един малък сървър, а за обучението имахме един Mac и никакъв GPU клъстер.
    Какво направихме
    Обучихме малка NNUE мрежа върху отворените оценки на lichess (повече данни бяха най-големият лост: 10M, 20M и 94M позиции дадоха +111 и после +99 Elo), обновявахме я ход по ход вместо да я преизчисляваме и написахме бърз код за процесорите на сървъра, сверен бит по бит с обикновената версия. Промяна излиза само ако мач срещу предишната версия показва, че печели.

    Резултат +349 ± 37 Elo спрямо предишния двигател в 600 партии срещу себе си и 164 Elo над Stockfish 19, ограничен до 3000, и приблизително наравно с него при ограничение 3190 (по 200 партии, 10+0,1; ограничителят на Stockfish е собствена скала, а не рейтингов списък).

  8. Безплатни дневни лимити, удължавани с реклама, която не може да се фалшифицира

    Проблемът
    Играчът може да гледа реклама за още една подсказка, дълбок анализ, обаждане или партия с гласов чат и нищо само на телефона не бива да може да си отпусне тази награда.
    Какво направихме
    Сървърът отпуска наградата, когато получи подписаната сървърна проверка на Google AdMob за гледането на рекламата (с ограничен резервен вариант, потвърден от приложението), и сам проверява, ограничава и отчита наградите и дневните лимити.

    Резултат Безплатно всеки ден: 10 подсказки, 3 дълбоки анализа, 3 обаждания и 3 партии с гласов чат и още по една от всяка срещу наградена реклама (стойностите по подразбиране; операторът може да ги променя).

Тестван като продукт, не като демо

  • Генерирането на ходове е проверено с perft върху известни позиции
  • Промяна на двигателя излиза само ако мач срещу предишната версия показва, че печели, а силата се сверява със Stockfish на фиксирани нива
  • Бърз код на двигателя за процесорите на сървъра, сверен бит по бит с обикновената версия
  • Интеграционни тестове на сървъра, тестове на двигателя и тестове на WebAssembly сборката
  • Тестове на натоварването, които симулират хиляди едновременни партии
  • Говорими отговори на треньора за 0,3–2 s за ново изречение, мигновено от кеша, с 18 гласа

Технологии

  • Go
  • SQLite
  • WebSocket
  • SvelteKit
  • TypeScript
  • NNUE
  • WebAssembly
  • WebRTC
  • Capacitor
  • sherpa-onnx
  • nginx
  • Cloudflare
  • systemd

Carrom: настолна игра с физика, която написахме сами

Всички наши проекти

Искате игра или приложение в реално време, изградени по този начин?

Проектираме, изграждаме и поддържаме игри и платформи в реално време от край до край: приложения, сървъри, магазини и операции.