@funkydance

Как узнать уровень пользователя?

Здравствуйте.

Хочу на сайте сделать уровневую систему для пользователей.

Первый уровень начинается со 100 единиц опыта, следующий уровень прибавляется +10% от предыдущего.

1 уровень = 100опыта
2 уровень = 110 опыта
3 уровень = 121 опыта
и т.д.

У меня есть из данных только сумма опыта, например 2500 опыта, как вычесть на PHP какой это будет уровень? Получается, что это сумма первых n членов геометрической последовательности с началом 100 и множителем 1.1.

Не ругайтесь, пока я даже представить не могу как это сделать.
  • Вопрос задан
  • 188 просмотров
Решения вопроса 2
sanek_os9
@sanek_os9
Работаю с Laravel, Vue, Vuetify, AWS Amazon, Linux
require_once 'vendor/autoload.php';

function levelGenerate(&$levels)
{
    $max_level = 100; // тут указывается максимально возможный уровень
    $lastLevel = $levels->last();

    $levels->push([
        'level' => ++$lastLevel['level'],
        'rating' => $lastLevel['rating'] * 1.1,
    ]);

    if ($levels->last()['level'] < $max_level) {
        return levelGenerate($levels);
    }
}

$levels = collect([['level' => 1, 'rating' => 100]]);
levelGenerate($levels);

$my_rating = 1245;
$my_level = $levels->where('rating', '<=', $my_rating)->last();
dd($my_level['level']); // 27

// my_rating = 741
// array:2 [▼
//   "level" => 22
//   "rating" => 740.02499442582
// ]

// my_rating = 150
// array:2 [▼
//   "level" => 5
//   "rating" => 146.41
// ]

// my_rating = 1245
// array:2 [▼
//   "level" => 27
//   "rating" => 1191.8176537727
// ]

Для работы скрипта нужно подключить эту библиотеку https://github.com/tightenco/collect
Требования: PHP 7.1
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если прибавлять по 10%, то для третьего уровня надо не 120, а 121 опыта (110 * 1.1).
Сумма членов геометрической прогрессии
Sn = b1 * (1 - qn) / (1 - q)
b1 = 100
q = 1.1
Sn = 100 * (1 - 1.1n) / (1 - 1.1) = 1000 * (1.1n - 1)
1.1n = (Sn / 1000) + 1
n = log1.1((Sn / 1000) + 1)
Sn = 2500
n = log1.1((2500 / 1000) + 1) = log1.1(3.5) = 13.144
Получаем, что 2500 опыта будет на 13 уровне.
Но для целых чисел такой вариант не подходит, да и прибавление по 10% даст нецелые значения - 100, 110, 121, 133.1, 146.41, ...
Так что, оптимальным будет составление таблицы, как предложил Александр Аксентьев.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Сложный вариант: https://gamedev.stackexchange.com/a/110437
Простой: https://gamedev.stackexchange.com/a/110457
Еще более простой: сгенерировать таблицу уровней exp, lvl с конечным количеством уровней и простым sql запросом узнавать текущий уровень без лишних калькуляций.
Ответ написан
@Victorius13
echo getlevel(230);

function getlevel($xp) {
$l = 100;
for ($i = 0; ; $l = $l + $l * 1.1) {
	$i++;
	if ($l > $xp) {
		break;
	}
}
return $i;
}
Ответ написан
@antikirill
Тк уровень можно описать выражением:
100*(1.1 в степени n)= 2500
То чтобы получить n - нам нужна степень корня из 2500/100 чтобы получить 1.1 (целая часть корня)
Поэтому:
$currentPoint = 2500/100;
$levelUp = 1.1;
$level = intval(log($currentPoint, $levelUp));
Ответ написан
@poniyur
Почему бы просто не хранить уровень в таблице пользователей? Зачем его каждый раз просчитывать?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы