我已经创建了一个关卡系统,但我现在正在开发一个进度条来配合它。级别系统检查数据库中的exp,并且在这种情况下$count >= 100
100 = level 3
的数字变化,然后更新数据库并将level
设置为3
}
一个问题,我无法调用所需的exp数量(100)因此对于进度条我无法移动,并且没有最大数量我所能做的就是$exp / 0
将每个exp数量存储到变量中的最佳方法是什么? (没有对系统进行操作以使其需要100exp,然后在每个级别添加precentage)
级别系统w /进度条:
<?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 precentage $current (current exp count), $total (max)
// ///This will change the width of of the .inner div wich 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并给每个css和颜色,让内部div有width:<?php echo $percent; ?>%;
答案 0 :(得分:1)
如果你有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);
答案 1 :(得分:1)
比使用大量ifs更好的系统是在数组中有限制
$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')来更新整数并使用参数而不是连接字符串。