Почему эта функция не работает в php? - PullRequest
0 голосов
/ 29 октября 2011

Вот моя функция,

Он предназначен для получения на уровне пользователя количества xp, необходимого до следующего уровня, он работает, но только через уровни с 1 по 2, а затем, если введен требуемый xp для уровня 3, он не работает.

ХР удваивается за уровень, поэтому с уровня 1 до 2 - 10, от 2 до 3 - 20, с 3 до 4 - 40 и т. Д .;

$ user ['xp'] - это int для лучшего объяснения, вот несколько примеров того, что функция возвращает с разными значениями.

  1. $ user ['xp'] == 1, уровень 1, xpGot 1, xpNeeded 9, 10%
  2. $ user ['xp'] == 5, уровень 1, xpGot 5, xpNeeded 5, 50%
  3. $ user ['xp'] == 9, уровень 1, xpGot 9, xpNeeded 1, 90%
  4. $ user ['xp'] == 10, уровень 2, xpGot 0, xpNeeded 20, 0%
  5. $ user ['xp'] == 15, уровень 2, xpGot 5, xpNeeded 15, 25%
  6. $ user ['xp'] == 29, уровень 2, xpGot 19, xpNeeded 1, 95%

7. $ user ['xp'] == 30, уровень 2, xpGot 0, xpNeeded 0, 0% После этого он терпит неудачу.

function calculateLevel($xpGot) {
    $level = 1;
    $xpNeeded = 10;

    while ($xpGot >= $xpNeeded) {
        $level++;
        $xpGot %= $xpNeeded;
        $xpNeeded *= 2;
    }

    if ($xpGot < $xpNeeded) {
        $xp = $xpGot / $xpNeeded * 100;
        echo '<p>Level: ' . $level . '</p>';
        echo '<div class="displayBarWrap" title="' . $xpGot . '/' . $xpNeeded . ' XP (' . $xp . '%)">
              <p>XP:</p>
            <div class="displayBar"><div style="width: ' . $xp . '%;"></div></div></div>';
    }
}

calculateLevel($user['xp']);

Ответы [ 3 ]

4 голосов
/ 29 октября 2011

Я думаю, вы хотите следующее: замените %= на -=:

$xpGot -= $xpNeeded;
3 голосов
/ 29 октября 2011

Взять эту строку

$xpGot %= $xpNeeded;

Нет разницы, если $ xpGot равен 15 или 45, % 10 все равно вернет 5. Оператор модуля делит левый операнд на правый и возвращает остаток,

Измените его на -=, как предложил @scessor, вероятно, то, что вы ищете.

0 голосов
/ 29 октября 2011

С исправлением, упомянутым другими, и возможной ошибкой в ​​эхо, это работает для меня:

<?php
    function calculateLevel($xpGot) {
        $level = 1;
        $xpNeeded = 10;

        if ($xpGot < $xpNeeded) /* NEW! */
            return;

        while ($xpGot >= $xpNeeded) {
            $level++;
            $xpGot -= $xpNeeded;  /* FIXED (other answers!) */
            $xpNeeded *= 2;
        }
        if ($xpGot < $xpNeeded) {
            $xp = $xpGot / $xpNeeded * 100;
            echo '<p>Level: ' . $level . '</p>';

            /* FIXED ? */
            echo '<div class="displayBarWrap" title="' . $xpGot . '/' . $xpNeeded . ' XP (' . $xp . '%)"> <p>XP:</p> <div class="displayBar"><div style="width: ' . $xp . '%;"></div></div></div>';
        }
    }

    calculateLevel($user['xp']);

?>
...