April 21

Выживи в холодильнике! 🧃🧀🥒

"Выживи в холодильнике" — это текстовая Telegram-игра, встроенная в бота. Игроки каждый день делают выбор между несколькими продуктами из холодильника, стараясь выжить как можно дольше.
Основная цель — продержаться как можно больше дней, сохранив жизни и балансируя между голодом, моралью и силой.

🧠 Логика игры

Ежедневный цикл:

  1. Бот рассылает игрокам кнопки с продуктами.
  2. Игрок выбирает один из продуктов.
  3. После дедлайна бот:
    • рассчитывает шанс выживания,
    • определяет, выжил ли игрок,
    • обновляет статы: голод, сила, мораль.
  4. Выводится результат с текущими показателями и комментарием.

Каждый выбор влияет на четыре базовых стата:

  • Жизни (lives) — здоровье; если достигает 0, игрок выбывает.
  • Сила (strength) — влияет на шансы выжить: каждая единица силы даёт +2% к базовому шансу выжить при обработке исходов и уменьшает штраф от голода (каждые 2 ед. силы компенсируют −1 hunger).
  • Голод (hunger) — показывает степень голода персонажа. При высоком уровне голода:
    • Снижается сила (−1 strength за каждые 3 пункта голода).
    • Повышается риск выбывания при обработке дня (добавочный штраф к шансам).
  • Мораль (morale) — отражает боевой дух. При высокой морали:
    • Уменьшается штраф от голода (каждые 2 пункта morale компенсируют −1 к hunger).
    • Даётся небольшой бонус к шансу выжить (+5% к шансу).
    • При низкой морали (менее 0) увеличивается вероятность негативных исходов (−5% к шансу выжить).

🎲 Механика расчёта выживания

1. Бросок удачи

int randomChance = (int) (Math.random() * 100) + 1;

2. Шанс выживания

Формируется из:

  • baseChance — базовый шанс от продукта (например, сыр — 75%).
  • +2% за каждую единицу силы.
  • +5%, если мораль ≥ 0; −5%, если мораль < 0.
  • −1% за каждый пункт голода.

3. Вывод результата

Если randomChance > survivalChance, игрок теряет одну жизнь.

📊 Статы игрока

❗ Статы не могут быть меньше 0 (ограничиваются после обновления).

🥒 Продукты

🛠 Компенсация голода

После выживания:

int hungerReduction = (strength / 2) + (morale / 2);
newHunger = hunger + product.hungerDelta - hungerReduction;

📈 Таблица лидеров

Ключевые метрики:

  • Кол-во прожитых ночей
  • Остаток жизней
  • Среднее значение силы/морали
  • Победы (если игра идёт сериями)

Вывод:

Можно формировать leaderboard по:

  • Выжившим дольше всех
  • Самым "сильным"
  • Тем, у кого был самый низкий шанс, но они выжили

⚠ Исключения и ограничения

  • Если lives <= 0 — игрок считается выбывшим, но остаётся в таблице.
  • Статы не могут быть отрицательными.
  • Можно ограничить максимум голода, силы и морали (например, по 10), если нужно сбалансировать игру.

🏁 Победа и конец игры

  • Игра идёт до последнего выжившего (можно по дням или неделям)
  • Победитель фиксируется в таблице и получает титул (например, «🥶 Холодильный Чемпион»)
  • Можно добавить сезонную систему: победители месяца, общий счёт и т.д.