PHP寻找下一级的经验

PHP寻找下一级的经验,php,math,Php,Math,假设我有一个简单的函数 <?php function levels($theExp) { if ($theExp < 52) { $theLevel = 2;} else if ($theExp < 110) { $theLevel = 3;} else if ($theExp < 175) { $theLevel = 4;} else if ($theExp < 246) { $t

假设我有一个简单的函数

<?php

function levels($theExp) {

          if ($theExp < 52) { $theLevel = 2;}
          else if ($theExp < 110) { $theLevel = 3;}
          else if ($theExp < 175) { $theLevel = 4;}
          else if ($theExp < 246) { $theLevel = 5;}
          else if ($theExp < 325) { $theLevel = 6;}
          else if ($theExp < 413) { $theLevel = 7;}
          else if ($theExp < 510) { $theLevel = 8;}
          else if ($theExp < 616) { $theLevel = 9;}
          else if ($theExp < 734) { $theLevel = 10;}
          else if ($theExp < 865) { $theLevel = 11;}
          else if ($theExp < 1008) { $theLevel = 12;}
          else if ($theExp < 1167) { $theLevel = 13;}
          else if ($theExp < 1342) { $theLevel = 14;}
          else if ($theExp < 1536) { $theLevel = 15;}
          else if ($theExp < 1749) { $theLevel = 16;}
          else if ($theExp < 1985) { $theLevel = 17;}
          else if ($theExp < 2245) { $theLevel = 18;}
          else if ($theExp < 2531) { $theLevel = 19;}
          else if ($theExp < 2848) { $theLevel = 20;}
          else if ($theExp < 3197) { $theLevel = 21;}
          else if ($theExp < 3582) { $theLevel = 22;}
          else if ($theExp < 4007) { $theLevel = 23;}
          else if ($theExp < 4476) { $theLevel = 24;}
          else if ($theExp < 4993) { $theLevel = 25;}
          else if ($theExp < 5564) { $theLevel = 26;}
          else if ($theExp < 6193) { $theLevel = 27;}
          else if ($theExp < 6888) { $theLevel = 28;}
          else if ($theExp < 7655) { $theLevel = 29;}
          else if ($theExp < 8502) { $theLevel = 30;}
          else if ($theExp < 9435) { $theLevel = 31;}
          else if ($theExp < 10466) { $theLevel = 32;}
          else if ($theExp < 11603) { $theLevel = 33;}
          else if ($theExp < 12858) { $theLevel = 34;}
          else if ($theExp < 14243) { $theLevel = 35;}
          else if ($theExp < 15772) { $theLevel = 36;}
          else if ($theExp < 17459) { $theLevel = 37;}
          else if ($theExp < 19321) { $theLevel = 38;}
          else if ($theExp < 21376) { $theLevel = 39;}
          else if ($theExp < 23644) { $theLevel = 40;}
          else if ($theExp < 26148) { $theLevel = 41;}
          else if ($theExp < 28912) { $theLevel = 42;}
          else if ($theExp < 31962) { $theLevel = 43;}
          else if ($theExp < 35329) { $theLevel = 44;}
          else if ($theExp < 39046) { $theLevel = 45;}
          else if ($theExp < 43149) { $theLevel = 46;}
          else if ($theExp < 47677) { $theLevel = 47;}
          else if ($theExp < 52677) { $theLevel = 48;}
          else if ($theExp < 58195) { $theLevel = 49;}
          else if ($theExp < 64288) { $theLevel = 50;}
          else if ($theExp < 71013) { $theLevel = 51;}
          else if ($theExp < 78437) { $theLevel = 52;}
          else if ($theExp < 86633) { $theLevel = 53;}
          else if ($theExp < 95681) { $theLevel = 54;}
          else if ($theExp < 105670) { $theLevel = 55;}
          else if ($theExp < 116697) { $theLevel = 56;}
          else if ($theExp < 128871) { $theLevel = 57;}
          else if ($theExp < 142311) { $theLevel = 58;}
          else if ($theExp < 157148) { $theLevel = 59;}
          else if ($theExp < 173529) { $theLevel = 60;}
          else if ($theExp < 191614) { $theLevel = 61;}
          else if ($theExp < 211579) { $theLevel = 62;}
          else if ($theExp < 233622) { $theLevel = 63;}
          else if ($theExp < 257958) { $theLevel = 64;}
          else if ($theExp < 284825) { $theLevel = 65;}
          else if ($theExp < 314487) { $theLevel = 66;}
          else if ($theExp < 347236) { $theLevel = 67;}
          else if ($theExp < 383392) { $theLevel = 68;}
          else if ($theExp < 423310) { $theLevel = 69;}
          else if ($theExp < 467382) { $theLevel = 70;}
          else if ($theExp < 516039) { $theLevel = 71;}
          else if ($theExp < 569760) { $theLevel = 72;}
          else if ($theExp < 629070) { $theLevel = 73;}
          else if ($theExp < 694553) { $theLevel = 74;}
          else if ($theExp < 766850) { $theLevel = 75;}
          else if ($theExp < 846671) { $theLevel = 76;}
          else if ($theExp < 934799) { $theLevel = 77;}
          else if ($theExp < 1032098) { $theLevel = 78;}
          else if ($theExp < 1139523) { $theLevel = 79;}
          else if ($theExp < 1258129) { $theLevel = 80;}
          else if ($theExp < 1389078) { $theLevel = 81;}
          else if ($theExp < 1533655) { $theLevel = 82;}
          else if ($theExp < 1693280) { $theLevel = 83;}
          else if ($theExp < 1869518) { $theLevel = 84;}
          else if ($theExp < 2064099) { $theLevel = 85;}
          else if ($theExp < 2278932) { $theLevel = 86;}
          else if ($theExp < 2516125) { $theLevel = 87;}
          else if ($theExp < 2778005) { $theLevel = 88;}
          else if ($theExp < 3067142) { $theLevel = 89;}
          else if ($theExp < 3386373) { $theLevel = 90;}
          else if ($theExp < 3738830) { $theLevel = 91;}
          else if ($theExp < 4127973) { $theLevel = 92;}
          else if ($theExp < 4557619) { $theLevel = 93;}
          else if ($theExp < 5031985) { $theLevel = 94;}
          else if ($theExp < 5555725) { $theLevel = 95;}
          else if ($theExp < 6133979) { $theLevel = 96;}
          else if ($theExp < 6772421) { $theLevel = 97;}
          else if ($theExp < 7477315) { $theLevel = 98;}
          elseif ($theExp < 8255580) { $theLevel = 99;}

          return $theLevel;

      }

      ?>

你把你的经验,它会给你的水平。这两个NUBMER是从MySQL数据库中提取的

假设我们有
$level
$exp


如果我的
$level
1
$exp
0
,我将如何找到进入下一级的剩余经验?

你应该使用循环,而不是写那么多条件,甚至一个切换语句。无论如何,为了找到剩余的经验值,您必须计算即将到来的经验值和当前经验值之间的差值:

echo 'Remaining exp to level 3:' , 110 - $theExp;

您应该使用循环,而不是编写那么多条件,甚至一个切换语句。无论如何,为了找到剩余的经验值,您必须计算即将到来的经验值和当前经验值之间的差值:

echo 'Remaining exp to level 3:' , 110 - $theExp;

我认为您应该为
exp
level
创建一个数组,这样会更容易操作,例如:

function levels($theExp, $next = null) {
    $levels = array(
            2 => 52,
            3 => 110,
            4 => 175
           );
    foreach($levels as $level => $exp){
        if($exp > $theExp){
            return ($exp-$theExp);
        }
    }
    return 'MAX LEVEL';
}
$thisLevel = levels(63); // 47

我认为您应该为
exp
level
创建一个数组,这样会更容易操作,例如:

function levels($theExp, $next = null) {
    $levels = array(
            2 => 52,
            3 => 110,
            4 => 175
           );
    foreach($levels as $level => $exp){
        if($exp > $theExp){
            return ($exp-$theExp);
        }
    }
    return 'MAX LEVEL';
}
$thisLevel = levels(63); // 47

制作一个有经验限制的关卡数组,即

$levels = array(
  1 => 0,
  2 => 52,
  3 => 110,
  ...
);
然后,当你们知道你们当前的经验值时,你们可以在数组中遍历等级

function getNextLevel(&$levels,$experience) {
    $levelscount = count(array_keys($levels));
    $currentlevel = 0;
    for ($a = 1; $a <= $levelscount; $a++) {
        if ($levels[$a] > $experience) {
            $for_next_level = $levels[$a]-$experience;
            return array('level'=>$a-1, 'for_next_level'=>$for_next_level);
        } else if ($levels[$a] == $experience) {
            $for_next_level = $levels[$a+1]-$experience;
            return array('level'=>$a, 'for_next_level'=>$for_next_level);   
        }
    }
    return array('level'=>$levelscount, 'for_next_level'=>null); // if maxed the experience
}


getNextLevel($levels,50); // Array ( [level] => 1 [for_next_level] => 2 )
getNextLevel($levels,52); // Array ( [level] => 2 [for_next_level] => 58 )
函数getNextLevel(&$levels,$experience){
$levelscont=count(数组_键($levels));
$currentlevel=0;
对于($a=1;$a$体验){
$for_next_level=$levels[$a]-$experience;
返回数组('level'=>a-1,'for_next_level'=>$for_next_level);
}否则如果($levels[$a]==$experience){
$for_next_level=$levels[$a+1]-$experience;
返回数组('level'=>$a,'for_next_level'=>$for_next_level);
}
}
返回数组('level'=>$levelscont',对于下一个\u level'=>null);//如果你能体验到
}
getNextLevel($levels,50);//数组([级别]=>1[用于下一个级别]=>2)
getNextLevel($levels,52);//数组([level]=>2[for_next_level]=>58)

制作一个有经验限制的等级数组,即

$levels = array(
  1 => 0,
  2 => 52,
  3 => 110,
  ...
);
然后,当你们知道你们当前的经验值时,你们可以在数组中遍历等级

function getNextLevel(&$levels,$experience) {
    $levelscount = count(array_keys($levels));
    $currentlevel = 0;
    for ($a = 1; $a <= $levelscount; $a++) {
        if ($levels[$a] > $experience) {
            $for_next_level = $levels[$a]-$experience;
            return array('level'=>$a-1, 'for_next_level'=>$for_next_level);
        } else if ($levels[$a] == $experience) {
            $for_next_level = $levels[$a+1]-$experience;
            return array('level'=>$a, 'for_next_level'=>$for_next_level);   
        }
    }
    return array('level'=>$levelscount, 'for_next_level'=>null); // if maxed the experience
}


getNextLevel($levels,50); // Array ( [level] => 1 [for_next_level] => 2 )
getNextLevel($levels,52); // Array ( [level] => 2 [for_next_level] => 58 )
函数getNextLevel(&$levels,$experience){
$levelscont=count(数组_键($levels));
$currentlevel=0;
对于($a=1;$a$体验){
$for_next_level=$levels[$a]-$experience;
返回数组('level'=>a-1,'for_next_level'=>$for_next_level);
}否则如果($levels[$a]==$experience){
$for_next_level=$levels[$a+1]-$experience;
返回数组('level'=>$a,'for_next_level'=>$for_next_level);
}
}
返回数组('level'=>$levelscont',对于下一个\u level'=>null);//如果你能体验到
}
getNextLevel($levels,50);//数组([级别]=>1[用于下一个级别]=>2)
getNextLevel($levels,52);//数组([level]=>2[for_next_level]=>58)

