---
# System prepended metadata

title: Монетка (Coinflip)

---

# Монетка (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/

Насчет дизайна, надо чтобы выглядело современно. Чтобы глаз зумера, привыкший к плавным линиям и нежным цветам своего айфоун, непременно получил удовольствие от созерцания вращания монетки.


Помимо этого, надо дать юзеру возможность играть максимально быстро, то есть максимально ускорить анимацию.

