В моей игре XP, чтобы достичь следующего уровня, это Текущий уровень × Порог уровня . Учитывая это, как я могу получить свой текущий уровень из общего количества когда-либо заработанных XP ?
Например:
Level Threshold = 50
Current Level = 1
Начиная с уровня 1, мне нужно (1 × 50) = 50 XP, чтобы добраться до уровня 2, и так далее.
Level 1: 50 XP needed to reach level 2
Level 2: 100 more XP needed to reach level 3
Level 3: 150 more XP needed to reach level 4
Другими словами, таблица прогрессии выглядит следующим образом:
Level 1: 0 XP to 49 XP
Level 2: 50 XP to 149 XP
Level 3: 150 XP to 299 XP
Level 4: 300 XP to 499 XP
Если у меня 300 XP, я только достигну уровня 4. Как я могу рассчитать это вообще?
levels
mathematics
progression
Джей ван Дийк
источник
источник
Ответы:
Разрабатывая математику и решая задачи на
Level
основе опытаXP
, мы получаем:Например, каков уровень игрока для ?Иксп= 300
Как просили.
Или для чего нужен уровень
XP = 100000
?В более общем виде для произвольного начального порога на уровне 1:
Вы также можете сделать обратное и рассчитать
XP
необходимый для любого данного уровня, решив вышеупомянутую формулу для XP.Обратите внимание, что приведенная выше формула работает с дробями, но вам нужно округлить до следующего целочисленного значения. Например, в C ++ / C # вы можете использовать (int) Level.
Чтобы получить приведенную выше формулу замкнутой формы, я использовал разностные уравнения, суммирование Гаусса и квадратную формулу.
Если вы заинтересованы в решении этой формулы шаг за шагом ...
Мы делаем рекурсивный алгоритм, начав наши соображения, которые в конечном итоге
Experience(next_level) = Experience(current_level) + current_level*50
.Например, для получения имеем:ИкспL e v e l 3
Где,
2*50
исходя из запроса ОП, опыт, необходимый для достижения следующего уровня, является текущим уровнем * 50.Теперь подставим в формулу с той же логикой. То есть:ИкспL e v e l 2
Подставим в приведенную выше формулу:ИкспL e v e l 2= XпL e v e l 1+ 2 × 50
и составляет всего 50, что является нашей отправной точкой. следовательноИкспL e v e l 1
Мы можем распознать схему рекурсивного вычисления более высоких уровней и конечную цепочку суммирования.
Где N - уровень, который должен быть достигнут. Чтобы получить XP для уровня N, нам нужно решить для N.
Теперь правая рука просто суммирование от 1 до N-1, которое может быть выражено известным гауссова суммирования . следовательноN×(N+1)÷2−N
или просто
Наконец, все на одной стороне:
Теперь это квадратичная формула, дающая отрицательное и положительное решение, из которых важен только положительный, поскольку нет отрицательных уровней. Теперь мы получаем:
The current level conditional on XP and linear threshold is therefore:
Note Knowing these steps can be useful to solve for even more complex progressions. In the RPG realm you will see besides a linear progression as here, the actually more common fractional power or square relationship, e.g.Level=XP√5.0 . However, for game implementation itself, I believe this solution to be less optimal as ideally you should know all your level progressions beforehand instead of calculating them at runtime. For my own engine, I use therefore pre-processed experience tables, which are more flexible and often faster. However, to write those tables first, or, to just merely ask yourself what
XP
is needed to, let's say, obtainLevel 100
, this formula provides the quickest way aimed at answering the OP's specific question.Edit: This formula is fully working as it should and it outputs correctly the current
level
conditional onXP
with a linear threshold progression as requested by the OP. (The previous formula outputted "level+1" by assuming the player started from Level 0, which was my erring--I had solved it on my lunch break by writing on a small tissue! :)источник
The simple and generic solution, if you don't need to repeat this calculation millions of times per second (and if you do, you're probably doing something wrong), is just to use a loop:
The big advantage of this method, besides requiring no complicated mathematics, is that it works for any arbitrary exp-per-level function. If you like, you can even just make up arbitrary exp values per level, and store them in a table.
If you do (for some strange reason) need an even faster solution, you can also precalculate the total amount of exp needed to reach each level, store this in a table, and use a binary search to find the player's level. The precalculation still takes time proportional to the total number of levels, but the lookup then requires only time proportional to the logarithm of the number of levels.
источник
The question has been answered with code, but I think it should be answered with math. Someone might want to understand instead of just copy and paste.
Your system is easily described by a recurrence relation:
Which offers a nice simple closed form solution forXP :
Which we can solve forLevel :
(truncate to integer, because the player needs all the required XP to get any of the level-up bonus)
источник
XP_Level(0) = 50
и тогда мы можем просто избежать решения? Есть ли плюсы, плюсы, минусы? Я думаю, что было бы хорошо затронуть этот ответ. +1Here's one approach to solving the problem using basic algebra. If you don't care about the steps, skip to the bottom.
An easy thing to come up with is, given a level
n
, the total experiencee
needed to obtain that level:The
t
term stands for the increase in XP needed per level - 50, in the example.We can solve the above using the formula for arithmetic sequences (sum identity):
However, we want the opposite formula - the player's level given their total experience. What we really want to do is solve for the level,
n
. First, let's group the terms:Now we can use the quadratic formula:
Final equation:
источник
Весь математический анализ здесь очень важен по разным причинам, некоторые из которых применимы к разработке игр.
НО
Это сайт по разработке игр, а не сайт по математике. Итак, давайте обсудим, как эти вещи работают не как алгоритмические ряды, а как наборы , потому что это та математика, которая применима к прокачке в играх, которые вы действительно можете разработать для продажи, и именно эта система лежит в основе большинства (но не всех) прокачки системы (по крайней мере, исторически).
Игроки, как правило, предпочитают красивые круглые числа, которые легко запомнить и визуализировать, и нигде это не является более важным, чем в игровой системе, основанной на уровнях, где игроку требуется X сумм очков опыта, чтобы перейти к уровню Y.
Есть две веские причины для выбора круглых чисел:
Круглые числа приятны. Цель игр - быть приятным. Приятность очень важна, тем более что игровые дилеммы зачастую не очень приятны по дизайну.
Почему это важно иметь в виду?
Большинство алгоритмов составных рядов не дают хороших круглых чисел
Большинство серий не останавливаются на красивой точке (каждый ответ, который я видел здесь до сих пор, продолжается вечно). Так что же нам делать? Мы приближаемся, а затем определяем, какой набор уровней должен применяться к игровой системе .
Как мы узнаем, какие приближения являются подходящими? Мы рассмотрим, в чем смысл прокачки игровой системы.
В большинстве игр есть ограничения уровня, которые в какой-то момент вступают в силу. Есть несколько способов, которыми это может сыграть:
XP + (XP * Modifier)
или чем-то еще).Там являются некоторыми игровыми системами , где нет никакого максимального уровня и система алгоритмический определяется. Обычно системы, подобные этой, используют какую-то систему X-powers-of-Y, чтобы числа быстро взрывались. Это позволяет очень легко добраться до уровня L-1, при этом разумно ожидается, что большинство игроков попадут на уровень L, чрезмерно трудно добраться до уровня L + 1, а игроки постареют и умрут до достижения уровня L + 2. В этом случае «L» - это уровень, который, как вы решили, является целевым уровнем, подходящим для игры, и на котором, как правило, он ограничил бы систему, но оставил бы возможность для людей ввести себя в заблуждение, думая, что это хорошая идея для XP навсегда. (Зловещий!) В такой системе математика, найденная здесь, имеет смысл. Но это очень узкий и редко встречающийся случай в реальных играх.
Так что же нам делать?
Рассчитать уровни и XP? Нет . Определить уровни и XP? Да.
Вы определяете, что означают уровни, а затем решаете, какой доступный набор уровней должен быть доступен. Это решение сводится либо к гранулярности в игровой системе (есть ли огромная разница в силе между уровнями? Каждый уровень дает новую способность? И т. Д.), А также используются ли уровни в качестве системы гейтинга («Не могу» ходите в следующий город, пока не достигнете 10-го уровня, детка. ", или в соревновательной лестничной системе применяются уровни на уровне и т. д.).
Код для этого довольно прост, и это просто определение диапазона:
Или с оператором if, или case, или цепочкой if / elif, или с тем языком, который вы используете, поддерживает (эта часть является наименее интересным элементом любой игровой системы, я просто предоставляю два пути, потому что я случайно прямо сейчас в режиме Erlang, и приведенный выше синтаксис может быть не очевиден для всех.):
Это удивительная математика? Нет, совсем нет. Это ручная реализация определения заданного элемента? Ага. Это все , что есть, и это в значительной степени так , как я видел , что это на самом деле сделано в большинстве игр на протяжении многих лет.
Как примечание стороны, это не должно быть сделано каждый раз, когда игрок получает опыт. Обычно вы отслеживаете «XP to go» как одно значение, и как только игрок исчерпывает или превосходит «to go» значение (в зависимости от того, как вы это делаете), вы вычисляете это один раз, чтобы выяснить, где игрок на самом деле at, сохраните это, вычислите следующее «идти» минус остаток (если перенос XP вперед разрешен) и повторите.
источник