# Монетка (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/
Насчет дизайна, надо чтобы выглядело современно. Чтобы глаз зумера, привыкший к плавным линиям и нежным цветам своего айфоун, непременно получил удовольствие от созерцания вращания монетки.
Помимо этого, надо дать юзеру возможность играть максимально быстро, то есть максимально ускорить анимацию.