Математика idle-игр на пальцах
Почему цены в кликерах обгоняют доход, зачем нужны множители и когда жать «Престиж». С графиками, которые можно крутить, и мини-игрой.

Мы делаем My Army Getting Stronger, автобатлер, в котором армия растёт сама. Чтобы её рост был интересным, мы разбираемся, как устроена математика idle-игр.
Лучший текст на эту тему написал Энтони Пекорелла из Kongregate: «The Math of Idle Games», три части. В оригинале много формул. Мы пересказали его без них и добавили графики, которые можно крутить, и маленькую игру.
В статье три части:
- Цена и доход: почему игрок всегда упирается в стену и как её отодвинуть.
- Генераторы генераторов: другая схема роста.
- Престиж: от чего считать награду за сброс и когда сбрасываться.
Пять слов, которые понадобятся
- Валюта — число, которое растёт. Обычно деньги, у нас золото.
- Генератор — то, что приносит валюту: лимонадная лавка, ферма, утка с луком. Сила генератора — сколько валюты он даёт в секунду.
- Промежуточная валюта. Иногда генератор даёт не деньги, а что-то, что потом становится деньгами. В Clicker Heroes герои наносят урон, урон убивает монстров, а из монстров падает золото. Так дизайнер может менять «курс обмена» по ходу игры.
- Множитель — улучшение, которое умножает доход. Его покупают или получают за число генераторов, например за 25 одинаковых.
- Престиж — кнопка «начать заново, но сильнее». Игрок теряет почти всё и получает особую валюту, которая ускоряет следующий забег.
Часть 1. Цена обгоняет доход
По мотивам The Math of Idle Games, Part I (на английском).
Два правила жанра
Возьмём лимонадную лавку из AdVenture Capitalist. Первая лавка стоит 4 монеты и приносит 1,67 монеты в секунду. Дальше действуют два правила:
- Каждая следующая лавка на 7% дороже предыдущей.
- Каждая лавка добавляет к доходу одинаковую сумму.
🪙 Цена следующей лавки
💰 Доход от всех лавок в секунду
Сначала разницы не видно. У игрока 10 лавок: одиннадцатая стоит меньше 8 монет, а доход почти 17 монет в секунду. Покупка дешевле секунды дохода, и игрок покупает не думая.
Но цена каждый раз умножается, а доход прибавляется. Цена убегает, и ждать каждой покупки приходится дольше. Подвигайте ползунок «Уже куплено» и посмотрите на карточку «Копить до покупки».
Качели: цена против дохода
🪙 Каждая следующая утка дороже прошлой на 7%💰 Каждая утка приносит 1,67 в секунду
Ступеньки на синей линии — это множители ×2 за 25, 50 и 100 лавок. Когда цена почти догоняет доход, множитель подбрасывает доход вверх. Выключите множители: к сотой покупке линии разойдутся навсегда.
График сжат по высоте: каждая линия сетки в тысячу раз выше предыдущей. На обычной шкале цена выглядит как стена. Переключите шкалу и проверьте.
Стена неизбежна
То, что умножается, рано или поздно обгоняет то, что прибавляется. Даже если цена дорожает всего на 2% за шаг, а доход растёт быстро. Ползунками можно поменять только момент обгона.
Экспонента всегда догоняет
Для дизайнера это хорошо: игрок гарантированно упрётся в стену. Задача — поставить её в нужном месте. Слишком близко — игрок заскучает. Слишком далеко — игра закончится раньше, чем ему захочется вернуться.
Новый генератор не должен затмевать старые
Когда генераторов много, выгоднее покупать тот, что даёт больше дохода на монету. Компьютер считает это на каждом шаге. Человек так не играет: он покупает пачками по 10 или 100 и смотрит на крупные числа.
Пример. Лимонад даёт 10 монет в секунду и стоит 5 монет. Автомойка даёт 10 000 в секунду и стоит 7 500. Лимонад выгоднее: 2 монеты дохода на монету цены против 1,33. Но игрок этого не заметит: +10 на фоне десяти тысяч не видно. Поэтому главным всегда оказывается самый новый генератор, а старые становятся мебелью. Выбирать не из чего, и играть скучно.
Решение — дать разным генераторам разные множители. Тогда выгоднее то лучники, то новобранцы, у которых скоро порог ×2. Порядок покупок уже не очевиден, и у игрока появляется выбор.
Проверьте в мини-игре. Плашка «лучшая сделка» показывает утку, которая сейчас даёт больше всего дохода на монету. Под списком видно, сколько стоит покупка.
Мини-армия уток
Для программистов: как посчитать кнопки ×10 и «Макс» без цикла
Обозначения: b — цена первой штуки, r — рост цены (1,07), k — сколько уже куплено, c — сколько денег.
Сколько стоят n штук сразу:
const bulkCost = (b, r, k, n) => b * r ** k * (r ** n - 1) / (r - 1);Сколько штук хватит денег купить:
const maxBuy = (b, r, k, c) =>
Math.floor(Math.log(c * (r - 1) / (b * r ** k) + 1) / Math.log(r));Формулы работают, пока цена растёт на одинаковый процент. Если правило меняется, например после сотой покупки, считайте по частям.
Часть 2. Генераторы, которые производят генераторы
По мотивам The Math of Idle Games, Part II (на английском).
Есть другая схема. Генератор первого уровня приносит деньги. Генератор второго уровня производит генераторы первого. Третий производит второй. Так устроены Derivative Clicker и Shark Game: там акулы-няньки производят акул, а акулы ловят рыбу.
С одним уровнем деньги растут ровно, как по линейке. С двумя растут как снежный ком: генераторов становится больше с каждой секундой. Каждый новый уровень делает кривую круче.
Утки, которые рожают уток
Одна штука на верхнем уровне. Каждый уровень каждую секунду производит по одной штуке уровня ниже, а нижний уровень приносит золото.
Запустите шесть уровней: нижние числа взрываются. Похоже, будто несколько AdVenture Capitalist работают друг на друга.
Пунктир — это рост при бесконечном числе уровней, то есть настоящая экспонента. Каждый новый уровень приближает кривую к пунктиру, но не догоняет: уровней в игре всегда конечное число. Значит, цена, которая каждый раз умножается, всё равно победит. Качели работают и здесь.
У схемы есть проблема: зачем покупать нижние уровни руками, если их производят миллиардами? Derivative Clicker решает её двумя приёмами:
- Цена зависит только от купленных штук. Бесплатные генераторы не делают покупку дороже.
- Каждая купленная штука усиливает весь свой уровень на 0,05%. Ручная покупка полезна, даже когда бесплатных уже миллиард.
Часть 3. Престиж
По мотивам The Math of Idle Games, Part III (на английском).
Зачем сбрасывать прогресс
У престижа две задачи:
- Чувство силы. После сброса игрок пролетает начало игры в разы быстрее. Так устроены игры-запуски вроде Burrito Bison: улетел, прокачался, запустился снова и улетел дальше.
- Удобные числа. Без сброса числа уходят в бесконечность, и к ним трудно привязать прогресс. Престиж растёт медленнее заработка: заработал в 100 раз больше — престижа получил в 10 раз больше. К таким числам удобно привязывать улучшения.
От чего считать престиж
Игры считают престиж по-разному:
- рекорд денег — Realm Grinder;
- всё, что заработал за игру — Cookie Clicker, AdVenture Capitalist;
- заработок в текущем забеге — Egg, Inc.;
- число покупок в текущем забеге — Clicker Heroes.
Первые два способа накопительные. Сбросился там же, где в прошлый раз, — получил меньше или ничего. Чтобы расти, нужно каждый раз заходить дальше. Вторые два способа независимые: каждый забег считается с нуля, и одинаковый забег приносит одинаковую награду.
Сколько престижа дают разные игры
Главное число — во сколько раз больше нужно заработать, чтобы получить вдвое больше престижа. В AdVenture Capitalist и Realm Grinder — в 4 раза, в Cookie Clicker — в 8, в Egg, Inc. — в 128.
В Egg, Inc. кривая самая пологая: сидеть в одном забеге долго невыгодно, и игра подталкивает сбрасываться чаще и играть активнее. К тому же офлайн-доход там ограничен двумя часами. В Clicker Heroes престиж зависит от числа покупок, а цены покупок растут умножением, поэтому престиж там растёт медленнее всех.
Когда жать кнопку
Сбросился рано — получил мало перьев. Сбросился поздно — долго стоишь у стены, а доход почти не растёт. Лучший момент где-то посередине. Найдите его ползунком.
Когда жать «Престиж»
🔄 Сброс→🪶 перья за всё, что заработал→каждое перо +2% к доходу навсегда
Симуляция 4 часов игры. Игрок всегда покупает столько уток, сколько может, и сбрасывает прогресс каждые N минут.
Итог за 4 часа в зависимости от того, как часто сбрасываться:
Посмотрите на верхний график. Внутри забега доход растёт рывками: срабатывают множители за 25, 50 и 100 уток. А сами забеги с каждым разом короче и выше. Такую неровную лестницу и стоит проектировать: если все забеги одинаковые, игра похожа на конвейер.
Настоящие игроки редко сбрасываются в лучший момент. Если до множителя осталось пять уток, человек дотерпит, даже когда математика говорит «жми». Поэтому симуляция помогает почувствовать баланс, но не предсказывает его точно.
Что забрать с собой
- Цена растёт умножением, доход — прибавлением. Стена будет всегда, вы выбираете, где.
- Множители подбрасывают доход в нужный момент. Разные множители у разных генераторов дают игроку выбор.
- Генераторы генераторов похожи на экспоненту, но медленнее неё. Цена всё равно победит.
- Формула престижа задаёт темп: ×4, ×8 или ×128 заработка на удвоение престижа.
- Таблицы и симуляции помогают, но баланс находят только итерациями и собственной игрой.
- Большими числами игрока уже не удивить. Найдите, что в вашей игре весело: новые механики, достижения, поиск лучшего момента для престижа. И вкладывайтесь в это.
Всё это мы применяем в My Army Getting Stronger. Расскажем, что сработало.
Источник. Это авторский пересказ серии статей Энтони Пекореллы (Kongregate) по мотивам его доклада на GDC Europe 2016. Оригиналы на английском: часть I, часть II, часть III. Цифры в мини-игре и в симуляции престижа мы подобрали сами, для наглядности.
