当每个等级按比例需要更多XP时,如何从总XP中计算当前等级?


33

在我的游戏中,达到下一个等级所需的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级。如何大致计算?



当前级别越高,下一个级别所需的XP数量不会增加吗?
2015年

那么,您需要回答的第一个问题是:每个级别的“阈值”值是多少?根据您的示例,如果我们假设300 XP是达到第4级的最小值,那么您的阈值将在第3级之后增加到75。一旦确定了阈值上升的频率,便可以提出一种算法来计算它像其他人试图在他们的答案做
Taegost

3
Majte对于如何计算给出了一个很好的答案,但是“最佳”答案就是根本不计算它。每次升级时重置增量,您就拥有了所需的所有信息(级别,+ 1,总xp,增量xp),可以轻松计算出需要使用/显示的任何内容
Jon Story

@JonStory确实。我在回答中对此进行了详细说明,因为,实际上谁一直在动态地计算水平?本质上,这个问题只是一个数学问题,因为它根本没有考虑游戏系统中关卡的作用。
zxq9

Answers:


33

在计算数学并解决Level经验条件时XP,我们获得:

大号ËvË=1个+1个+8×XP÷502

例如,对于,玩家的等级是多少?XP=300

1个+1个+8×300÷502=4

按照要求。

或者,水平是XP = 100000多少?

1个+1个+8×100000÷502=63

更普遍地表示,对于级别1 的任意起始阈值

