我试图模仿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 />';
}
输出(与上面提供的级别详细信息比较时不正确):
它返回的前10个级别的所有信息都是正确的,但所有信息都有不正确的xp金额。我认为这是因为xp_per_level根据之前的级别而改变。
有没有办法解决这个问题?我的数学不是很大!
谢谢
答案 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步一样。