1

如果我知道 的值$c_xp,我怎么能在$c_level不写 100 个 if 语句的情况下找到。

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 = ;
4

4 回答 4

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 添加到最终数量,以使公式生效。

于 2012-08-25T22:47:56.730 回答
4
  1. 将 level-xp 对存储在数组中:

    $levels = array(
        1 => 99,
        2 => 499,
        3 => 999
    );
    

    请注意,与级别相关的值是给定级别的最大值,即多一个点将与下一个级别相关联。

  2. 遍历levels数组,检查玩家的XP是否小于level最大值:

    $level = null;
    $xp = 845;
    
    foreach ($levels as $l => $max) {
        if ($xp <= $max) {
            $level = $l;
            break;
        }
    }
    
于 2012-08-25T22:41:05.163 回答
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;

?>
于 2012-08-25T22:43:35.483 回答
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 变量切换到您想要的最大级别。

可能是一个更有效的解决方案,但我对算法很烂,现在是周末。

于 2012-08-25T23:04:56.837 回答