проблема
Игрок получает 5 очков за уровень до уровня 80 с максимумом 400. Есть 5 характеристик, которые будут распределены, и нет максимального ограничения на количество, которое вы можете добавить к стату.
- Сила
- выносливость
- интеллект
- проворство
- Удача - дарует критический шанс и критический урон
Я хотел бы реализовать уравнение убывающей доходности, скажем, на удачу. Для критического шанса я не хочу, чтобы игрок имел возможность нанести 100% критического шанса.
Будет потолок, к которому он достигнет, так как все более и более замедляющийся рост достигает 0 к добавленной точке.
Например, если максимальный критический шанс, который я хочу получить от игрока, составляет 40%, каждое очко удачи будет увеличивать критический шанс все меньше и меньше, пока критический шанс не достигнет примерно 40%. По которой 1 удача даст очень очень маленькую сумму.
Какие-либо решения? Спасибо и ваша помощь очень ценится!
Ответы:
Вы хотите начать с асимптотической функции. То есть тот, который начинается с числа
a
и приближается к другому числуb
, но на самом деле никогда не достигает его. Это, вероятно, будет проще, еслиa = 0
иb = 1
. Вы возьмете это уравнение, введете количество очков статов (очков удачи), которое имеет персонаж, и получите фактическое значение статов (шанс крита) в качестве выходных данных.Очень простой пример -
y = x / (x + n)
гдеn
некоторая положительная константа. Вотx
ваш ввод, в котором вы вводите количество баллов статистики, иy
ваш вывод, где вы получаете окончательное значение статистики.Чтобы
n = 5
проверить, как это выглядит:Когда вы кормите,
x = 0
вы получаетеy = 0
, но независимо от того, насколько большойx
вы положили,y
никогда не достигает 1. Идеально.Теперь вы можете настроить это по своему желанию сердца. Вы можете умножить на коэффициент масштабирования, чтобы установить «ограничение» на то, что вы хотите.
y = a * x / (x + 5)
, Если вы хотите, чтобы кепка составляла 40%, умножьте на .4.y = .4 * x / (x + n)
, Теперь, когда вы кормите вx
'ы,y
увеличится, но он никогда не достигнет .4.Отрегулируйте,
n
чтобы установить, насколько быстро или медленно увеличивается уравнение.n = 100
будет расти намного медленнее, чемn = 5
:Вы можете решить это уравнение,
n
если знаете, что хотите получить значение статистики, которое вы хотите достичь в определенном количестве. Допустим, у персонажа должно быть 35% Шанса Крита при 100 очках Удачи. Решая.35 = .4 * 100 / (100 + n)
дляn
урожайностиn = 14.29
.Эти числа не обязательно должны быть необработанными константами. Может быть, другие показатели идут в расчете значений
n
. Может быть, некоторые персонажи имеют разные значенияn
, поэтому они лучше масштабируются в своей «предпочтительной» статистике.Если вам нужна кривая, которая имеет другую форму или является более сложной, есть много других примеров асимптотических функций, которые вы также можете использовать. Я оставлю вас, чтобы изучить это, как вы хотите.
источник
P = x/(x+n)
- это вероятность того, что с учетом сумки с n черными камнями и x белыми камнями вы вытянете белый камень из слепой сумки. Один из подходов, который вы можете сделать, - это установить криты X = ваша удача, а N = их удача. Тогда ваш шанс критического удара составляет 50%, если вам повезло с противником. Если вы хотите, чтобы базовый шанс составлял 10%, тогда мы X = ваша удача, N = 9x их удача.Хорошая база будет похожа на функцию
arctan
, поскольку она проходит через начало координат и имеет горизонтальную асимптоту.Масштаб его
40 / (pi/2)
, или80/pi
для требуемого предела. Затем трансформируйтесь,luck
чтобы получить искривленную кривую.источник
Мне очень нравится, как игры Souls решают эту проблему. Вместо того, чтобы каждая статистика давала бонусы на основе непрерывной функции, как было предложено, она дает бонусы в кусочно-линейной функции.
Я не могу вспомнить точные цифры на макушке, но функции соответствуют следующим (каждая статистика имеет свои константы)
Этот метод дает много преимуществ для дизайнера и игрока. Преимущество дизайнера заключается в том, что вы можете настроить точную выгоду за очко в навыке довольно тривиально, а игрок выигрывает, поскольку точно знает, какую выгоду он получит от уровня к уровню.
В случае непрерывной функции некоторые уровни могут дать преимущество, которое не отражается в числах из-за наложения измерений. Конечно, последний уровень дал вам 0,9 увеличения бонуса XYZ, но поскольку фактическое значение изменилось с 23,52 до 24,42, и вы округлили число до его отображения, игрок не осознает, что что-то изменилось.
С точки зрения UX, я бы определенно предложил использовать кусочно-линейную функцию. Тем не менее, использование непрерывной функции может быть легче настроить позже, так как игроки не будут привязаны к круглым константам.
источник
ceil
за суммы увеличения , прежде чем добавить, и разрешить только целым числом стат уровней. илиfloor
затем ,x <= 0: x = 1
чтобы избежать случайного перехода на мягкую крышку.Ян Дворжак указывает на экспоненциальную функцию в комментарии. Я объясню это здесь.
Обратите внимание, что экспоненциальные (и триггерные) операции значительно дороже в вычислительном отношении, чем даже операции с квадратным корнем, которые сами по себе намного хуже, чем базовая математика, поэтому, вероятно, вам лучше использовать подход Адама, если вы будете выполнять эти вычисления много раз в секунду , Если вы просто рассчитываете значения, когда уровень игрока, смена снаряжения и т. Д., Скорость не важна, так что используйте то, что дает лучшую кривую.
Экспоненциальная функция некоторое основание, Б , в некоторой степени, х ,
y=B^x
. Математики обычно используют основание e (~ = 2.718), но нет причин, по которым вы не можете использовать 2 или 10, если хотите.y=e^x
выглядит так:Обратите внимание, что левая сторона асимптотически движется к 0. Таким образом, мы можем перевернуть ось х, выполнив
y=e^(
-x)
, но она все еще уменьшается от 1 до 0, и мы хотим, чтобы она поднималась. Таким образом, мы можем перевернуть его по оси Y с помощьюy=
-e^(-x)
. Теперь это возрастание от -1 до 0. Мы можем добавить 1, чтобы получитьy=
1,- e^(-x)
и это возрастание от 0 до 1.Отсюда, это просто вопрос масштабирования по вертикали и горизонтали. Мы можем умножить всю вещь на некоторое значение, назовем это A , которое устанавливает асимптотический предел. Затем мы можем умножить x на значение скорости изменения k , чтобы скорректировать, насколько быстро оно приближается к пределу.
Это дает нам окончательное уравнение
y=A*(1 - e^(-k*x))
. Используя значенияk=0.012
andA=0.5
, мы можем установить ограничение в 50% и позволить ему приблизиться к этому пределуx=400
.Теперь вы можете сделать несколько изменений в этом. Один твик, который я сделал, менялся
A=0.5041
, поэтому, если мы округлим до процента с двумя десятичными знаками (например, 32,23%), y (399) = 49,99% и y (400) = 50,00%. Начиная с y (347), есть несколько мест, где требуется 2 очка, чтобы получить изменение в 0,01%. Но этот последний возможный момент все еще дает (едва) ощутимое преимущество и доводит его до 50%.С другой стороны, мы можем настроить
k
значение, чтобы получить аналогичный эффект. Приk=0.02305
значении округляется до 49,99% приy=399
и 50,00% приy=400
. Однако проблема заключается в том, что в конце график очень неглубокий - для получения последней сотой процента (отy(352)=49.99%
доy(399)=49.99%
доy(400)=50.00%
) требуется 48 баллов, а последний шанс крита в 1% получает колоссальные 230 баллов (отy(170)=49.01%
доy(400)=50.00%
) что, вероятно, слишком уменьшается при возврате.Если вы хотите, вы можете отрегулировать как A, так и k, чтобы оно уменьшалось до несколько более высокого предела с более медленной скоростью, чтобы получить что-то среднее между линейным и экспоненциальным затуханием. Делая
y=0.6*(1-e^(-0.00447*x))
, вы в конечном итоге с этим:Обратите внимание, что кривая продолжается более 50%, но, поскольку существует жесткий предел в 400 баллов, игрок не может пройти этот балл (и, если ему все-таки удастся его пройти, остаётся жесткий предел в 60% крит). С помощью этого уравнения вы можете использовать 1 знак после запятой и по-прежнему видеть увеличение каждые 2–3 балла с последним тиковым значением от
y(399)=49.9%
доy(400)=50.0%
.Математически, более ранние уравнения могут показаться лучше, поскольку на самом деле они приближаются к 50%, но я лично считаю, что прирост на 0,1% в каждой паре очков кажется лучше, чем прирост на 0,01%. Даже с
A=0.05041
иk=0.012
, требуется 102 балла, чтобы перейти отy(298)=49.00%
кy(400)=50.00%
. 25% ваших очков, потраченных на 2% вашего крита, вероятно, слишком уменьшены. Уравнение 60% берет только 20 баллов за последний процент (что все еще в 5 раз выше, чем 4 балла, необходимых для первого процента).С этими последними несколькими уравнениями я просто включил уравнения в электронную таблицу и вручную настраивал значения, пока они не выглядели хорошо. Вам бы пришлось сделать что-то похожее, если бы вы хотели другую шапку.
источник
Для очень простого решения, как насчет квадратного корня х 2
Квадратный корень из 400 (максимально возможный) равен 20, 20 * 2 = 40.
источник
1/2
), и вы не объясняете причины, почему это может быть полезно.