Система опыта и уровней

1. Алексей (17.02.2015 / 09:28)
День добрый!
Не могу продумать формулу для начисления уровней игроку.
Вообщем ситуевина такая.
Игрок, убивает монстров, получает опыт за их убийство.
Нужно что бы начало было плавное (то есть частый лвлап уровня до 15) потом сложнее, сложнее и так до 100 уровней.
Гуглил на эту тему, находил формулы типа уровень*опыт(слишком большой шаг между уровнями получается), уровень*X (Х = некой константе и если число маленькое, то прокачка слишком быстрая, а если число большое то старт новому игроку будет слишком сложный), попадались сложные формулы, но я их так и не понял.
Есть у кого какие идеи?

2. shilo (17.02.2015 / 11:59)
Попробуй переменные константы.
до 15 утровня одна (что-бы новичку было нормально), от 15 до 30 другая, похардовее, ну и так по нарастающей

3. Антон (17.02.2015 / 12:00)
1. XwiruS, ни разу не писал игры, но думаю можно использовать уровень как делитель\множитель очков опыта. К примеру акк имеет 1лвл, убил животину получил 150 опыта, его уровень 1 дальше математика, чел 1 уровня, ему набрать еще 99, эти 99 можно использовать как процент от получаемого опыта. Будет 34 уровень, чел получит 66% от 150 очков опыта. Как то так

4. shilo (17.02.2015 / 12:05)
Можно попробовать что-то типа...
умножение на 1.3
т.е.
1 уровень - 0 опыта
2 - 100 (1 шаг)
3 - 230 (+130)
4 - 399 (+169)
5 - 619 (+220)
6 - 905 (+286)
и т.д. кол-во опыта для перехода на 2 уровень и множитель можно варьировать. т.е. каждый раз будет на 30% сложнее перейти на новый уровень. Но в эти 30% заложишь например повышение мощности оружия, так чтоб реальное повышение сложности было в районе 5-10%

5. Михаил (17.02.2015 / 12:24)
напиши таблицу руками, 100 уровней это всего 100 раз нажать ctrl+c, ctrl+v. А дальше расставь как угодно опыт

6. shilo (17.02.2015 / 12:36)
И пасхалочку, 101 уровень - автоматически бан smile

7. ramzes (17.02.2015 / 13:46)
x = level
e = exp
x[e] = x-1[e*1.5] = от прошлого уровня нынешний
x+1[e*1.5] = от текущего следующий

8. Алексей (17.02.2015 / 14:35)
Благодарю всех!
Рамзес, а можно поподробнее.
Допустим игрок 0 уровня и 0 експы (только зарегистрировался)
И еще игрок 1 ур. 5 експы.
Я подобные формулы нагугливал, но не понимаю их.
умножение\деление на 0 всегда дает ноль и у меня не сходится.

9. Алексей (17.02.2015 / 20:49)
7. ramzes, если я правильно понял, то выходит следующее:
0->1 - 20 (для старта думаю 4 убитых крипа/моба нормально)
1->2 - 60 (1+1(20*1.5))
2->3 - 270 (2+1(60*1.5))
3->4 - 1620 (3+1(270*1.5))

10. Николай (18.02.2015 / 00:04)
9. XwiruS, я делаю вот так вообще
<?
function experianse($level,$num){
$mmb = array(1=>1,2=>1.1,3=>1.3,4=>1.4,5=>1.5,6=>1.6,7=>1.7,8=>1.8,9=>1.9,10=>2);
$new_exp = round($num / $mmb[$level]);
return $new_exp;
}


11. ramzes (18.02.2015 / 02:01)
9. XwiruS,
1 - 20
2 - 20*1.5 = 30 (50 summary)
3 - 30*1.5 = 45 (95 summary)
4 - 45*1.5 = 77 (172 summary)
5 - 77*1.5 = 115 (287 summary)
типа того.
грубо говоря, прикидыкаешь коэффициент (1.5 я от балды взял)
запускаешь цикл и пишешь в бд или файл, сразу прям до тысячи.
смотришь че получится, если нормально - оставляешь, если много\мало - меняешь коэффициент (его кстати тоже динамическим можно сделать, например 1.5 * ( 1+ ( ceil( level / 10 ) / 100 ) )

Добавлено через 03:39 сек.
на 50ом уровне коэффициент будет 1.5 * (1 + ( ( 50/10 [5]) / 100 [0.05]) [1.05])
1,5∗1,05=1,575

Добавлено через 07:01 сек.
ее, раз уж занялся играми, опытом и т.д. загугли формула диминишинга
очень активно используется в современных играх

12. ramzes (18.02.2015 / 02:12)
http://media.diablofans.com/images/news/2012/august/patch/exp3.jpg рабочая таблица, из игры. можешь просто изменить числа, сохранив пропорции

13. Алексей (18.02.2015 / 07:51)
ramzes, Благодарю за разъяснение!
А за димишинг отдельное спасибо smile

Добавлено через 05:28 сек.
Плюсануть не могу, так, как уже плюсовал(

14. Алексей (18.02.2015 / 08:25)
12. ramzes, Вот к чему пришел, вполне удовлетворительные цифры.
<?php
$lvl = 0;
$exp = 20;
for($i=0;$i<100;$i++){
	if($lvl<10){
	$lvl = $lvl+1;	
	$exp = $exp*1.5 ;
	echo ''.$i.' => '.$lvl.' == '.round($exp).'<br/>';}
	elseif($lvl<40){
	$lvl = $lvl+1;	
	$exp = $exp*1.2 ;
	echo ''.$i.' => '.$lvl.' == '.round($exp).'<br/>';	
	}
	else{
	$lvl = $lvl+1;	
	$exp = $exp*1.2 ;
	echo ''.$i.' => '.$lvl.' == '.round($exp).'<br/>';	
	}
	
}?>


URL: https://visavi.net/topics/42017