计算找到水平

时间:2012-08-25 22:33:32

标签: php

如果我知道$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 = ;

4 个答案:

答案 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)

  1. 在数组中存储level-xp对:

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

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

  2. 循环通过关卡数组,并检查玩家的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切换到您想要的最高级别。

可能是一个更有效的解决方案,但我对算法感到厌烦,这是周末。