对于“半模糊”的标题感到抱歉,但我无法想出一个更好的标题。
无论如何,我正在用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的数量,直到下一个级别,提升我的水平。但是,并不是那么简单,虽然循环将被执行数百次,但我只需要它执行两次(在这种情况下)。我该怎么做呢?
希望它有意义,你理解我想要完成的事情,如果你需要更多信息,那就告诉我。
提前致谢。
答案 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)
与其他人一样,我建议在升级后不重置经验值,而是插入总体验 - 总等级之间的差异。然后重新计算升级所需的经验并在此之后重新检查。只要获得的经验高于升级要求,就应该有一个升级。