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