大号ËvË=1个+1个+8׍H[RËsHØd÷502

您也可以XP通过求解上述XP公式,进行相反的操作并计算任何给定级别所需的数量。

XP=大号ËvË2-大号ËvË׍H[RËsHØd2

请注意,上面的公式适用于分数,但是您需要四舍五入为下一个整数值。例如,在C ++ / C#中,您可以使用(int)Level。

为了获得上述封闭形式公式,我使用了差分方程,高斯求和和二次公式。

如果您对逐步解决此公式感兴趣,请...

我们通过最终考虑开始进行递归算法 Experience(next_level) = Experience(current_level) + current_level*50

例如,要获得我们有:XP大号ËvË3

XP大号ËvË3=XP大号ËvË2+2×50

其中,2*50来自OP的请求经验需要达到一个新的水平是当前等级* 50。

现在,我们用相同的逻辑将入公式。那是:Xp大号ËvË2

入上式:XPLevel2=XPLevel1+2×50

XpLevel3=XpLevel1+1×50+2×50

仅仅是50,它是我们的起点。因此XpLevel1

XpLevel3=50+2×50=150

我们可以识别出递归计算更高级别和有限的求和链的模式。

XpLevelN=50+2×50+3×50+...+(N1)×50=i=0n1i×50

其中N是要达到的水平。要获得N级的XP,我们需要求解N。

XpLevelN÷50=i=0n1i

现在,右侧只是从1到N-1的总和,可以用著名的高斯总和。因此N×(N+1)÷2N

XpLevelN÷50=N(N+1)÷2N

要不就

2(XpLevelN50)÷50=N(N+1)2N

最后,将所有内容放到一边:

0=ñ2-ñ-2×Xp大号ËvËñ÷50

现在这是一个产生负和正解的二次方程式,因为没有负水平,所以只有正相关。现在,我们获得:

ñ=1个+1个+4×2×Xp大号ËvËñ502

因此,以XP和线性阈值为条件的当前水平为:

大号ËvË=1个+1个+8×XP÷ŤH[RËsHØd2

注意了解这些步骤对于解决更复杂的进度可能很有用。在RPG领域中,除了这里的线性级数外,您还将看到实际上更常见的分数幂或平方关系,例如。但是,对于游戏实现本身而言,我认为此解决方案并不是最佳选择,因为理想情况下,您应该事先了解所有级别的进度,而不是在运行时进行计算。因此,对于我自己的引擎,我使用经过预处理的体验表,这些表更灵活并且通常更快。但是,首先写这些表,或者只是问问自己需要什么,比方说获得,此公式提供了旨在回答OP特定问题的最快方法。大号ËvË=XP5.0XPLevel 100

编辑:该公式可以正常工作,并且可以按照OP的要求以线性阈值级数正确输出当前level条件。(以前的公式通过假设玩家从0级开始输出“ level + 1”,这是我的错-我在午休时间通过写在一张小纸巾上解决了这个问题!:)XP


评论不作进一步讨论;此对话已转移至聊天
乔什

@JoshPetrie对于我们稍后才看到此问题的问题是,聊天链接已断开。有任何恢复方法吗?
MAnd

@M我未删除它,但它将在八天左右再次自行消失。
乔什

25

简单和通用的解决方案,如果你不需要重复这种计算每秒百万次(如果你这样做,你可能做错了),只是用一个循环:

expLeft = playerExp
level = 1
while level < levelCap and expLeft >= 0:
    expLeft = expLeft - expToAdvanceFrom(level)
    level = level + 1

if expLeft < 0: level = level - 1     # correct overshoot

除了不需要复杂的数学方法外,此方法的最大优点是它适用于任何任意的exp-per-level函数。如果愿意,您甚至可以只组成每个级别的任意exp值,并将它们存储在表中。

如果确实(出于某种奇怪的原因)需要更快的解决方案,则还可以预先计算达到每个级别所需的exp 总量,将其存储在表格中,然后使用二分查找法来找到玩家的级别。预先计算仍然需要与水平总数成比例的时间,但是查找只需要与水平的对数成比例的时间。


4
最灵活的解决方案。而且由于一次计算的速度无关紧要,所以我猜是最好的一次计算。
GameAlchemist

4
@Majte:也许我还不够清楚。我并不是说任何发布的解决方案都需要“数百万次迭代”。我的意思是,除非您以某种方式每秒需要计算玩家的水平数百万次,否则我的(幼稚的暴力)解决方案已经足够快了。其他解决方案基于代数推导该级别作为exp函数的闭式公式,可能甚至更快-但是对于很少被调用的代码(任何小于每秒1,000次的代码肯定算作此处为“稀有”),则不会有明显区别。
Ilmari Karonen

2
哦,我明白了,抱歉。我完全同意您的看法,您可以为每个级别的用户定义的升级步骤提供一个很好的选择。但是,毕竟可能使用预处理表。
Majte

2
该解决方案的简单性使其成为赢家。不要忽视可读性和可维护性的价值。
毛瑟

1
计算机擅长执行重要任务,而不是人。您想简化程序员的工作,程序员,如果有必要,则以牺牲计算机为代价。使用此解决方案,您只需要编写一种方法,即正向,而不是正向和反向。最简单的解决方案不是他在代码中拥有的解决方案,而是构建该查找表。Ram很便宜,请使用它。
毛瑟

11

这个问题已经用代码回答了,但是我认为应该用数学来回答。有人可能想了解,而不仅仅是复制和粘贴。

经验值水平+1个=经验值水平+水平

经验值

经验值水平=水平-1个水平2

水平

水平=2+8经验值2+1个2

(截断为整数,因为玩家需要所有必需的XP才能获得任何升级奖励)


2
我喜欢这个答案。简洁明了。
Almo

嘿,米克;自从我建立循环关系已经有一段时间了。我们是否也不能指定基本情况XP_Level(0) = 50,然后就可以避免求解?有什么好处,优点和缺点?我认为最好回答这个答案。+1
旺市在2015年

@VaughanHilts我不确定您的记法如何工作或您要问什么,请随时在gamedev聊天中ping我吗?
MickLH

我理解代码答案比这容易得多。
法拉普

继续努力@Pharap。在我十几岁的时候,我比数学更容易理解代码,但是有了经验和知识,数学将在生活中的每个地方变得显而易见。
MickLH

10

这是使用基本代数解决问题的一种方法。如果您不关心这些步骤,请跳到底部。

给定一个级别n,容易想到的是e获得该级别所需的全部经验:

e = sum from k=1 to n of (t(k-1))

t术语表示每级需要的XP增加-在本示例中为50。

我们可以使用算术序列(总和)的公式来解决上述问题:

e = t/2 * n(n-1)

但是,我们需要相反的公式-玩家的水平(根据他们的总经验)。我们真正想做的是解决水平n。首先,让我们对术语进行分组:

n^2 - n - 2e/t = 0

现在我们可以使用二次公式:

n = (1 + sqrt(1+8e/t))/2

最终方程式:

level = 0.5 + sqrt(1 + 8*(total experience)/(threshold)) / 2

1
感谢您的回答。但是,如果我想将阈值更改为其他变量怎么办?我想用50000或1000 0代替50。我应该如何修改方程式?
JayVDiyk

2
是的,解决方案应该相同。如果有人感兴趣,我想列出解决方案的步骤。@JayVDiyk-将编辑帖子。
2015年

这对您来说有点厚脸皮,因为我评论说,下班后我将发布完整解决方案;)没关系,我不在乎。通常的事情是参考正确答案进行回答,并记下扩展范围。神经心,喜欢解决它。希望在这里发布更多类似的问题。
Majte

抱歉,一定错过了该评论。并不是要从您的身下或类似的东西中偷出来-下次我会记住这一点。您的答案肯定比我编辑后要彻底!
Chaosed0

1
+1; 在不冒犯@Majte意图的情况下,我个人认为您的解释更具可读性。
Ilmari Karonen 2015年

3

出于各种原因,此处涉及的所有数学知识都非常重要,其中某些原因适用于游戏开发。

这是游戏开发网站,而不是数学网站。因此,让我们讨论一下这些东西不是作为算法系列而是作为集合来工作的,因为这是一种适用于您可能实际开发销售的游戏中的关卡的数学运算,而这是大多数(但不是全部)关卡的基础系统(至少在历史上)。

玩家倾向于喜欢易于记忆和可视化的精美轮数,而在基于等级的游戏系统中,玩家需要X数量的xp才能晋升到Y等级,这一点最重要。

选择整数有两个很好的理由:

  • 等级经验本身是一个很好的整数,例如“ 100; 200; 1,000,000;等”。
  • 等级之间的差异往往是玩家可以浏览并在脑海中计算的另一个不错的整数。

整数很有趣。游戏的目的是令人愉快的。愉悦性很重要,特别是因为游戏困境在设计上通常不是令人愉快的。

为什么要记住这一点很重要?

大多数复合序列算法不会产生很好的整数

大多数系列影片并不会停留在一个美好的时刻(到目前为止,我在这里看到的每个答案都将永远持续下去)。那么我们该怎么办?我们进行近似估算,然后确定应将哪些级别的水平应用于游戏系统

我们如何知道合适的近似值?我们考虑游戏系统中的平衡点是什么。

大多数游戏都会在某个时候加入关卡上限。有几种方法可以发挥作用:

  • 上限是相对较早遇到的,此处的关卡系统仅用于帮助玩家以有针对性的方式完成游戏的第一阶段,以迫使他们学习完整的游戏系统。一旦它们“完全长大”,漫长的比赛就开始了。
  • XP获得VS难度等级具有一定的经济意义,是的,有等级上限,但是距离太远了,我们希望玩家能在等级图表的一半左右完成游戏。在具有多个角色/类别的DQ / FF风格的RPG中,更常见的是通过以不同的速率获得经验来使不同的角色/类别更容易升级,而不是更改每个角色类别每个等级所需的XP。这样,玩家可以轻松记住可爱的小回合数字作为通用目标,并知道每个角色都以游戏系统(XP + (XP * Modifier)或其他任何一种)设定的任意速率朝着它们前进。
  • 级别上限基于外部角色类别。就是说,游戏系统之外的某些因素适当地决定了关卡系统的外观。由于许多游戏都是有偿但免费的,所以这种情况变得越来越普遍。免费玩家的最高消费上限为70级,订户的最高消费上限为80级,一次性购买可以使某人的水平超出某个通用上限,等等。
  • 关卡上限是通用的,并以某种方式与游戏世界联系在一起。该系统已被《魔兽世界》普及。
  • 您可能梦dream以求的任何其他级别上限系统,都会以比其他玩家更浪费时间来浪费他们虚假世界中更多时间的方式奖励玩家,从而以更智能的方式增强游戏玩法。

这里一些游戏系统里没有等级上限,并且系统算法确定。通常,像这样的系统使用某种X幂Y系统使数字迅速爆炸。这样就很容易达到L-1级,可以合理地预期大多数玩家会达到L级,而很难达到L + 1级,并且玩家会变老并死于L + 2级。在这种情况下,“ L”是您确定的适合游戏的目标水平,通常该水平会限制系统的运行,但可供人们自由选择,让他们自into为XP永远是个好主意。(险恶!)在这种系统中,此处找到的数学是很合理的。但这是一个非常狭窄的案例,在实际游戏中很少遇到。

那么我们该怎么办?

计算等级和XP?否。确定等级和XP?是。

您确定什么级别意味着什么,然后确定哪些可用级别集合应该可用。这个决定取决于游戏系统中的粒度(级别之间的力量是否存在巨大差异?每个级别是否赋予新的能力?等)以及级别本身是否用作门控系统(“不能直到下一个城镇,直到孩子达到10级为止。”,或者竞争性阶梯系统强制执行基于级别的等级等。)

此代码非常简单,只是范围确定:

level(XP) when XP < 100  -> 1;
level(XP) when XP < 200  -> 2;
level(XP) when XP < 500  -> 3;
level(XP) when XP < 1000 -> 4;
% ...more levels...
level(XP) when XP > 1000000 -> 70. % level cap

或使用if语句,case或if / elif链,或者碰巧使用的支持语言(这部分是任何游戏系统中最不有趣的元素,我只提供两种方式,因为我碰巧现在处于Erlang模式,并且上面的语法可能对每个人都不明显。):

level(XP) ->
    if
        XP < 100  -> 1;
        XP < 200  -> 2;
        XP < 500  -> 3;
        XP < 1000 -> 4;
        % ...more levels...
        XP > 1000000 -> 70 % level cap
    end.

这是惊人的数学吗?一点都不。是手动执行设置元素确定吗?是的 这就是它,这是一个很值得我见过的方式实际上在这些年来大多数游戏完成。

附带说明一下,这不应在玩家每次获得经验时进行。通常,您将“ XP前进”作为一个值进行跟踪,一旦玩家用尽或超过了“前进”值(无论您采用哪种方式),都需要计算一次以弄清楚玩家的真实位置在处存储,计算下一个“剩余”减去剩余(如果允许XP向前移动)并重复。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.