Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Yan_Shrayber_-_vse_3.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
8.77 Mб
Скачать

Решаем кнб с неравным счетом

Предыдущий пример отлично подходит к Камню-Ножницам-Бумаге, но как бы нам применить его к чему-то более интересному? В качестве следующего шага давайте изменим механизм счета. Например, в файтингах существует типичная транзитивная система, в которой атаки проигрывают броскам, броски – блокам, а блоки – атакам, но все они наносят разный ущерб, так что у них у всех разные результаты в том смысле, что каждый выбор ставит на кон разный процент ущерба. Как изменится КНБ, если мы поэкспериментируем со стоимостью? Вот вам пример. Предположим, что я ввел в игру новое правило: если игрок побеждает, показав Камень, это засчитывается, как два выигрыша. Так же легко вы можете вообразить это: в файтинге атаки наносят обычный ущерб, а блоки наносят столько же ущерба (давайте предположим, что успешный блок допускает контратаку), но при этом броски наносят вдвое больше ущерба, чем атака или блок. Но давайте все упростим и скажем, что «каждая победа с Камнем засчитывается как две». Как же это повлияет на наши вероятности?

И снова начнем с таблицы выигрышей:

 

к

б

н

К

0

 -1

+2

Б

+1

0

-1

Н

-2

+1

0

Затем используем ее, чтобы составить наши три уравнения выигрышей:

>>К = 2н-б

>>Б = к-н

>>Н = б-2к

И снова наша игра симметрична и с нулевой суммой, и мы с противником должны выбрать только по одной фигуре, так что у нас по-прежнему:

>>К = Б = Н = 0

>>к+б+н = 1

Опять решаем:

>> К = 0 = 2н-б, таким образом, 2н = б

>> Б = 0 = к-н, таким образом, к = н

>> Н = 0 = б-2к, таким образом, 2к = б

>> к+б+н = к+2к+к = 1, таким образом, к=1/4

>> к=н, таким образом, н=1/4

>> 2к=б, таким образом, б=1/2

Таким образом получим удивительный результат: если мы удвоим выигрыши для Камня, в итоге мы придем к тому, что Бумагу будут выбирать половину времени, а Камень и Бумагу будут выбирать всего лишь по четверти раз! К этому ответу вы вряд ли бы пришли самостоятельно, не используя математику, но, если оглянуться назад, в этом появляется смысл: поскольку Ножницы выбирать – рискованная затея, игроки будут склонны их игнорировать. Если вы знаете, что ваш противник скорее всего не выбросит Ножницы, Бумага, скорее всего, приведет к ничьей или выигрышу, так что именно Бумагой (а не Камнем) играют чаще всего. Так что, если у вас файтинг, в котором успешный бросок причиняет в два раза больше ущерба, чем успешная атака или блок, но игрок может причинить столько же ущерба блоком или атакой, вам стоит ожидать по меньшей мере вдвое увеличившихся попыток применить атаки, а не броски или блоки!

Решаем кнб с неполными победами

Предположим, что мы учтем со всем вышеперечисленным расходы на ресурсы. В файтингах обычно нет «расходов», ассоциирующихся с выполнением какого-то движения (в отличие от времени, возможно), но в стратегиях в реальном времени обычно действительно имеются настоящие расходы на ресурсы для производства юнитов. Давайте возьмем простую стратегию, где у вас есть рыцари, которые побеждают лучников, лучники, которые побеждают летающих бойцов и летающие бойцы, побеждающие рыцарей. Более того, предположим, что, если вы пошлете юнита одного типа на юнита того же типа, они уничтожат друг друга и не будет ни чистого выигрыша, ни чистого проигрыша, но с победителями ситуация немного иная. Допустим, что, когда рыцари атакуют лучников, они побеждают, но они все еще теряют 20% здоровья из-за того, что не успели сомкнуть шеренги до того, как на них посыпался град стрел. И, к примеру, лучники, выступив против летающих бойцов, теряют 40% здоровья при контратаках. Но летающие бойцы вообще не получают урона от рыцарей, потому что последние только и могут, что стоять и «отхватывать» (их мечи не очень-то годятся против бойцов, которые парят на высоте сотни футов над ними, прицельно кидаясь камнями). И, наконец, предположим, что рыцарь стоит 50 единиц золота, лучник – 75, а летающий боец – 100. И как теперь это все будет работать?

Начнем с таблицы выигрышей:

 

р

лучн

лет

Р

50-50=0

 (-50*0.2)+75=+65

-50

Лучн

-75+(0.2*50)= -65

75-75=0

(-75*0.4)+100=+70

Лет

+50

-100+(75*0.4)= -70

100-100=0

Объясню: если мы с противником возьмем одного и того же юнита, мы оба получим ноль, как подсказывает здравый смысл, но что происходит на самом деле: мы оба играем одним и тем же количеством юнитов и оба их теряем. Так что у нас обоих, по сути, чистый проигрыш, но по отношению друг к другу это все еще игра с нулевой суммой (например, по результатам боя Рыцарь против Рыцаря мы получаем 50 единиц золота, так как Рыцарь противника защищается, но в то же время теряем эти же 50 единиц, поскольку наш Рыцарь тоже умирает; суммируя эти результаты, мы получим чистый ноль).

А что насчет ситуации, в которой наш Рыцарь встречает вражеского Лучника? Итак, мы убиваем Лучника, что дает нам 75 единиц золота, но это также уменьшает здоровье нашего Рыцаря на 20%, так что, можно сказать, мы теряем 20% от стоимости нашего Рыцаря (которая составляет 50 единиц золота, напомню), то есть в переводе на золото мы теряем 10 единиц. В итоге получаем 65 единиц золота.

Когда наш Рыцарь встречает вражеского летающего бойца, мы теряем Рыцаря – минус 50 единиц золота. На противнике эта битва вообще никак не сказывается. Куда же девается стоимость Бойца (100 единиц)? В данном случае – никуда, так как у противника после битвы все еще остается Боец, так что он сохраняет свои 100 единиц и ничего не теряет… по крайней мере, пока!

Так что в случае различной стоимости или неполных побед трудность состоит только в том, что нужно подправить вашу таблицу выигрышей. А сам процесс неизменен:

>>Р = 0р + 65лучн + (-50)лет = 65лучн-50лет

>>Лучн = (-65)р + 0лучн + 70лет = 70лет-65р

>>Лет = 50р + (-70)лучн + 0лет = 50р-70лучн

>>Р = Лучн = Лет = 0

>>р+лучн+лет = 1

Решив это, мы получим:

>>Р= 0 = 65лучн-50лет, таким образом, 65лучн = 50лет

>>Лучн = 0 = 70лет-65р, таким образом, 70лет = 65р, таким образом, лет = (13/14)р

>>Лет = 0 = 50р-70лучн, таким образом, 50Р= 70лучн, таким образом, лучн = (10/14)р

>>р+лучн+лет = Р+ (10/14)Р+ (13/14)Р= (37/14)Р= 1, таким образом, Р= 14/37

>>лет = (13/14)Р= (13/14)(14/37), таким образом, лет = 13/37

>>лучн = (10/14)Р= (10/14)(14/37), таким образом, лучн = 10/37

В данном случае мы наблюдаем ту еще смесь юнитов, где рыцари встречаются чуть чаще, а лучники – чуть реже. Если вы хотите, чтобы летающие бойцы были более редкими, можно поэкспериментировать с их ценами, или позволить рыцарям наносить им чуть больше ущерба, на что фантазии хватит.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]