Ответ, предоставленный Grzegorz Sławecki, уже хороший, но я хотел объяснить обоснование его метода и дать вам инструменты для адаптации решений к вашим потребностям в игровом процессе.
Параметры настоящей задачи: уровень атаки игрока a , урон от оружия w , общий нанесенный урон за одну атаку d , здоровье врага H и минимальное количество ударов, необходимых для убийства врага, назовем его n .
Если вы хотите, чтобы игрок , чтобы убить в п хитов, то его общий ущерб d должен быть таким , чтобы
(n-1) .d <H ≤ nd или, другими словами, n = ceil (H / d) .
d зависит от урона оружия w и уровня атаки игрока a, и мы можем ожидать, что оружие улучшается с ростом уровня, поэтому давайте напишем d (a) и w (a) вместо простых d и w . Также ожидается, что враги, с которыми сталкивается игрок, станут более жесткими, поэтому снова H (a) . Это все возрастающие функции , и вы хотите , чтобы они удовлетворяют указанные выше неравенства. Неизвестные проблемы являются функциями. Вы устанавливаете одно в качестве ограничения, а другие находите. У вас есть степени свободы, хотя это хорошо.
Если я хорошо понимаю ваш вопрос, вы имеете в виду точный игровой процесс, и этот игровой процесс в основном представлен здесь количеством ударов, необходимых для убийства врага, n (a) . Поэтому установите n (a) в зависимости от игрового процесса, который вы представляете для игры, а затем найдите остальные переменные задачи . Это то, что вы всегда должны делать, потому что, как показывает ваш вопрос, ваша первая попытка состояла в том, чтобы попробовать алгоритм, который, как вы думали, мог бы сделать, а затем понял, что это привело к нежелательному игровому процессу.
Предположим, например, что вы хотите, чтобы игрок получал все больше и больше ударов по ходу игры. Вы также хотите, чтобы по мере увеличения необходимого количества попаданий оно увеличивалось все реже и реже, чтобы игрок проводил большую часть игры, ударяя 5 раз, чем 2 раза. Вот как выглядит n (a) :
Используемая функция: n (a) = ceil (2 / 3.srrt (a)) .
Мы хотим, чтобы H (a) / d (a) оставалось в пределах диапазонов значений, которые делают n (a) желаемым значением, и поскольку n (a) = ceil (H (a) / d (a)) , эти диапазоны являются следующие прямоугольники:
и H (a) / d (a), естественно, можно установить равным 2 / 3.sqrt (a), чтобы мы получили следующий график с красной кривой H (a) / d (a) :
Замечание: мы можем легко найти H (a) / d (a) здесь, потому что мы знаем функцию, для которой n (a) является ceil, но если бы наша спецификация для n была менее приятной, нам пришлось бы сделать нашу собственную подгонку функционировать, используя различные приемы. Не все проблемы такие приятные!
Итак, мы хотим, чтобы H (a) / d (a) напоминали настраиваемую функцию квадратного корня, и мы знаем, что H и d должны увеличивать функции. Решений много. Например,
H (a) = a. 2 / 3. площадь (а) и d (а) = а
Но мы бы хотели, чтобы урон и HP противника увеличивались очень сильно, чтобы в конце игры были большие, впечатляющие цифры, просто для стиля, поэтому мы вместо этого устанавливаем
H (a) = a². 20/3. Кв. (А) и d (а) = 10.a²
Весь смысл, и лучшая часть, заключается в следующем: вы знаете, что ваши решения проблемы ( H (a) и d (a) ) соответствуют спецификациям ( n (a) ), поэтому вы получаете то же самое n (a) , но у вас есть свобода. Вы точно знаете, какая у вас есть свобода, и вы можете использовать ее для настройки опыта. Вы должны всегда стараться дать себе такую свободу, удовлетворяя при этом ваши самые важные потребности, когда это возможно.
Теперь, когда мы выбрали одноразовый урон d (a) , и поскольку d (a) зависит от урона от оружия w (a) , мы можем использовать d (a) в качестве нашей спецификации и попытаться найти w (a ), что дает нам это д (а) . Принципы одинаковы, проблема в другом: мы хотим, чтобы игрок наносил больше урона при увеличении его уровня, даже если оружие осталось прежним, и мы также хотим, чтобы урон увеличивался, когда само оружие улучшается, а уровень остается то же.
Но какое значение должен иметь каждый фактор? Предположим, мы хотим, чтобы уровень был важнее оружия: большая часть вариаций d (a) = a² должна быть независимой от w (a) , например, с
w (a) = 22.sqrt (a) и, следовательно, d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))
Мы получаем следующий график для w (a) ...
... и все тот же г (а) , потому что мы снова нашли решение , которое подчинялось спецификации , здесь d (а) , и у нас есть свойства , указанные выше , с ш и вклад в повреждение (предположим , что мы смотрим на d как функция от a и w : тогда, если бы а были фиксированными, и мы имели бы w, изменяющийся в уравнении d (a, w) = a / 30.w , d все равно был бы возрастающей функцией от w , и то же самое верно если зафиксировать вес и сделать различаться).
Это w (a) может дать вам значение, которое будет отображаться в описании игрового оружия: мы получим «Урон от оружия: 220» с лучшим оружием в игре, например.
Мы могли бы использовать совершенно другую спецификацию для нашего игрового процесса и, следовательно, для n (a) , например, такую, которая заставляет число требуемых попаданий быстро увеличиваться по ходу игры, а затем и на плато, и полученные решения будут отличаться.
playerAttack
показатель до 100? Учитывая, что это максимальное значение, не будет ли уместным убийство врага в нескольких ударах? (Является ли враг 1000-HP чем-то, что вы увидите в начале игры? Стандартный враг? Босс?)