2016-09-12 33 views
1

我有一個級別系統已經創建,但我現在正在一個進度條上工作。該級系統檢查數據庫爲您的exp和有它在這種情況下100 = level 3需要$count >= 100數的變化,然後將更新數據庫,並設置level3級別和進度條系統

的一個問題,我不能要求所需的EXP量(100)所以進度條我不能讓它移動,沒有最大數額我所能做的是$exp/0

什麼是最好的方式來存儲每個exp數量到一個變量? (而不 chaning系統,使其100exp需要,然後加入PRECENTAGE每個級別)

級系統瓦特/進度條:

<?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); 

?> 

所有的i在端部做的是使2個的div,並給每個一些CSS和顏色,使內部股利有width:<?php echo $percent; ?>%;

+0

您有所有這些ifs,您可以輕鬆地設置下一個級別的值並獲取百分比。雖然我寧願只是使用數組來存儲值,並在一個循環中完成所有操作。另外請注意,你每次都打電話更新,即使級別與用戶已經擁有的級別相同... –

+0

@SamiKuhmonen我同意它不是最好的級別系統,但它最好的我能找到,爲每個級別設置我想要的確切點數。 如果您在Google上搜索它,大多數關卡系統會設置一個計數,然後在每個關卡中添加x%。它更容易給exp一個變量,但是當我第一次發現這個系統時,它就是我正在尋找的東西。我很樂意使它更有效率,但我的PHP知識不會太過分。 –

回答

1

如果你有XP點。然後,你需要:

  • 確定哪個級別相匹配XP(我們稱之爲L)
  • 讓XPmin點匹配L和XPmax匹配L + 1

則該百分比爲:

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); 
+0

看起來很容易,我可以處理,但我得到一個錯誤,'$ actual_level = null;'sais未知的變量 –

1

好多系統比使用一個巨大的IFS的量將有一個數組

$levellimits = [25000, ..., 100, 50]; 

然後限制你可以遍歷它,找到第一個比當前水平低和使用$level = 50 - $i。你也可以從數組中獲得進展到下一個級別,你只需要從$i - 1(除非$ i是零意味着最大級別)的值,並將其用作最大值。

另外如果你想在進度條是水平內,由於是通常情況下,使用最小電流值,這樣的比例將從0水平之內去100。

$curlevel = $levellimits[$i]; 
$nextlevel = $levellimits[$i - 1] - $curlevel; 
$percent = round(($current - $curlevel)/$nextlevel * 100, 1); 

對於更新數據庫,請使用不更新的條件,除非該級別實際發生更改。您可以通過檢查數據庫中的級別,在您的代碼中輕鬆完成新的級別。

也不要使用字符串文字('2')來更新整數並使用參數而不是連接字符串。

+0

不知道如果我正確理解它,但我無法得到它的工作。沒有錯誤,但它無法找到我的等級或exp,所以進度條每次都顯示爲空 –