计算间隔之间的进度百分比[关闭]

I'm creating a game, where user can do some progress to move to new levels. Here is the code:

<?php
    $progress=150; // example
    $percentage=0;
    $level=0;

    if ($progress<300) { $level = 1; $percentage=; }
    if ($progress<600) { $level = 2 $percentage=; }
    if ($progress<900) { $level = 3 $percentage=; }

    echo $percentage;
?>

So if the progress is 150 pts for example, the level of this user is 1, and percentage he did to move to new level 2, is 50% (done).

For example if progress is 750 pts, the progress should show 50% (is done) to move to new level 3.

I choosed here simple values, 150 and 750, but I don't know how to calculate if progress is 610, 625 etc...

Let me know if you have any questions.

Thanks.

You should store the progresses as an array, and loop over them:

$progress = 750;
$levels = array(0, 300, 600, 900);

foreach ($levels as $key => $threshold) {
    if ($progress >= $threshold) {
        $level = $key;

        if (isset($levels[$key + 1])) {
            $percentage = 100 * ($progress - $threshold) /
                          ($levels[$key + 1] - $threshold);
        } else {
            // user has passed the final level
            $percentage = null;
        }
    }
}

This works. Could be refactored:

if ($progress < 300) { $level = 1; $percentage = (($progress/300) * 100); }
elseif ($progress < 600) { $level = 2; $percentage = (($progress/600) * 100); }
elseif ($progress < 900) { $level = 3; $percentage = (($progress/900) * 100); }

Generic answer:

$limits = array( 0, 300, 600, 900);

$found = false;
for ($level = 1; ($level < count($limits)) && !$found; $level++) {
   if ($progress < $limits[$level]) {
       $found = true; 
       break;
   }
}

echo "Level: $level
";

if ($found) {
    // percentage to next level
    $lower = $limits[$level-1];
    $percentage = ($progress-$lower)/($limits[$level]-$lower);
    echo $percentage;
} else {
    echo "You're a fewking superhero!!";
}

Use the following function.

<?php
    $progress=700;
    $_multiples_of=300;
    echo "Progress to next level is ".getProgressPercentage($progress,$_multiples_of);     

    function getProgressPercentage($progress,$multiples_of){
        $level=floor($progress/$multiples_of);//Get the level of the user based on the interval of 300
        $nextLevelValue=$multiples_of * ($level +1);
        $percentageToNextLevel=intval(($progress/$nextLevelValue) *100);
        return $percentageToNextLevel;
     }
  ?>

Try this dynamic level system where you do not set the xp need to level up static but dynamically. You can define how many levels there must be and what the xp grow factor is between every level.

<?php

    $userXp = 1344; // change this to test

    $maxLevel = 12;
    $grow = 0.88;
    $maxFisrtLv = 530;

    $ranks = array();
    for($a = 0; $a <= $maxLevel; $a++){

        if($a == 0){
            $xp = 0;
        }
        elseif($a == 1){
            $xp = $maxFisrtLv;
        }
        else{
            $prev = $a - 1;
            $xp = $maxFisrtLv + ($grow * $ranks[$prev]);
        }

        if($userXp >= $xp){
            $userlevel = $a;
        }

        $ranks[$a] = $xp;
    }

    $xpBlank = $userXp - $ranks[$userlevel];
    $betweenXp = $ranks[$userlevel + 1] - $ranks[$userlevel];
    $progres = number_format($xpBlank / $betweenXp * 100, 2, '.', '');
    $progresall = number_format($userXp / end($ranks) * 100, 2, '.', '');

    $rank = print_r($ranks, true);
    echo "
        userlevel: $userlevel<br>
        progress overall: $progresall%<br>
        progress: $progres%<br>
        xp: $userXp<br>

        <br>
        <br>
        <pre>
            $rank
        </pre>
    ";

?>