Постараюсь без воды. Для чего в играх нужен разброс значений?
Например, для чего нужен разброс урона?
Помимо вариативности и азарта.
В конце бонус в виде скрипта, помогающие производить расчёты.
Помимо вариативности и азарта.
В конце бонус в виде скрипта, помогающие производить расчёты.
Кратко
Если кратко - то для повышения ожидаемой полезности при каждом улучшении оружия.
Для тех, кто не понял что написано в предыдущей строке, и составлена данная мини-статья.
Для тех, кто не понял что написано в предыдущей строке, и составлена данная мини-статья.
Рассматриваемые в статье ситуации
Рассмотрим три ситуации:
- оружие наносит урон без разброса
- оружие наносит урон с разбросом
- оружие наносит урон с разбросом с биномиальным распределением
Оружие наносит урон без разброса
Представим, что в лесу обитают волки с 10 единицами здоровья
А оружие героя наносит 5 ед. урона.
А оружие героя наносит 5 ед. урона.
Следовательно герою потребуется по 2 удара для убиения каждого волка.
Что если мы хотим вознаградить героя более качественным мечём и дадим ему оружие с уроном в 6 ед?
Эффекта не будет. По крайней мере при сражени с волками. Герой как прежде будет убивать волка с 2 ударов.
Это касается и оружия с 7 ед, и 8 ед, и 9 ед. урона.
Только оружие с 10 ед. урона даст эффект убиения волков 1 удара.
Большие скачки полезности прокачки могут быть проблемой для вашего баланса и для ощущения игры для игроков.
Что если мы хотим вознаградить героя более качественным мечём и дадим ему оружие с уроном в 6 ед?
Эффекта не будет. По крайней мере при сражени с волками. Герой как прежде будет убивать волка с 2 ударов.
Это касается и оружия с 7 ед, и 8 ед, и 9 ед. урона.
Только оружие с 10 ед. урона даст эффект убиения волков 1 удара.
Большие скачки полезности прокачки могут быть проблемой для вашего баланса и для ощущения игры для игроков.
Урон оружия | Ожидаемое количество ударов для убийства |
1 | 10 |
2 | 5 (эффективность +100%) |
3 | 4 (эффективность +25%) |
4 | 3 (эффективность +33%) |
5 | 2 (эффективность +50%) |
6 | 2 (эффективность +0%) |
7 | 2 (эффективность +0%) |
8 | 2 (эффективность +0%) |
9 | 2 (эффективность +0%) |
10 | 1 (эффективность +100%) |
Оружие наносит урон с разбросом
Теперь представим себе вторую ситуацию. Оружие имеет разброс урона.
У героя есть оружие с уроном 3-7.
Такое оружие убьёт волка:
- с вероятностью в 60% с 2-х ударов,
- с вероятностью в 39.2% с 3-х ударов,
- с вероятностью в 0.8% с 4-х ударов
Если мы улучшим оружие до 4-8,
То такое оружие убьёт волка:
- с вероятностью в 88% с 2-х ударов,
- с вероятностью в 12% с 3-х ударов
Оружие с уроном 5-9:
- с вероятностью 100% с 2-х ударов
Оружие с уроном 6-10
- с вероятностью 20% с 1-го удара
- с вероятностью 80% с 2-х ударов
..
Оружие с уроном 9-13
- с вероятностью 80% с 1-го удара
- с вероятностью 20% с 2-х ударов
Урон оружия | Ожидаемое количество ударов для убийства |
1-5 | 3.777 |
2-6 | 2.928 (эффективность +29%) |
3-7 | 2.408 (эффективность +22%) |
4-8 | 2.12 (эффективность +14%) |
5-9 | 2 (эффективность +6%) |
6-10 | 1.8 (эффективность +11%) |
7-11 | 1.6 (эффективность +13%) |
8-12 | 1.4 (эффективность +14%) |
9-13 | 1.2 (эффективность +16%) |
10-14 | 1 (эффективность +20%) |
Вывод
Как видим, ожидаемая полезность оружия возрастает при каждой единице урона. Ситуации, когда улучшение бесполезно встречается намного реже, чем в ситуации без разброса.
Надо только следить за тем, чтобы разброс был достаточным для влияния на статистику.
Так, если оружие имеет разброс 51-53, то оно всегда будет убивать моба с 100 ед. здоровья со второго удара. Так что правилом хорошего тона было бы настроить систему так, чтобы дисперсия ощущалась относительно базового значения.
Надо только следить за тем, чтобы разброс был достаточным для влияния на статистику.
Так, если оружие имеет разброс 51-53, то оно всегда будет убивать моба с 100 ед. здоровья со второго удара. Так что правилом хорошего тона было бы настроить систему так, чтобы дисперсия ощущалась относительно базового значения.
Оружие наносит урон с биномиальным распределением
При биномиальном распределении срединные значения выпадают значительно чаще крайних.
Самый частый пример - это бросок костей. Если бросить две 6-и гранние кости, то они в сумме дадут результат от 2 до 12. Но крайние значения будут выпадать реже. Например, чтобы в сумме кости показали 2, нужно чтобы и первая кость показала 1 (вероятность 1/6), и вторая кость показала 1 (вероятность 1/6). Вероятность того, что эти исходы случатся = 1/36.
Есть игры, и Warcraft 3 среди них, которые имитируют бросок костей, чтобы игрокам случайность реже казалась несправедливой. Если вы зайдёте в редактор объектов warcraft 3, то увидите, что урон и выпавшее золото с монстров определяется броском нескольких костей. Таким образом мобы редко наносят минимальный и максимальный урон, и из них редко выпадает минимальное и максимальное количество золота.
Но мы отвлеклись, а я обещал без воды.
Оружие 2d4 vs волк (10 hp)
Дадим герою оружие, наносящее 2d4 ед. урона (2 кости по 4 грани),
такое оружие при каждой атаке, к примеру, с шансом в 6.25% нанесёт 2 ед. урона, и с шансом в 25% нанесёт 5. ед. урона. Ниже представлена таблица с распределением урона:
такое оружие при каждой атаке, к примеру, с шансом в 6.25% нанесёт 2 ед. урона, и с шансом в 25% нанесёт 5. ед. урона. Ниже представлена таблица с распределением урона:
Урон | Шанс |
2 | 6.25% |
3 | 12.50% |
4 | 18.75% |
5 | 25.00% |
6 | 18.75% |
7 | 12.50% |
8 | 6.25% |
Оружие 2d4 vs медведь (20 hp)
Рассмотрим дичь по-крупнее, например медведя с 20 ед. здоровья.
С таким оружием понадобится от 3-х до 10 ударов на убийство медведя. Но скорее всего, с шансом в 51% понадобится 4 удара. В среднем на убийство каждого медведя будет требоваться 4.45 ударов.
Ниже показано распределение:
С таким оружием понадобится от 3-х до 10 ударов на убийство медведя. Но скорее всего, с шансом в 51% понадобится 4 удара. В среднем на убийство каждого медведя будет требоваться 4.45 ударов.
Ниже показано распределение:
ударов | шанс |
3 | 4.980469% |
4 | 51.193237% |
5 | 37.833118% |
6 | 5.725384% |
7 | 0.263538% |
8 | 0.004231% |
9 | 0.000023% |
10 | 0.00000003% |
Оружие 1+1d7 vs медведь (20 hp)
А теперь представим, что вместо 2d4 мы вооружились оружием 1+1d7, т. е. такое оружие тоже будет наносить от 2 до 8 ед. урона, т. е. такому оружию тоже понадобится на уничтожение медведя от 3-х до 10-и ударов. Но распределение будет уже другим, более размазанным:
ударов | шанс |
3 | 10.204082% |
4 | 44.606414% |
5 | 33.902541% |
6 | 9.833488% |
7 | 1.357306% |
8 | 0.093308% |
9 | 0.002837% |
10 | 0.00002478% |
Мы уменьшили число факторов, влияющих на результат, поэтому срединные результаты стали выпадать реже, а крайние чаще.
Оружие 8d4 vs демон (100 hp)
Последний пример на сегодня. Оружие c уроном 8d4 (8 дайсов по 4 грани у каждой) против противника с 100 ед. здоровья. Этот пример показывает, что несмотря на большое количество вариантов развития событий, всё-равно в конечном итоге с вероятностью в 99.5% медведь будет уничтожен либо 5, либо с 6 удара. Поэтому если вы не хотите, чтобы почти все битвы оканчивались одинаково несмотря на рандом, вам нужно находить баланс в количество влияющих на неё факторов.
ударов | шанс |
4 | 0.09% |
5 | 52.7% |
6 | 46.8% |
7 | 0.39% |
8 | 0.000036% (считайте, что это почти 0%) |
9 | 7.35E-13 (а это ещё нулее) |
10 | 4.37E-20 (1 к [во вселенной примерно столько звёзд]) |
11 | 6.74E-29 |
12 | 1.31E-39 |
13 | 2.50E-53 (во вселенной 1E+79 атомов) |
Бонус. Скрипты для расчётов.
Для статьи я составим калькулятор на LUA, можете им пользоваться:
(просто настройте вводные данные и нажмите RUN)
Например, если у противника 18 ед. здоровья, а вы ему наносите 2d6+1 урона, то калькулятор покажет следующий результат:
Output:
strike# chance
2 33.564814814815%
3 60.358796296296%
4 5.9997642318244%
5 0.076515505131332%
6 0.00010915193314027%
average strikes 2.7258830788307
Вызывается функция в конце программы следующим образом:
battle(18, throwDices(2, 6, 1))
Опционально можно указать функцию, форматирующую выводимый результат, например так:
battle(18, throwDices(2, 6, 1), function(chance) return chance*100 .. "%" end)
При желании можно задать своё распределение урона.
Например, если герой наносит от 2 до 3 ед. урона, но с шансом в 20% может нанести критический удар, утраивающий этот урон, то можно вызвать функцию следующим образом:
Например, если герой наносит от 2 до 3 ед. урона, но с шансом в 20% может нанести критический удар, утраивающий этот урон, то можно вызвать функцию следующим образом:
battle(18, {[2]=0.4, [3]=0.4, [6]=0.1, [9]=0.1})
(т. е. при каждом ударе с шансом 40% нанесётся 2 урона, с шансом 40% - 3 урона, 10% - 6 урона и 10% - 9 урона
Ред. Cancel
Для простоты и скорости расчётов броню и типы урона лучше учитывать не на этапе нанесения урона, а на этапе определения живучести.
Представим, что ТИП_УРОНА_А наносит 50% урона ТИПУ_БРОНИ_Б
Представим, что за счёт защиты цель поглощает ещё 50% урона.
Представим, что у цели 30 здоровья.
Например при атаке 2d6 юнит с 120 выживаемости умрёт в среднем за 17.6 ударов, при следующем распределении:
Ред. Koladik
Ред. Cancel
В статье инструкция как им пользоваться