Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php RP游戏的跳跃和水平体验点_Php_Math - Fatal编程技术网

Php RP游戏的跳跃和水平体验点

Php RP游戏的跳跃和水平体验点,php,math,Php,Math,很抱歉这个“半模糊”的标题,但我想不出更好的标题了 不管怎么说,我正在用PHP构建一个RP游戏,现在我正试图找出如何提升用户级别,保持体验点的“溢出”,并可能再次提升他们的级别 假设我的角色是一级,我需要400经验才能达到二级。目前我所拥有的是,当我达到400经验或以上时,它会将我的等级提高1,并重置我的经验。但我想做的是,如果我获得450经验,它会将我的等级提高,并重置我的经验到溢出,在这种情况下是50。这并不难,棘手的是如果我获得了这么多经验,我会升级不止一次 目前我有这个代码, p

很抱歉这个“半模糊”的标题,但我想不出更好的标题了

不管怎么说,我正在用PHP构建一个RP游戏,现在我正试图找出如何提升用户级别,保持体验点的“溢出”,并可能再次提升他们的级别

假设我的角色是一级,我需要400经验才能达到二级。目前我所拥有的是,当我达到400经验或以上时,它会将我的等级提高1,并重置我的经验。但我想做的是,如果我获得450经验,它会将我的等级提高,并重置我的经验到溢出,在这种情况下是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"]);
这提高了我的水平,一切正常,唯一的问题是,如果我获得了如此多的经验,我会进步不止一次,那么每次刷新它只会增加一次。假设我是一级,我获得1320经验,这足以让我达到三级(一级=400,二级=920)。但是为了跟上变化,我必须刷新页面两次

所以我假设你必须构建某种递归函数。大概, 当我当前经验值大于或等于经验值时,提升我的等级。但是,这并不是那么简单,虽然循环要执行数百次,但我只需要执行两次(在本例中)。我该怎么做呢

希望这是有意义的,你明白我想要完成什么,如果你需要更多的信息,那就告诉我


提前谢谢。

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

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


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

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


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

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

如果您忘记重置体验点,那么如果用户赢了,例如1920 exp,您只需检查通过了多少级别。如果您忘记重置体验点,那么如果用户赢了,例如,1920 exp,您只需检查通过了多少级别。换句话说,不要增加。跟踪总数,并与每个级别所需的数量进行比较。起初,我不想存储每个级别所需的exp,但这肯定是一种更简单的方法,而不是每次检查2-3个级别时反转算法。所以我将把它们存储在一个数组中,只需比较基本级别+2或3级别,并检查其exp,换句话说,不要递增。跟踪总数,并与每个级别所需的数量进行比较。起初,我不想存储每个级别所需的exp,但这肯定是一种更简单的方法,而不是每次检查2-3个级别时反转算法。所以我将把它们存储在一个数组中,只需比较基本级别+2或3级别,并检查其exp。
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;
}