Mimik练级算法

时间:2015-12-27 16:52:58

标签: php algorithm math

我试图模仿Steam调配系统的调平算法。

以下是关卡细节: http://steamcommunity.com/sharedfiles/filedetails/?id=457523080

  

当您开始使用时,您制作的每个徽章都会提高您的等级。大多数徽章都提供100 XP,并且需要100 XP才能达到下一级别。升级所需的数量每10级增加一次,这意味着在Steam级别10之后你每级需要200XP,在20级之后你需要每级300XP等等。

我一直在尝试创建一段代码片段,以编程方式返回此数据列表。

这是我到目前为止所拥有的:

for ( $i = 0; $i <= 900; $i++ ) {

    // $i = level.        

    $xp_per_level = (ceil($i / 10) * 10) * 10;

    $xp = $i * $xp_per_level;

    echo 'Level: ' . $i . ' - XP Rate: ' . $xp_per_level . ' - XP: ' . number_format($xp) ;

    echo '<br />';
}

输出(与上面提供的级别详细信息比较时不正确):

enter image description here

它返回的前10个级别的所有信息都是正确的,但所有信息都有不正确的xp金额。我认为这是因为xp_per_level根据之前的级别而改变。

有没有办法解决这个问题?我的数学不是很大!

谢谢

1 个答案:

答案 0 :(得分:2)

我们来看看例如30级的计算。

$i = 30 ->  
$xp_per_level = (ceil(30 / 10) * 10) * 10; ->
$xp_per_level = 300

到目前为止一直很好....但现在$xp = $i * $xp_per_level;您的代码“假设”每个级别最多30个也花了300xp - &gt;错了。
您可以简单地跟踪到达级别所需的先前XP,然后只需添加下一级所需的XP,即在循环之前初始化$xp=0;,然后$xp += $xp_per_level;在循环内。
但那有点无聊;-)
让我们来看看XP每级更改的点数

Level    0 , XP:      0
Level   10 , XP:   1000
Level   20 , XP:   3000
Level   30 , XP:   6000
Level   40 , XP:  10000
Level   50 , XP:  15000
Level   60 , XP:  21000
Level   70 , XP:  28000
Level   80 , XP:  36000
Level   90 , XP:  45000
Level  100 , XP:  55000

现在让我们试着弄清楚10与1000如何相关,如20到3000等等 让我们直接解决这个问题

Level    0 , XP:      0
Level   10 , XP:   1000 =level*100
Level   20 , XP:   3000 =level *150
Level   30 , XP:   6000 =level *200  
Level   40 , XP:  10000 =level *250
Level   50 , XP:  15000 =level *300
Level   60 , XP:  21000 ...
Level   70 , XP:  28000 
Level   80 , XP:  36000 
Level   90 , XP:  45000 
Level  100 , XP:  55000 
嗯,这个因素似乎每10个级别增加50个。让我们看看 - 我很久没有这样做了......我觉得已经20岁了 - 我刚离开高中; - )

XP[level%10==0] = (level/10 + 1) * 50 * level
  = (level*50/10 + 50) * level
  = level*level*50/10 + 50*level
  = level*level*50/10 + (500*level/10)
  = level*level*50+500*level/10
  = level*level*50+500*level/10
  = level*(level*50+500)/10
  = level*(level*5+50)

put(两种方法:a)只是添加到以前的XP b)计算mod10级别的XP)到它看起来像的代码

<?php
$xp = 0;
for ( $level = 0; $level <= 100; $level++ ) {
    $xp_per_level = (ceil($level / 10) * 10) * 10;
    $xp += $xp_per_level;

    $calc_xp = $level*(($level*5)+50);
    if ( $level%10===0 ) {
        printf("Level %4d , XP: %6d,  calc: %6d\r\n", $level, $xp, $calc_xp);
    }
}

打印

Level    0 , XP:      0,  calc:      0
Level   10 , XP:   1000,  calc:   1000
Level   20 , XP:   3000,  calc:   3000
Level   30 , XP:   6000,  calc:   6000
Level   40 , XP:  10000,  calc:  10000
Level   50 , XP:  15000,  calc:  15000
Level   60 , XP:  21000,  calc:  21000
Level   70 , XP:  28000,  calc:  28000
Level   80 , XP:  36000,  calc:  36000
Level   90 , XP:  45000,  calc:  45000
Level  100 , XP:  55000,  calc:  55000

http://steamcommunity.com/sharedfiles/filedetails/?id=457523080中相同的值 您会注意到方法b)仅对于%10 === 0的水平是准确的,例如等级11 $ calc_xp将是1155而不是1200 ...
我会把它留给你。你几乎可以解决这个问题,就像+10步一样。