如果我知道$c_xp
的值,如何在不编写100条if语句的情况下找到$c_level
。
Level XP
1 0-99
2 100
3 500 +400 xp points from last level
4 1000 +500 xp points from last level
5 1600 +600 xp points from last level
6 2300 +700 xp points from last level
7 3100 +800 xp points from last level
8 4000 +900 xp points from last level
等等。
$c_level = ;
答案 0 :(得分:6)
如果我理解你的模式:
$c_level = floor((-1 + sqrt(1 + 4 * ($c_xp + 500) / 100 * 2)) / 2) - 1;
您正在添加100,然后是400,然后是500,600,700,800等。因为100种打破模式,我们暂时会忽略它。
假设你正在追求模式
Level XP
1 0-99
2 100-299
3 300-599
4 600-999
5 1000-1499
6 1500-2099
这会更容易,因为增量为100,200,300等。 100以下的任何东西都是1级.300以下的任何东西都是2级。600以下的任何东西都是3级。方便:
0+1=1 (hence 100)
0+1+2=3 (hence 300)
0+1+2+3=6 (hence 600)
依此类推第四名。前x个整数的总和是0.5 * x *(1 + x)= y,其中y是总和 - 见http://en.wikipedia.org/wiki/Summation。
在我们的案例中,我们有100倍的总和。我们可以简单地将XP除以100得到y,并使用二次公式求解x。如果XP为600,则级别为4.
600/100 = 6,和0.5 * x *(1 + x)= 6.二次公式告诉我们x是3.我们必须在它上面使用floor()并加上1我无法解释的原因。长话短说,在500点以下缺乏模式进行调整,我们加入500和主题2到公式的最终工作量。
答案 1 :(得分:4)
在数组中存储level-xp对:
$levels = array(
1 => 99,
2 => 499,
3 => 999
);
请注意,与level相关联的值是给定级别的最大值,即还有一个点与下一级别相关联。
循环通过关卡数组,并检查玩家的XP是否小于关卡最高值:
$level = null;
$xp = 845;
foreach ($levels as $l => $max) {
if ($xp <= $max) {
$level = $l;
break;
}
}
答案 2 :(得分:2)
试试这个:
<?php
$levels=Array(
1=>99,
2=>100,
3=>500,
4=>1000,
5=>1600,
6=>2300,
7=>3100,
8=>4000
);
//this will probably be pulled from somewhere else,
//take it out:
$c_xp=499;
foreach($levels as $level=>$xp) {
if($c_xp>=$xp) $c_level=$level;
else break;
}
echo $c_level;
?>
答案 3 :(得分:0)
试试这个
$maxLevel = 10;
$exp[2] = 100;
if($c_xp < 100)
$c_level = 1;
elseif($c_xp < 500)
$c_level = 2;
else
{
$increment = 400;
for($i = 3; $i<= $maxLevel; $i++)
{
$prevExp = $exp[$i-1];
$calc = $increment + $prevExp;
if($c_xp == $calc)
{
$c_level = $i;
break;
}
elseif($c_xp > $prevExp && $c_xp < $calc)
{
$c_level = $i-1;
break;
}
$exp[$i] = $calc;
$increment += 100;
}
}
$c_level = isset($c_level) ? $c_level : $maxLevel;
echo "level $c_level";
将maxLevel var切换到您想要的最高级别。
可能是一个更有效的解决方案,但我对算法感到厌烦,这是周末。