经验值升级算法 PHP

6

我正在开发一款游戏,不想使用一个充满等级的数组,因为当遍历它们以查找用户等级时,这可能会增加页面加载时间。我需要仅凭用户经验独立计算出这个等级。这是因为我希望最高等级大约为1,000,那么这么长的数组将需要一些时间才能完成遍历。

我已经在一些帮助下,提出了以下每个等级之间差异的算法:

difference = difference + (difference / 7)

它在较低级别上运作良好,但这个图表是1-141级别,正如您所看到的,它非常容易,直到大约一半的时候,然后它急剧上升并继续上升,直到经验值达到15亿时,等级为250左右,这还不够好。

Levels 1-141的图表

因此,我的问题是,您认为有什么更好的方法来区分每个级别?欢迎任何建议,我将测试所有算法。

谢谢。


投票重新开放,我不知道为什么这个问题被关闭了。这几乎是每个游戏程序员(其游戏包含经验点)都会遇到的问题。然而,我可以看到将其移动到gamedev.SE,在那里它可能会被关闭,不是因为离题,而是因为重复 - BlueRaja - Danny Pflughoeft
这个问题完全是设计性质的。他的问题是如何向玩家展示难度的变化,以便他在所有级别上都感到自己足够成长。这仅仅是一个UI设计问题。是的,它应该提交到游戏开发板块。已经有一个类似的问题存在,这只是证明了这一点。 - Gangnus
3个回答

5

首先,我们有线性系统。


Level = Experience / 1000

每1000点经验值升一级。如果要让升级速度变慢,可以降低获得经验的速度。这样做的额外好处是,超级简单的活动后来会被视为零经验,因此你不能通过杀死老鼠来变得超级厉害。
然后还有各种不同的递减曲线。例如:
Level = (Experience/1000)^(1/scale)

在一个2的规模下(平方根曲线),等级1需要1000点经验值。等级2需要4000点经验值。等级3需要9000点经验值。每个等级都变得越来越困难。如果你使规模更小,难度增加的速度会减慢(曲线变得不那么陡峭)。

我建议构建函数本身,而不是构建一阶导数(似乎你已经尝试过了)。这将给你在求积分之前更好地了解图形。


它的意思是“n次方”。x^(1/n)=x的n次根。 - axiomer
1
使用 Pow()。http://php.net/manual/zh/function.pow.php - axiomer
文件写入。对于 Level = (Experience/1000)^(1/scale),使用 $level=pow($experience/1000,1/$scale) - axiomer
@ThomasMosey 如果你想让第一级别为 Level 1(而不是 Level 0),只需在公式中加上1。如果你想按照十进制而不是千进制进行计算,只需将分母改为10。 - Borealid

4
您可能需要的是具有水平渐近线 y = 1,000 的某种东西,其在小 x 值时增长速度比大 x 值时更快。例如,我们可能想要解决以下系统:
dy/dx = a/x
lim (x->infinity) y = 1,000

我们理解。
y = C_0 - a/(x^2)

使用极限,我们得到:
lim (x->infinity) y = C_0

所以我们得到了这个方程式。
level = 1,000 - a/(exp^2)

我们可以让所有用户从同一体验开始,或者简单地将其更改为:
level = 1,000 - a/(exp^2 + 1)

无论哪种方式,用户都会从等级开始。
level(0) = 1,000 - a

如果要让用户从等级0开始,将a设为1000;如果用户从等级1开始,则将a设为999。因此我建议采用以下方式:

level(0) = 1,000 - 1,000(exp^2 + 1)

对于经验值从0开始的情况,你可以通过改变指数的幂来改变收敛速度;更高的幂意味着更快地收敛到最大经验值,而更低的幂则意味着收敛时间更长。幂为2只是一个建议;任何正实数幂都可以。

请注意,这只是构建此类函数的一种方法。您可以集成任何在小x处比大x处更大的dy / dx,并获得另一个函数,您可以以更或多或少相同的方式进行参数化。


0

实际上,一切都取决于您如何根据难度制作关卡。该算法可以设置为,从1到1.1的变化将比从1000到1000000的变化更加明显,或者相反。

对于相同的相对变化,算法对不同范围内的难度的敏感度是否相同?还是对于绝对变化?或者对于难度及其变化的另一个函数?这由您决定。

因此,难度值和其增长策略的价值仅仅是心理问题。

我喜欢的是:使这些数字线性增长并且很小。 1-1000每次增加1就足够了。您可以根据游戏主题为不同难度范围包含一些名称。但当然,您也可以从百万开始,直到千万亿。这是设计问题,而不是编程或算法问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接