我已经创建了一个关卡系统,但我现在正在开发一个进度条来配合它。关卡系统会检查数据库中的经验值,并有不同的数字,在本例中需要
$count >= 100
100 = level 3
,然后它会更新数据库并将 level
设置为 3
有一个问题,我无法调用所需的经验值(100),因此对于进度条,我无法使其移动,并且如果没有最大数量,我所能做的就是
$exp / 0
将每个经验值存储到变量中的最佳方法是什么? (无需更改系统使其需要100exp,然后在每个级别添加百分比)
带进度条的关卡系统:
<?php
if(empty($_SESSION['user'])){
}else{
// Connect to your database like you normally do, then get any value into the $count variable
$uid = htmlentities($_SESSION['user']['id'], ENT_QUOTES, 'UTF-8');
$datab = mysqli_connect("localhost", "root", "password", "database") or die ("Could not connect to database");
$userquery = mysqli_query ($datab, "SELECT * FROM users WHERE id='$uid'");
while($row = mysqli_fetch_array($userquery, MYSQLI_ASSOC)){
include"user_array.php";
}
$count = $exp;
if($level == 0){
$lvl = 1;
}else{
$lvl = $level;
}
if ($count >= 25000) { $lvl = 50;
$level_set = "UPDATE users SET level = '50' WHERE id = '$uid'";
$db->query($level_set);
}
//to save space I have removed everything from level 3 - 50!
else if ($count >= 100) { $lvl = 3;
$level_set = "UPDATE users SET level = '3' WHERE id = '$uid'";
$db->query($level_set);
}
else if ($count >= 50) { $lvl = 2;
$level_set = "UPDATE users SET level = '2' WHERE id = '$uid'";
$db->query($level_set);
}
}
// ///Progress bar/////////////////////////////////////////////////////////////////////
// ///Calculate percentage $current (current exp count), $total (max)
// ///This will change the width of of the .inner div which display the progress bar
// ////////////////////////////////////////////////////////////////////////////////////
$total = $count; //max count for current level
$current = $exp; //current $exp from database
$percent = round(($current/$total) * 100, 1);
?>
最后我所做的就是制作 2 个 div,并给每个 div 一些 CSS 和颜色,并使内部 div 具有
width:<?php echo $percent; ?>%;
如果您有 XP 点。那么你需要:
则百分比由下式给出:
Progress = 100 * (XP - XPmin) / (XPmax - XPmin)
奖金:
您应该在某处存储一个数组作为代表您级别的配置变量:
$levels = [
1 => 0,
2 => 50,
3 => 100,
// ...
]
然后一个简单的循环将为您找到级别,而不是一个巨大的开关:
$actual_level = null;
foreach ($levels as $l => $xp_min) {
if ($current_xp>$xp_min) break;
$actual_level = $l;
}
// ERROR, level not found
if (is_null($actual_level)) die();
// Else $actual_xp is your real level matching $current_xp points
// Do not forget to escape that SQL or use prepared statements!!
$level_set = "UPDATE users SET level = '" . $actual_level ."' WHERE id = '$uid'";
$db->query($level_set);
比使用大量 if 更好的系统是在数组中设置限制
$levellimits = [25000, ..., 100, 50];
然后你可以循环遍历它,找到第一个低于当前级别的并使用
$level = 50 - $i
。您还可以从数组中获取下一级别的进度,只需从 $i - 1
中获取值(除非 $i 为零,表示最大级别)并将其用作最大值。
$nextlevel = $levellimits[$i - 1];
$percent = round($current / $nextlevel * 100, 1);
此外,如果您希望进度条位于关卡内(通常情况下),请使用当前值的最小值,以便百分比在关卡内从 0 变为 100。
$curlevel = $levellimits[$i];
$nextlevel = $levellimits[$i - 1] - $curlevel;
$percent = round(($current - $curlevel) / $nextlevel * 100, 1);
要更新数据库,请使用除非级别实际更改否则不会更新的条件。您可以通过根据新级别检查数据库中的级别来轻松地在代码中完成此操作。
也不要使用字符串文字('2')来更新整数并使用参数而不是连接字符串。