2

我的数学真的很差,我无法计算以下内容。我有两列名为experiencelevel

如果experience超过 200 则level更新为1

如果experience超过 500 则level更新为2

....我的意思是我从不重置experience

所以,我有一个加载条图像,我必须计算百分比的长度。我尝试过这样的事情

function lvlbar($xp, $level){

if($level == 0)
    {

         $percent = @round(($xp / 200)*100);

   }

    elseif($level == 1){

$percent = @round(($xp / 500)*100);

    }

    elseif($level == 2){

    $percent = @round(($xp / 900)*100);
} 

    elseif($level == 3){
    $percent = @round(($xp / 1400)*100);
} 

    elseif($level == 4){
    $percent = @round(($xp / 1900)*100);
} 

    elseif($level == 5){
    $percent = @round(($xp / 2500)*100);
} 

    elseif($level == 6){
    $percent = @round(($xp / 3200)*100);
} 

    elseif($level == 7){
    $percent = @round(($xp / 4000)*100);
} 

    elseif($level == 8){
    $percent = @round(($xp / 4900)*100);
} 

    elseif($level == 9){
    $percent = @round(($xp / 5800)*100);
} 

    elseif($level == 10){
    $percent = @round(($xp / 6800)*100);
}

return $percent;

}

当你低于水平时它工作正常1但是一旦你达到水平2计算就会出错并且百分比从50、60等开始......我想这是我的公式。帮帮我

4

5 回答 5

4

你的概念看起来不错,但有一个小错误。经验栏需要为每个级别重置。例如,当经验为 350 时,您要显示 50%。

这意味着,你的公式是:

进入下一个级别的百分比 = 当前级别的经验 / 升级到下一个级别所需的经验

再举个例子:

经验为 350 = (350 - 200) / (500 - 200) = 50% 时的 2 级百分比

于 2013-07-28T18:31:24.703 回答
1

我不完全明白这个问题,所以不能提出一个确切的解决方案。但那肯定是乱七八糟的重复代码!我认为你要除以的那个数字在同一时间水平上增加会更好。因此,在不确切知道您在做什么的情况下,例如:

function goUpLevel(){
  $level++;
  $experienceMax = $level * $experienceLevelMultiplier;
}

然后您发布的功能会更简单,例如:

function lvlbar($xp, $level){
$percent = @round(($xp / $experienceMax)*100);
}

如果您无法计算出 $experienceLevelMultiplier 的乘数,那么可能是每个级别的值数组,即

$experienceLevelMultiplierArray = array (
1 => 10
2 => 15.5
);

这看起来更好,可扩展性更好,并且更易于管理和理解!如果您描述一下问题的背景,我肯定可以提供进一步的帮助!

免责声明:我很久没有做PHP了,所以请忽略任何错误。我在交流一个想法,而不是一个确切的解决方案。

于 2013-07-28T18:32:51.027 回答
1

这几乎就是我会做的事情。正如之前的海报所提到的,您必须在升级时调整 xp。

function lvlbar($xp, $level){
  $levels = array(
      0 => 200,
      1 => 500,
      2 => 900,
      3 => 1400,
      4 => 1900,
      5 => 2500,
      6 => 3200,
      7 => 4000,
      8 => 4900,
      9 => 5800,
      10 => 6800
  );
  if (array_key_exists($level, $levels)) {
    $lastlevelXp = !empty($levels[$level-1]) ? $levels[$level-1] : 0;
    $adjustedXp = $xp - $lastlevelXp;
    $adjustedLevelMax = $levels[$level] - $lastlevelXp;
    $percent = round(($adjustedXp / $adjustedLevelMax)*100);
  }
  return !empty($percent) ? $percent : 0;
}

示例输出:

Level 0 with 95xp:   48%
Level 1 with 370xp:  57%
Level 2 with 640xp:  35%
Level 3 with 1150xp: 50%
Level 4 with 1405xp: 1%
Level 5 with 2400xp: 83%
Level 6 with 3180xp: 97%
Level 7 with 3999xp: 100%
于 2013-07-28T18:44:20.487 回答
0

如果您的问题处于第 3 级,请查看该条件的数学:

elseif($level == 3){
    $percent = @round(($xp / 1400)*100);
}

如果您说 $xp = 900,请使用计算器并将其除以 1400,如您上面的计算所示。

然后将结果乘以 100,四舍五入的结果是 64%,所以数学返回正确,这只是错误的等式。

于 2013-07-28T18:31:17.853 回答
0

如果您希望百分比条回到 0(不包括条中的先前经验),您需要减去先前级别的数量。

另外,我建议为此使用 switch() 。

尝试这个:

function lvlbar($xp, $level){
  switch($level) {
    case 0:
      $percent = @round(($xp / 200)*100);
    case 1:
      $percent = @round((($xp - 200) / 500)*100);
    case 2:
      $percent = @round((($xp - 500) / 900)*100);
    case 3:
      $percent = @round((($xp - 900) / 1400)*100);
    case 4:
      $percent = @round((($xp - 1400) / 1900)*100);
    case 5:
      $percent = @round((($xp - 1900) / 2500)*100);
    case 6:
      $percent = @round((($xp - 2500) / 3200)*100);
    case 7:
      $percent = @round((($xp - 3200) / 4000)*100);
    case 8:
      $percent = @round((($xp - 4000) / 4900)*100);
    case 9:
      $percent = @round((($xp - 4900) / 5800)*100);
    case 10:
      $percent = @round((($xp - 5800) / 6800)*100);
  }
  return $percent;
}
于 2013-07-28T18:33:44.527 回答