另一种方法是编写一个数学函数;水平是经验的函数。如果绘制标高近似值,将得到如下图形:

这可以用以下表达式非常精确地近似(相关误差为0.99968917):

function levels($exp) {
    if( $exp < 52 ) return( 2 );
    if( $exp > 8255580 ) return( 99 );

    $exp2 = pow($exp, 2);
    $exp3 = pow($exp, 3);
    $exp4 = pow($exp, 4);

    $part_a = 
        (-7083090.21554248 * $exp) -
        (2660.03667387467 * $exp2) -
        (0.00893506217859665 * $exp3);

    $part_b =
        (9.21358754706152e-13*$exp4) -
        246214420.822165 -
        (511314.94011467 * $exp) -
        (52.7886099211375 * $exp2) -
        (9.50051322037161e-5*$exp3);

    return( intval($part_a / $part_b) );
}

功能级别($exp){
如果($exp<52)返回(2);
如果($exp>8255580)返回(99);
$exp2=战俘($exp,2);
$exp3=战俘($exp,3);
$exp4=战俘($exp,4);
$part_a=
(-7083090.21554248*$exp)-
(2660.03667387467*$exp2)-
(0.00893506217859665*$exp3);
$part_b=
(9.21358754706152e-13*$exp4)-
246214420.822165 -
(511314.94011467*$exp)-
(52.7886099211375*$exp2)-
(9.5005132207161E-5*$exp3);
报税表(intval($part_a/$part_b));
}
这显然是对方程的粗略估计,但在没有意大利面代码的情况下,它非常适合。它在100%公差范围内通过了二进制剪辑测试,仅通过了约40/96次,但当它关闭时,它将关闭一个头发长度。有关拟合的比较,请参见此图:

编辑:要回答您的原始问题,“进入下一阶段的剩余经验”现在由数学计算。由于该方法是基于数学的,因此方程是可逆的,因此当您根据经验进行求解时,您可以编写一个反函数(注意,这也是一个粗略的估计,并且在下限中存在错误,因此您需要对exp levels<2500)进行优化):

功能体验($level){
如果($20级以下){
返回(intval)(
52.4648221531097*$level+
0.44106318229244*战俘(3级)+
0.00123813768395424*pow($5级)-
57.3134003957015 - 
0.0279703679732544*战俘(4级)-
1.81609930709489e-5*战俘(6级)
) );
}
返回(intval)(
2520.69249517965 + 
(5.46368150243298e-6*战俘($6级))+
(1.30082368317228e-13*战俘($10级))-
(9.417224294e-10*战俘(8级))
));
}

因此,通过这种方法计算下一个级别所需的经验:
$needed=经验($current\u level+1)-经验($current\u level)

另一种方法是编写一个数学函数;水平是经验的函数。如果绘制标高近似值,将得到如下图形:

这可以用以下表达式非常精确地近似(相关误差为0.99968917):

function levels($exp) {
    if( $exp < 52 ) return( 2 );
    if( $exp > 8255580 ) return( 99 );

    $exp2 = pow($exp, 2);
    $exp3 = pow($exp, 3);
    $exp4 = pow($exp, 4);

    $part_a = 
        (-7083090.21554248 * $exp) -
        (2660.03667387467 * $exp2) -
        (0.00893506217859665 * $exp3);

    $part_b =
        (9.21358754706152e-13*$exp4) -
        246214420.822165 -
        (511314.94011467 * $exp) -
        (52.7886099211375 * $exp2) -
        (9.50051322037161e-5*$exp3);

    return( intval($part_a / $part_b) );
}

功能级别($exp){
如果($exp<52)返回(2);
如果($exp>8255580)返回(99);
$exp2=战俘($exp,2);
$exp3=战俘($exp,3);
$exp4=战俘($exp,4);
$part_a=
(-7083090.21554248*$exp)-
(2660.03667387467*$exp2)-
(0.00893506217859665*$exp3);
$part_b=
(9.21358754706152e-13*$exp4)-
246214420.822165 -
(511314.94011467*$exp)-
(52.7886099211375*$exp2)-
(9.5005132207161E-5*$exp3);
报税表(intval($part_a/$part_b));
}