Статья
Раздел:
Геймплей

Постараюсь без воды. Для чего в играх нужен разброс значений?

Например, для чего нужен разброс урона?
Помимо вариативности и азарта.
В конце бонус в виде скрипта, помогающие производить расчёты.

Кратко

Если кратко - то для повышения ожидаемой полезности при каждом улучшении оружия.
Для тех, кто не понял что написано в предыдущей строке, и составлена данная мини-статья.

Рассматриваемые в статье ситуации

Рассмотрим три ситуации:
  1. оружие наносит урон без разброса
  2. оружие наносит урон с разбросом
  3. оружие наносит урон с разбросом с биномиальным распределением

Оружие наносит урон без разброса

Представим, что в лесу обитают волки с 10 единицами здоровья
А оружие героя наносит 5 ед. урона.
Следовательно герою потребуется по 2 удара для убиения каждого волка.
Что если мы хотим вознаградить героя более качественным мечём и дадим ему оружие с уроном в 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-х ударов
В среднем такое оружие убьёт волка с 2.408 удара

Если мы улучшим оружие до 4-8,

То такое оружие убьёт волка:
  • с вероятностью в 88% с 2-х ударов,
  • с вероятностью в 12% с 3-х ударов
В среднем такое оружие убьёт волка с 2.12 удара, что уже немного полезнее, чем предыдущий результат.

Оружие с уроном 5-9:

  • с вероятностью 100% с 2-х ударов
В среднем - 2 удара.

Оружие с уроном 6-10

  • с вероятностью 20% с 1-го удара
  • с вероятностью 80% с 2-х ударов
В среднем - 1.8 ударов
..

Оружие с уроном 9-13

  • с вероятностью 80% с 1-го удара
  • с вероятностью 20% с 2-х ударов
В среднем - 1.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 ед. здоровья со второго удара. Так что правилом хорошего тона было бы настроить систему так, чтобы дисперсия ощущалась относительно базового значения.

Оружие наносит урон с биномиальным распределением

При биномиальном распределении срединные значения выпадают значительно чаще крайних.
Самый частый пример - это бросок костей. Если бросить две 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. ед. урона. Ниже представлена таблица с распределением урона:
Урон Шанс
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 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% может нанести критический удар, утраивающий этот урон, то можно вызвать функцию следующим образом:
battle(18, {[2]=0.4, [3]=0.4, [6]=0.1, [9]=0.1})
(т. е. при каждом ударе с шансом 40% нанесётся 2 урона, с шансом 40% - 3 урона, 10% - 6 урона и 10% - 9 урона
`
ОЖИДАНИЕ РЕКЛАМЫ...
Этот комментарий удален
31
В варкрафте ещё есть скорость атаки и броня. Можно их в таблице учесть? И типы урона заодно.
Ответы (1)
14
nazarpunk, учесть-то это можно, но как результаты помогут статье объяснить значимость разброса урона?
Для простоты и скорости расчётов броню и типы урона лучше учитывать не на этапе нанесения урона, а на этапе определения живучести.
Представим, что ТИП_УРОНА_А наносит 50% урона ТИПУ_БРОНИ_Б
Представим, что за счёт защиты цель поглощает ещё 50% урона.
Представим, что у цели 30 здоровья.
Мы эти 30 здоровья трансформируем в = 30 / 0.5 / 0.5 = 120 ед. выживаемости, и уже на её основе делаем дальнейшие расчёты.
Например при атаке 2d6 юнит с 120 выживаемости умрёт в среднем за 17.6 ударов, при следующем распределении:
Открыть
ударов шанс
10 2.7351112277913e-014%
11 4.1031679368564e-007%
12 0.0005082683291586%
13 0.042771879348044%
14 0.79263792819846%
15 5.2309090932305%
16 15.892349201229%
17 26.047104956549%
18 25.629397264312%
19 16.34341133486%
20 7.150245301135%
21 2.2422062599449%
22 0.52159904816604%
23 0.092522686037503%
24 0.012796785259491%
25 0.0014055490287395%
26 0.00012446955625937%
27 8.9997428415966e-006%
28 5.369384314864e-007%
29 2.6667144643695e-008%
30 1.1106727154764e-009%
31 3.9031338455625e-011%
32 1.1631865228019e-012%
33 2.9516849157081e-014%
34 6.3985135455263e-016%
35 1.1877915821003e-017%
36 1.8914756144495e-019%
37 2.5864752003533e-021%
38 3.0382352652092e-023%
39 3.0648805473896e-025%
40 2.6526020195743e-027%
41 1.9664860560807e-029%
42 1.2458239999772e-031%
43 6.7240153291163e-034%
44 3.0797064155629e-036%
45 1.1912559357377e-038%
46 3.868783273993e-041%
47 1.047510998919e-043%
48 2.344715426602e-046%
49 4.2950654930684e-049%
50 6.360616565016e-052%
51 7.5032386982172e-055%
52 6.9235181519761e-058%
53 4.8853348554614e-061%
54 2.5610800856634e-064%
55 9.6052006896504e-068%
56 2.4480672941611e-071%
57 3.9386187437273e-075%
58 3.567210874768e-079%
59 1.485639003471e-083%
60 1.7934918856414e-088%
11
В варике кстати вероятности имеют биноминальное распределение видимо, а не нормальное насколько я понимаю, там кости и количество граней. Мы все знаем, конечно, центральую предельную теорему, но тем не менее немного духоты)))
Ответы (1)
14
Koladik, моя ошибка. И это не духота. Спасибо, исправлю.
14
Я добавил в конце статьи бонус в виде LUA кода для подобных расчётов onecompiler.com/lua/42tfdyszy
В статье инструкция как им пользоваться
4
В последнем абзаце демон превратился в медведя
Но статья интересная, спасибо!
Чтобы оставить комментарий, пожалуйста, войдите на сайт.