2016-09-12 2 views
1

У меня уже есть система уровней, но теперь я работаю над индикатором выполнения, чтобы идти с ним. Уровневая система проверяет базу данных для ехра и имеет вариацию чисел, где она принимает $count >= 100 в этом случае 100 = level 3 и будет обновлять базу данных и установить level в 3Система уровня и индикатора хода

Одна проблемы, я не могу назвать на сумму ехра необходимой (100), поэтому для индикатора выполнения я не могу заставить его двигаться, и без максимальной суммы все, что я могу сделать, это $exp/0

Каков наилучший способ хранения каждой суммы опыта в переменной? (без чейнинга систему, чтобы сделать его 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); 

?> 

все я делаю в конце концов, это сделать 2 дивы и дать каждому некоторые css и цвет и сделать внутренний div width:<?php echo $percent; ?>%;

+0

У вас есть все эти ifs, вы можете легко установить значение для следующего уровня и получить процент. Хотя я бы предпочел просто использовать массив для хранения значений и делать все в одном цикле. Также обратите внимание, что вы каждый раз вызываете обновление, даже если уровень тот же, что у пользователя уже есть ... –

+0

@SamiKuhmonen Я согласен, что это не лучшая система уровней, но это лучшее, что я мог найти, что позволяет мне установите точное количество exp, которое я хочу для каждого уровня. Если вы дадите ему поиск в 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

гораздо лучше системы, чем используя огромное количество МФСА будет иметь пределы в массиве

$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, поэтому индикатор выполнения показывает каждый раз пустым –

Смежные вопросы