PHP游戏,基于经验值计算等级的公式

16

我正在制作一个基于浏览器的PHP游戏,对于玩家,我的数据库中记录了其总经验值。

我需要的是将这个经验转化为等级或排名的公式,以100为最高分。

所以,他们从一级开始,当他们达到50点经验时,进入二级,然后当他们达到125/150点经验时,进入三级。

基本上,我需要一个公式来平稳地增加每个等级所需的经验值。

有谁能帮帮忙吗?我不太擅长数学 :P

7个回答

28
许多公式可能适合您的需求,具体取决于您希望所需的经验值增长速度有多快。
事实上,您真的应该将其配置为可配置的(或者至少可以在一个中央位置轻松更改),以便稍后可以平衡游戏。在大多数游戏中,这些(和其他)公式仅在进行游戏测试并尝试几个选项后才确定。
这里是一个公式:第一级升级需要50点经验值;第二级需要150点经验值;第三级需要300点经验值;第四级需要500点经验值;等等。换句话说,首先您必须收集50点经验值,然后是100点经验值,然后是150点经验值,等等。这是一个等差数列
对于升级X,则需要25*X*(1+X)经验值。 添加:要反过来得到它,您只需使用基本数学知识。像这样:
y=25*X*(1+X)
0=25*X*X+25*X-y

这是一个标准的二次方程,你可以使用以下公式求解X:

X = (-25±sqrt(625+100y))/50

现在,既然我们希望X和Y都大于0,那么我们可以放弃一个答案,只剩下:
X = (sqrt(625+100y)-25)/50

例如,如果我们有300经验值,我们可以看到:

(sqrt(625+100*300)-25)/50 = (sqrt(30625)-25)/50 = (175-25)/50 = 150/50 = 3

现在,这是第三个升级,这意味着是第四级。

我认为这个公式非常适合用于等级制度。它的增长速度比几何级数慢,每个新等级需要更多的经验值。这种进展保持了一个良好的平衡,让人感觉到每个等级都更难达到,但并不是不可能的。但我认为你应该使用Excel或其他工具来制作两个图表,亲自看一看。 - Rauni Lillemets

12
如果你想要以下内容:
  • 等级1 @ 0分
  • 等级2 @ 50分
  • 等级3 @ 150分
  • 等级4 @ 300分
  • 等级5 @ 500分 等等。
一个关于经验(X)与等级(L)的方程式是:
X = 25 * L * L - 25 * L

要计算给定经验的级别,请使用二次方程式计算:

L = (25 + sqrt(25 * 25 - 4 * 25 * (-X) ))/ (2 * 25)

这可以简化为:

L = (25 + sqrt(625 + 100 * X)) / 50

然后使用 floor 函数向下取整以得出您的最终公式:

L = floor(25 + sqrt(625 + 100 * X)) / 50

其中L表示等级,X表示经验值。


我上面回答中的第一个方程式 X = 25 * L * L - 25 * L 给出了达到特定等级所需的经验值。 - Mike
1
如果您想让升级速度变慢,例如:需要100点才能达到2级,300点才能达到3级,600点才能达到4级,1000点才能达到5级,请将上述公式中的所有25改为50。基本上,这些25应该是达到2级所需分数的一半。 - Mike

6

这取决于你希望每个级别的经验如何缩放。

假设

LvL1 : 50 Xp
Lvl2: LvL1*2=100Xp
LvL3: LvL2*2=200Xp
Lvl4: LvL3*2=400Xp

这意味着你拥有一个等比数列。 要完成第n级所需的Xp将是:
`XPn=base*Q^(n-1)`

在我的例子中,基础经验为初始的50 xp,Q为2(比率)。

假设玩家从1级开始没有经验:

when he dings lvl2 he would have 50 total Xp
at  lvl3 150xp
at  lvl4 350xp

等等,当玩家升级时,他所拥有的总经验值将为:

 base*(Q^n-1)/(Q-1)

在您的情况下,您已经知道玩家拥有多少经验值。对于比率为2,公式更简单:

base * (2^n-1)=total xp at level n

要找出给定经验值的等级,您只需应用一个简单的公式。
$playerLevel=floor(log($playerXp/50+1,2));

但是,如果采用等比数列的方式,玩家升级会变得越来越困难。

要显示下一级所需的经验值,您只需计算下一级的总经验值即可。

$totalXpNextLevel=50*(pow(2,$playerLevel+1)-1);
$reqXp=$totalXpNextLevel - $playerXp;

检查帖子的开头: 要从等级1到等级2,需要50经验值 等级2到等级3需要100经验值

要从等级x到等级(x+1) 你需要

$totalXprequired=50*pow(2,$playerLevel-1);

再次强调,这取决于您想提供什么样的升级体验以及等级上限。其他人已经提出了更线性的方法(算术级数),而平方函数同样适用。我只是喜欢保持难度,不想太快达到最高等级,对吧? - Sleeperson

2

谷歌给了我这个:

function experience($L) {
 $a=0;
  for($x=1; $x<$L; $x++) {
    $a += floor($x+300*pow(2, ($x/7)));
  }
 return floor($a/4);
}

for($L=1;$L<100;$L++) {
 echo 'Level '.$L.': '.experience($L).'<br />';
}

这应该是RuneScape使用的公式,您可能可以根据自己的需求进行修改。 示例输出:

Level 1: 0
Level 2: 55
Level 3: 116
Level 4: 184
Level 5: 259
Level 6: 343
Level 7: 435
Level 8: 536
Level 9: 649
Level 10: 773

1

这是我用于类似问题的快速解决方案。当然,您可能需要更改数学公式,但它将为您提供从总经验值中得出的等级。

    $n = -1;
    $L = 0;

    while($n < $xp){
        $n += pow(($L+1),3)+30*pow(($L+1),2)+30*($L+1)-50;
        $L++;
    }

    echo("Current XP: " .$xp);
    echo("Current Level: ".$L);
    echo("Next Level: " .$n);

0
我理解您想要的是根据经验值来确定他们所处的等级,对吗?例如: 一级:50经验值 二级:100经验值 三级:150经验值?
如果是这样,您可以使用类似以下的循环:
$currentExp = x;
$currentLevel;
$i; // initialLevel

for($i=1; $i < 100; $i *= 3)
{
     if( ($i*50 > $currentExp) && ($i < ($i+1)*$currentExp)){
         $currentLevel = $i/3;
         break;
     }
}

这是我能够制作的最简单的关卡算法,我还没有进行测试,所以可能存在错误。

如果你使用了这个算法,请告诉我,很酷的想法,我的算法可以出现在游戏中!


当我把一个很高的数字作为指数放入该方程中(例如,14554),它就不会输出级别。 - user880356
在for循环之后,我会添加一个if语句,以防您超过了最大级别(设置为100)。 - John

0

原始基础是50,因此等式中分散着25。

这是实际等式的答案。只需提供您的乘数(基数)和您的业务即可。

$_level = floor( floor( ($_multipliter/2)
                      + sqrt( ($_multipliter^2) + ( ($_multipliter*2) * $_score) ) 
                      ) 
                      / $_multipliter
               ) ;

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