2

对不起“半模糊”的标题,但我想不出更好的标题。

无论如何,我正在使用 PHP 构建一种 RP 游戏,现在我正在尝试弄清楚如何提升用户级别并保持经验值的“溢出”并可能再次提升他们的级别。

所以假设我的角色是 1 级,我需要 400 exp 才能达到 2 级。目前我所拥有的是,当我达到 400 或更高时,它会提高我的等级并重置我的 exp。但是我想做的是,如果我获得 450 exp,它会提高我的水平并将我的 exp 重置为溢出,在这种情况下为 50。这并不难,棘手的部分是如果我获得如此多的经验,我会升级不止一次!

目前我有这个代码,

    public function advLvl($user) {
        $sql = $this->db->prepare("UPDATE `characters` SET `level` = `level` + 1, `experience` = '0' WHERE `u_name` = :user");
        $sql->execute(array(":user" => $user));
    }

    public function checkLvl($user, $currLvl) {
        $sql = $this->db->prepare("SELECT `experience` FROM `characters` WHERE `u_name` = :user");
        $sql->execute(array(":user" => $user));
        $exp = $sql->fetchColumn();

        if($exp >= $this->expNextLevel($currLvl)) {
            $this->advLvl($user);
        }
    }

    public function expNextLevel($currLvl) {
        if($currLvl == 1) {
            return 400;
        }else {
            $gain = 400 + $this->defaultMobGain($currLvl);
            $expNextLevel = 120 + ($gain * $currLvl);
            return $expNextLevel;
        }
    }

每一次我都会这样做,

 $alt->checkLvl($_SESSION["username"], $char_info["level"]);

这提高了我的等级,一切正常,唯一的问题是,如果我获得如此多的经验,我将不止一次前进,那么它只会在每次刷新时增加。所以假设我是 1 级并且我获得了 1320 exp,这足以让我升到 3 级(1 级 = 400,2 级 = 920)。但为了跟上变化,我必须刷新页面两次。

所以我假设你必须构建某种递归函数。比如,当我当前的 exp 大于或等于到下一个级别的 exp 量时,提升我的级别。但是,并不是那么简单,while 循环将被执行数百次,我只需要它执行两次(在这种情况下)。我该怎么做呢?

希望这是有道理的,并且您了解我要完成的工作,如果您需要更多信息,请告诉我。

提前致谢。

4

2 回答 2

2

我会存储总金额而不重置为零。然后根据他们所处的级别进行数学计算。

这是我建议的一个例子。每个级别所需的 exp 只是在这里硬编码,但可以像你正在做的那样即时计算(不确定 defaultModGain 正在做什么,所以我只是硬编码)。

function getLevel($exp) {
    $levels = array(0, 400, 920, 1320);

    for ($i = (count($levels) - 1); $i >= 0; $i--) {
        if ($exp >= $levels[$i]) {
            return $i + 1;
        }
    }

    return 1;
}
于 2013-03-24T23:39:45.827 回答
2

像其他人一样,我建议不要在升级后重置经验值,而是插入总经验 - 总等级之间的差异。然后重新计算升级所需的经验并在此之后重新检查。只要获得的经验高于升级要求,就应该有升级。

于 2013-03-25T13:21:45.670 回答