RP游戏的体验点跳跃和练级

时间:2013-03-24 23:29:38

标签: php math

对于“半模糊”的标题感到抱歉,但我无法想出一个更好的标题。

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

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

目前我有这段代码,

    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"]);

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

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

希望它有意义,你理解我想要完成的事情,如果你需要更多信息,那就告诉我。

提前致谢。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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