Плохая функция расчета опыта?

Что не так с этой функцией? Когда я использую 31 для exp, эта функция превращается в бесконечный цикл! Как я могу это исправить? Пожалуйста, помогите и оптимизируйте эту функцию для меня, если можете, спасибо.

public function exp_calc($exp)
    {
        $level2 = 30; // Required EXP for 2nd level
        $current_lvl = 0; // Current level
        $level = 0; // Required EXP for next level

        while((int)$level <= $exp)
        {
            $level += $level2;
            $level2 *= 0.25;
            $current_lvl++;
        }

        if($current_lvl >= 80)
            $current_lvl = 80;

        return array ($current_lvl, (int)$level);
    }

person Saibamen    schedule 23.09.2011    source источник
comment
Что-то еще не так, я думаю, эта функция возвращает то, что она должна для меня. Что-то в окружении функции должно быть нарушено.   -  person hoppa    schedule 23.09.2011
comment
Я настоятельно рекомендую вам заменить вашу итеративную формулу формулой с одним выстрелом, которую вы можете просто использовать $xpForLevel = getXpForLevel($level). Вы скажете себе спасибо в долгосрочной перспективе!   -  person corsiKa    schedule 23.09.2011


Ответы (2)


$level2 *= 0.25;

 1   2     3
30 7.5 1.125

Я предполагаю, что вы имеете в виду * = 1,25, чтобы экспоненциально увеличить количество опыта, необходимого для следующего уровня :).

Текущая функция ограничивает где-то ниже 40, я думаю (получите некоторые вычисления для расчета предела;)).

Редактировать; чтобы уточнить (поскольку я этого еще не сделал):

первый уровень теперь требует 30 опыта; второй уровень требует 7,5 дополнительных опыта; всего 37,5 уровень 3 требует 1,125 опыта; всего 38.625 и т.д.

При использовании *= 1,25; количество опыта, необходимого для достижения следующего уровня, фактически увеличивается: 30 -> 37.5 -> 46.875 -> 58.594 -> etc

person Yhn    schedule 23.09.2011

Я не уверен, что вы хотите получить в результате, но причина, по которой цикл становится бесконечным, заключается в том, что на каждой итерации вы делаете $level2 меньше (на четверть его размера), пока в конечном итоге он практически не станет равным 0. Цикл не будет выходить до тех пор, пока $level не станет таким же большим, как (или равным) $exp, чего никогда не произойдет, когда $level2 станет равным 0. Без математических вычислений я предполагаю, что 31 — это порог, который никогда не может быть достигнут, поскольку $level2 становится слишком маленьким для увеличения на .

person buffcoredave    schedule 23.09.2011