# Монетка (Coinflip) ## Общее Самое пиздатое из подобных игр, что я находил: ``` https://betfury.io/inhouse/coinflip ``` Процесс **ИГРЫ** я записал и прикладываю к этому полотну. Есть два режима игры. - Моментальный (Instant) - Множитель (Multiply) *(мб по красивее можно придумать название)* При быстром режиме множетель константный `= 1.94` При втором варианте игры множетель динамический. Чем больше раз успешно угадал монетку, тем больше множитель. Множитель приходит с бэка. --- ## Цифры и по мелочи Для ставок и баланса максимум 2 цифры после запятой. Округление всегда в меньшую сторону (Math.floor). После каждой игры с бэка приходит баланс, чтобы избежать математических проблем в JS. Отдельно вынесены ограничения по ставке MAX_BET MIN_BET --- ## Аутентификация Личность юзера определяется с помощью хедера `X-CHECK-STRING` Туда нужно положить проверочную строку от телеграма. [Подробнее тут (нужно просто прицепить ихний скрипт)](https://core.telegram.org/bots/webapps#initializing-web-apps) Пример: ```javascript const url = "http://127.0.0.1:8000" await (await fetch(url + "getUser", { headers: { "X-CHECK-STRING": window.Telegram.WebApp.initData }, method: "POST" })).json() ``` Для тестирования можно использовать любую не пустую строку. --- ## Endpoints 1. `/getUser` Используется, чтобы получить информацию о юзере, его балансе и активной игре (если такая есть) Response ```json { "game": object({ "history": Array[str], // Массив с угаданными значениями "HEAD" либо "TAILS" "flips_count": integer, // сколько угадано раз "bet": number // размер ставки }) or null, "balance": number, "language_code": string, // "ru" или "en" "preferences": object({ "last_bet": number }) } ``` `game` это всегда игра со множителем. То есть, если человек закрыл страницу и не доиграл, она должна подгрузиться. Если доиграл, то там будет `null` `last_bet` это сколько юзер ставил в прошлый раз. Оно должно автоматически встать в поле со ставкой. 2. `/instant/play` Моментальный режим игры Request ```json { "bet": number, // ставка "prediction": str, // Предсказание. принимает только значения "HEAD" либо "TAILS" "win": bool or null, // debug } ``` Здесь `win` и дальше только для дебага. Если он `true`, то бэк засчитает победу, если `false` то проигрыш. Если не указан, то будет рандом Response ```json { "victory": bool, // Победил?? "balance": number } ``` 3. `/multiply/play` Режим игры с динамическим множителем. Request ```json { "bet": number or null, "prediction": str, "win": bool or null, } ``` a. При первом запросе необходимо передать ставку `bet`. b. При повторных запросах (если с сервера не пришло уведомление о завершении игры), параметр `bet` нужно убрать. Response вариант 1 (Если Победа, то есть `victory = true`) ```json { "victory": bool, "flips_count": number, // сколько раз угадал "multiplier": number // множитель } ``` Response вариант 2 (Если Поражение, то есть `victory = false`) ```json { "victory": bool, "balance": number } ``` 4. `/multiply/cashout` Завершение игры со множителем. Юзер победил и вывел средства. Response ```json {"balance": number} ``` --- ## Mock API Бэк с тестовыми данными ``` https://github.com/me-gusta/coinflip_test ``` --- # Заключение Я постарался подробно все описать, надеюсь получилось понятно. Оптимизация нужна только под мобилу. Деплоить можешь куда-то типа firebase, но вобще на твое усмотрение. Вот прямой линк на мины (не будет работать тк переход не из телеги): https://bot-frontend-demo.web.app/ Насчет дизайна, надо чтобы выглядело современно. Чтобы глаз зумера, привыкший к плавным линиям и нежным цветам своего айфоун, непременно получил удовольствие от созерцания вращания монетки. Помимо этого, надо дать юзеру возможность играть максимально быстро, то есть максимально ускорить анимацию.