Я некоторое время возился с игрой, и у меня изрядное количество проблем с чем-то:
У меня есть два персонажа, каждый из которых имеет атрибуты (около десяти) в диапазоне (от 1 до 20). Я хочу использовать эти атрибуты, чтобы сгенерировать «бросок» так, чтобы более высокий бросок выиграл эту конкретную схватку. Стоит отметить, что два персонажа не наносят вред / защищают друг друга. Они оба катятся, чтобы посмотреть, пройдут ли они то, что, я думаю, можно назвать проверкой навыков. Они оба катятся, чтобы пройти / потерпеть против общей ценности. Они не взаимодействуют друг с другом.
Однако, когда у одного из персонажей есть даже небольшое численное преимущество, любая предложенная мной формула приводит к тому, что очень немного превосходящий выигрывает в подавляющем большинстве случаев. Это нежелательно.
Я попытался взвесить атрибут «наиболее релевантный» для теста на уровне 80%, а сумму других атрибутов - на уровне 20%. Я также попытался сравнить средние значения, чтобы получить относительную разницу, и использовать ее, чтобы усилить более слабый характер. Оба подхода привели к значительным преимуществам, которые я пытаюсь устранить (например, если я запускаю схватку 5000 раз, она вполне регулярно дает одну сторону, выигравшую все 5000).
Кажется, что добавление компонента «удачи» имеет значение только в том случае, если он каким-то образом взвешен в пользу менее значимого персонажа, и я не нашел там хорошего баланса.
Какие подходы я могу использовать, чтобы смягчить влияние небольшого числового преимущества, но при этом сохранить и увеличить это преимущество по мере увеличения относительного разрыва в характеристиках?
В соответствии с запросом, у меня есть конкретные данные. Некоторые вещи я еще не выяснил, поэтому они остаются общими:
На данный момент бросок генерируется как
0.8 * (mainAttribute) + 0.2 (1/3 * subAttA + 1/3 * subAttB * 1/3 subAttC)
В настоящее время это производит числа в районе 4,0. Атрибуты генерируются случайным образом между указанными диапазонами. В текущем тесте используется один символ с атрибутами от 2 до 4, а оппонент между 3 и 5. Как и ожидалось, это дает средние значения, близкие к 3 и 4 соответственно.
С этим преимуществом в одно очко я хотел бы видеть более сильный выигрыш двух в области от 55% до 60% времени, при этом увеличение до выигрыша в 80% случаев со средним преимуществом атрибута: 5 или 6, 90% при преимуществах 7 или 8, оставляя место для маловероятного выигрыша, когда разрыв увеличивается. Я бы предпочел, чтобы никогда не было гарантированных побед, но, возможно, все становится очень маловероятным - на случай выигрыша в 99,5% или 99,6% случаев, когда разрыв становится очень большим.
Текущая формула производит неслучайное число. Случайность происходит от выбора того, какие атрибуты актуальны. Не все атрибуты используются для каждого броска. Тот, кто имеет более слабые атрибуты, может быть сильнее в областях, имеющих отношение к этому броску, и украсть победу. Но, как и ожидалось, это случается редко.
Моя следующая попытка состояла в том, чтобы взвесить их относительные силы, взяв в среднем все характеристики каждого, разделив их друг против друга, и используя это значение, чтобы дать небольшой толчок меньшему персонажу. Это немного сгладило ситуацию, но все же имело ярко выраженную тенденцию производить такие вещи, как 5000 побед для одного парня из 5000 попыток.
источник
Ответы:
Проблема с вашим подходом заключается в том, что вы решаете результат боя в тот момент, когда решаете основную характеристику. Когда у вас есть 4 основных характеристики, а у одного из них боец только лучше, его шанс на победу всегда равен 1 к 4, независимо от того, насколько велики различия на самом деле. Если вам нужны более детальные результаты, вам нужна более детальная случайность.
Прежде всего, я думаю, что вы можете оставить свой случайный выбор для основного атрибута, и вы также можете сохранить свою формулу, если хотите. Это число, которое показывает, какое преимущество имеет этот комбатант в этой конкретной схватке. Для остальной части этого поста, я буду ссылаться на это как просто
power
.Метод, который я использовал во многих играх и который мне очень помог, когда дело доходит до дуэли между двумя вещами с определенным
power
, состоит в том, чтобы бросить случайное число с плавающей запятой между0
иpower
для обоих и посмотреть, кто бросил выше. Вот список ожидаемых результатов этого метода. Проценты не рассчитываются, а генерируются экспериментальным путем, выполняя 100000 боев за комбинацию и количество итераций и подсчитывая, кто выиграл, как часто:Приятной особенностью этого алгоритма является то, что он масштабируется независимо от того, с какими большими числами вы имеете дело. Вероятность 0,3 против 0,7 такая же, как у 3 против 7, 300 против 700 или 3 000 000 000 против 7 000 000 000.
Когда это все еще слишком непредсказуемо на ваш вкус, вы можете сделать бой более предсказуемым, бросая несколько случайных чисел для каждого бойца и складывая их. Из-за закона больших чисел многие случайные события выровняются и приведут к более предсказуемым результатам. Вот таблица с разным количеством итераций.
Результаты 100% и 0% в приведенной выше таблице являются иллюзией из-за различий в округлении. Если число
power
бойцов не равно 0, всегда есть вероятность, что они выиграют. Такого просто не было в приведенном выше тесте, поэтому вы можете ожидать, что он будет ниже 1: 100000.Вы также можете заметить некоторые небольшие неровности, которые могут быть связаны с перепадом настроения java.lang.Random и могут не появиться при повторном запуске кода с другим начальным числом.
Программа, которую я использовал для создания этой таблицы (Java).
Если вы хотите использовать этот код в своей игре, он лицензируется в соответствии с WTF Public License Version 2, опубликованной Sam Hocevar .
источник
1 - powerA / ( 2 * powerB )
.powerA < powerB
. Когда powerA станет больше, вам нужно переключиться наpowerB / (2 * powerA)
.Ваша ошибка заключается в использовании подхода, основанного на игре в кости. Вы на компьютере, вы можете использовать любую систему, которая вам нравится. Составьте таблицу, которая превращает разницу в значениях в% вероятности выигрыша, а затем вы можете установить значения на абсолютно все, что вам нравится, например
(Вам нужно сделать только половину таблицы, просто всегда выбирайте A как тот, у кого более высокий показатель)
Очевидно, что эти цифры являются лишь примером, вы можете сделать так, чтобы они следовали тому, что вам нравится.
источник
Честно говоря, это довольно глубокий вопрос с точки зрения игровой механики. Но есть несколько вещей, которые могут помочь.
Во-первых, именно поэтому в большинстве игр есть отдельный компонент для удара и урона, где есть «бросок», чтобы увидеть, ударили ли вы по урону, а затем «бросок» на стол урона или диапазон для данного персонажа. Это также приводит к некоторым стандартным архетипам в разных жанрах, где у вас могут быть меньшие, более быстрые персонажи, у которых меньше точек попадания, но которые наносят больший урон (стеклянные пушки, некоторые типы разбойников), и более крупные бронированные персонажи, которые наносят меньший урон (танки, воины) ).
Это приводит к естественному балансу, при котором меньший персонаж может быть хрупким, но избегает частых попаданий из-за способности типа ловкости, а также выравнивает игровое поле, нанося больше урона (заклинание или эффект яда, наносящий урон в течение время). Танк может быть медленнее и чаще попадать в него, но часто имеет огромный запас здоровья или точек попадания, которые, тем не менее, имеет тенденцию наносить меньше урона за удар (или урона в секунду).
Основанием для этого является то, почему многие игры постоянно проходят балансирование оружия, классов и статистики. World или Warcraft, Destiny, Diablo, Battlefield: любой тип игры в любом жанре часто проходит баланс и настройку с течением времени.
Это может быть не прямой ответ, но вы спрашивали об общих идеях. Итак, давайте также оценим игровую систему.
Как работают эти атрибуты? Если все остальное одинаково (нет архетипа, нет доспехов, нет лучшего оружия или еще чего-нибудь), то любой небольшой выигрыш с большой вероятностью приведет к серьезному выбрасыванию вещей в пользу одной стороны. Хотя добавление граней для борьбы усложняет любую систему, оно также обеспечивает большую гибкость.
источник
Есть две большие вещи.
Во-первых, помните, что вы находитесь на компьютере. Вы можете сделать любую систему, какую захотите. Не нужно ограничивать себя броском d20, хотя это легко понять игрокам. Такие вещи, как бросание костей 6 d6, легко выполнять на компьютере, и они дают гораздо меньше случайных результатов.
Во-вторых, если взглянуть на другие системы, такие как D & D, то становится очевидным, что они просто значительно уменьшают влияние атрибутов. Вместо того, чтобы иметь базовый показатель, добавьте 80% его значения к правилу, уменьшите его и сделайте добавление более тонким. Например, в D & D, если у вас есть 18 ловкости, вы получаете только 4 в качестве бонуса к классу брони.
Короче говоря, все, что вам нужно сделать, это уменьшить свой домен, чтобы он лучше соответствовал вашему диапазону. Но с точки зрения качества, я думаю, что если посмотреть на другие системы и придумать вещи, которые кажутся менее математичными, это сделает систему игрока более удовлетворительной.
источник
Как насчет этого: Добавьте константу, например 1000, ко всем соответствующим атрибутам. Тогда относительная разница становится очень маленькой.
источник
Знай свои номера
Добавим немного к ответу Филиппа , а именно, что rand [x] по сравнению с rand [y] не всегда дает то, что ожидаешь. Ниже таблицы, где мы сравниваем A с B. И A, и B имеют значения 1 ... 10. Мы сравниваем двумя способами (примечание: rand () в этом случае генерирует целые числа, т.е. rolls):
Дополнительно сравниваем
(в данном случае не имеет значения,> это или>, поскольку они так близко). Эти большие цифры в скобках.
Клетки содержат%. Каждый результат содержит 1 миллион итераций (сделан с использованием Dyalog APL ).
Если посмотреть на A = 2 и B = 3 (и 1 миллион тестов):
Сюрпризы могут быть такими:
На самом деле, я мог бы решить этот вопрос по-другому, просто набрав вручную таблицу 10x10 с хорошими желаемыми процентами (может быть, кто-то хочет и неровности?) Затем, если необходимо, интерполируйте между двумя значениями, чтобы получить точный процент, скажем, по какой-то причине 53. Затем легко сгенерировать попадание с вероятностью 53%, 0 или 1, просто выполнив rand (100) и протестировав если он меньше или равен 53 :-).
То есть по линии Джек Aidley упоминает.
источник
0.0
и1.0
. В этом случае разница между>
и>=
незначительна. Вы можете указать это.Традиционный подход, на который косвенно ссылаются несколько ответов, но на самом деле никто не разъяснил, заключается в том, что для выполнения задачи требуется фиксированный бросок кубика и добавление модификатора способности, получаемого из вашей статистики.
Например, если два игрока следуют процедуре:
и повторять до тех пор, пока одна сторона не победит другую, тогда вы получите числа в своем диапазоне: вот шансы на победу с данным числовым преимуществом для их модификатора:
источник
Персонажи не бросают вызов друг другу для превосходства. Они бросают вызов требованию. Что делать, если оба проходят требование Кто выигрывает? Я удивлен, что вы не оспорили логику настолько, что даже пошли на вычисления с ней.
В любом случае, вот две вещи, которые могут принести вам пользу.
Выиграй случай с преимуществом:
Если проходной балл / проверка умений - это бросок 10. A бросок 40. B бросок 42. Если победить должен только один. Начиная с равного A 50% Win / B 50% Win. Вы можете добавить%, чтобы выиграть шанс, основанный на количестве преимуществ. Ролл B имеет преимущество (42-40) / 40 = 5% в плане крена. Добавление этого напрямую увеличивает вероятность выигрыша B на 55%. Или вы можете определить свой шанс выигрыша на процент преимущества. Скажем, за каждое 100% -ое преимущество вы добавляете 10% -ный шанс на победу. Таким образом, если A бросает 10, а B бросает 20. Тогда A выигрывает 40%, а B выигрывает в 60% случаев.
Концепция честной случайности:
При стандартной 30% -ой вероятности выигрыша вы можете в итоге выиграть 38 проверок из 100.
Некоторые люди хотят дополнительного шага в справедливости и уверены, что 30% -ый шанс всегда выигрывает ровно 30 из 100 столкновений и достаточен для случайности, когда не знаешь, какие столкновения в последовательности являются выигрышем, а какие проигрышем.
Это особенно полезно для хорошо просчитанной игровой экономики. Потому что случайный показатель в 70% шанс выиграть. Скажите, что у моба 70% шанса сбросить 5 золота. Мобы могут в конечном итоге сбросить золото 81 раз из 100. Это приводит к потере баланса между доходами и расходами. И в зависимости от того, сколько субъектов / экземпляров используют такие списки, неизбежно возникает инфляция и / или дефицит. Конечно, многие люди даже не имеют приблизительной оценки полного изложения затрат / затрат своей экономики. Многим людям достаточно набрать «большинство» экономических баллов. И оставьте некоторые переменные поколения, которые не рассчитываются, и сохраняйте несоответствие со временем, даже с большой случайностью.
Инфляция и нехватка сами по себе не являются проблемой. Вы можете управлять несправедливой случайностью и даже непредвиденными переменными, если ваша экономика настроена адекватно реагировать на инфляцию и дефицит.
Зачем беспокоиться об этом, так как закон больших чисел выравнивает вещи в долгосрочной перспективе?
Не каждая среда может сохранять свое поведение при проектировании, рассчитывая на то, что в дальнейшем все выровняется ...
источник