Я работаю над игрой, и мне нужны идеи о том ущербе, который будет нанесен врагу, когда ваш игрок атакует. Общее количество здоровья, которое имеет противник, называется enemyHealth
, и имеет значение 1000. Вы начинаете с оружием, которое наносит 40 пунктов урона (может быть изменено). У игрока есть характеристика атаки, которую вы можете увеличить, называемая playerAttack
. Это значение начинается с 1, и может иметь максимальное значение 100 после того, как вы повысите его уровень многократно и сделаете его дальше в игре. Количество урона, наносимого оружием, сокращается и уменьшается, и каждый раз при попадании противника вычитается 40 очков из общего количества 1000 очков здоровья. Но то, что playerAttack
делает, это добавляет к этому значению в процентах. Вот алгоритм, который я сейчас имею. (Я убрал все графические интерфейсы, классы и т. Д. И дал переменным очень точные имена)
double totalDamage = weaponDamage + (weaponDamage*(playerAttack*.05))
enemyHealth -= (int)totalDamage;
Похоже, это отлично работает по большей части. Итак, я проверил некоторые значения ...
//enemyHealth ALWAYS starts at 1000
weaponDamage = 50;
playerAttack = 30;
Если я установлю эти значения, то количество урона, нанесенного врагу, составит 125. Это выглядело как хорошее число, поэтому я хотел посмотреть, что произойдет, если атака игроков будет максимизирована, но с самым слабым стартовым оружием.
weaponDamage = 50;
playerAttack = 100;
totalDamage заканчивается 300, что убьет врага всего за несколько попаданий. Даже с такой высокой атакой я бы не хотел, чтобы самое слабое оружие могло так быстро убивать врага. Я думал о добавлении защиты, но я чувствую, что игра потеряет последовательность и станет несбалансированной в долгосрочной перспективе. Возможно, хорошо разработанный алгоритм модификатора уменьшения оружия подойдет для оружия более низкого уровня или чего-то в этом роде. Просто нужно сделать перерыв в попытках выяснить, как лучше всего это сделать, и, возможно, кто-то, имеющий опыт работы с играми и поддерживающий постоянный уровень, может дать мне несколько идей / указателей.
источник
playerAttack
показатель до 100? Учитывая, что это максимальное значение, не будет ли уместным убийство врага в нескольких ударах? (Является ли враг 1000-HP чем-то, что вы увидите в начале игры? Стандартный враг? Босс?)Ответы:
Ответ, предоставленный 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) , например, такую, которая заставляет число требуемых попаданий быстро увеличиваться по ходу игры, а затем и на плато, и полученные решения будут отличаться.
источник
a
значит снова?» и прокрутить вверх?Я бы порекомендовал вам разработать свою игру в другом направлении: сначала подумайте, как вы хотите, чтобы ваша игра играла (с точки зрения игрового опыта, а не с точки зрения чисел), а затем разработайте и формулы, и диапазоны чисел, чтобы получить этот результат.
Ваша цель в игровом процессе - чтобы убить врага, требуется определенное количество ударов. Сколько хитов зависит от трех переменных:
Сначала вы должны создать таблицу всех возможных комбинаций этих трех переменных: низкий, средний или высокий уровень (пока нет конкретных чисел, только «низкий», «средний» или «высокий») и сколько хитов вы хотите потребоваться для этих комбинаций.
Затем вы должны попытаться найти формулу и диапазоны значений, которые лучше всего соответствуют вашим желаемым значениям.
источник
Самый простой способ, это увеличить урон от оружия между уровнями оружия в геометрической прогрессии.
Однако важно то, что Вы также должны определить, как растет здоровье врагов, когда они становятся сильнее. Поэтому, когда вы очень сильны, вы должны убивать легких врагов всего несколькими ударами, но убивать тех, кто находится на вашем уровне, должно быть относительно труднее, чем врагов, которые были на вашем уровне в начале. Поэтому я хотел бы сделать так, чтобы это выглядело примерно так:
Я подправил эти постоянные факторы в формулах просто для достижения результатов, которые я считаю приемлемыми, но важно то, где вы хотите линейного роста и где вы хотите экспоненциального роста.
Вы также должны заметить, что, например, чтобы убить врага 20-го уровня с атакой 100 и оружием 1-го уровня, которое требует 6 урона, потребуется много времени. Если, на Ваш взгляд, это занимает слишком много времени, играйте с константами.
источник
Я считаю, что метод World of Warcraft - один из лучших. Базовые характеристики игроков оказывают слабое влияние на общий урон, причем большая часть модификатора урона зависит от бонусных характеристик на экипировке. Это значительно облегчает расширение игры и ее баланс со временем
источник