php game, formula to calculate a level based on exp
Asked Answered
N

7

16

Im making a browser based PHP game and in my database for the players it has a record of that players total EXP or experience.

What i need is a formula to translate that exp into a level or rank, out of 100.

So they start off at level 1, and when they hit say, 50 exp, go to level 2, then when they hit maybe 125/150, level 2.

Basically a formula that steadily makes each level longer (more exp)

Can anyone help? I'm not very good at maths :P

Nefen answered 5/8, 2011 at 10:25 Comment(0)
C
28

Many formulas may suit your needs, depending on how fast you want the required exp to go up.

In fact, you really should make this configurable (or at least easily changed in one central location), so that you can balance the game later. In most games these (and other) formulas are determined only after playtesting and trying out several options.

Here's one formula: First level-up happens at 50 exp; second at 150exp; third at 300 exp; fourth at 500 exp; etc. In other words, first you have to gather 50 exp, then 100 exp, then 150exp, etc. It's an Arithmetic Progression.

For levelup X then you need 25*X*(1+X) exp.

Added: To get it the other way round you just use basic math. Like this:

y=25*X*(1+X)
0=25*X*X+25*X-y

That's a standard Quadratic equation, and you can solve for X with:

X = (-25±sqrt(625+100y))/50

Now, since we want both X and Y to be greater than 0, we can drop one of the answers and are left with:

X = (sqrt(625+100y)-25)/50

So, for example, if we have 300 exp, we see that:

(sqrt(625+100*300)-25)/50 = (sqrt(30625)-25)/50 = (175-25)/50 = 150/50 = 3

Now, this is the 3rd levelup, so that means level 4.

Calv answered 5/8, 2011 at 10:36 Comment(1)
I would say that this formula is very nice for levelling. It grows slower than geometric progession, where each new level needs X times more experience. This progession maintains a good balance and the feeling that each level is more difficult to achieve, but not impossible. But I think You should use Excel or something to make two graphs and see for Yourself.Disputable
A
12

If you wanted the following:

  • Level 1 @ 0 points
  • Level 2 @ 50 points
  • Level 3 @ 150 points
  • Level 4 @ 300 points
  • Level 5 @ 500 points etc.

An equation relating experience (X) with level (L) is:

X = 25 * L * L - 25 * L

To calculate the level for a given experience use the quadratic equation to get:

L = (25 + sqrt(25 * 25 - 4 * 25 * (-X) ))/ (2 * 25)

This simplifies to:

L = (25 + sqrt(625 + 100 * X)) / 50

Then round down using the floor function to get your final formula:

L = floor(25 + sqrt(625 + 100 * X)) / 50

Where L is the level, and X is the experience points

Augury answered 5/8, 2011 at 11:14 Comment(2)
The first equation in my answer above X = 25 * L * L - 25 * L gives the number of experience points required to get to a specific levelAugury
If you want the leveling to be slower, eg. 100 points required to get to level 2, 300 points for level 3, 600 points for level 4 and 1000 points for level 5, change all the 25's in the equations above to 50's. Basically those 25's should be half the value of the score required to get to level 2.Augury
B
6

It really depends on how you want the exp to scale for each level. Let's say

LvL1 : 50 Xp
Lvl2: LvL1*2=100Xp
LvL3: LvL2*2=200Xp
Lvl4: LvL3*2=400Xp

This means you have a geometric progression The Xp required to complete level n would be

`XPn=base*Q^(n-1)`

In my example base is the inital 50 xp and Q is 2 (ratio).

Provided a player starts at lvl1 with no xp:

when he dings lvl2 he would have 50 total Xp
at  lvl3 150xp
at  lvl4 350xp

and so forth The total xp a player has when he gets a new level up would be:

 base*(Q^n-1)/(Q-1)

In your case you already know how much xp the player has. For a ratio of 2 the formula gets simpler:

base * (2^n-1)=total xp at level n

to find out the level for a given xp amount all you need to do is apply a simple formula

$playerLevel=floor(log($playerXp/50+1,2));

But with a geometric progression it will get harder and harder and harder for players to level.

To display the XP required for next level you can just calculate total XP for next level.

$totalXpNextLevel=50*(pow(2,$playerLevel+1)-1);
$reqXp=$totalXpNextLevel - $playerXp;

Check start of the post: to get from lvl1 -> lvl2 you need 50 xp lvl2 ->lvl3 100xp

to get from lvl x to lvl(x+1) you would need

$totalXprequired=50*pow(2,$playerLevel-1);
Brennabrennan answered 5/8, 2011 at 10:56 Comment(1)
again it depends what kind of leveling experience you want to deliver, and the level cap. A more linear approach (arithmetic progression) has already been suggested by others and a square function is just as good.I just like keeping it hard, don't want to get to maxlevel to fast do we?Brennabrennan
P
2

Google gave me this:

function experience($L) {
 $a=0;
  for($x=1; $x<$L; $x++) {
    $a += floor($x+300*pow(2, ($x/7)));
  }
 return floor($a/4);
}

for($L=1;$L<100;$L++) {
 echo 'Level '.$L.': '.experience($L).'<br />';
}

It is supposed the be the formula that RuneScape uses, you might me able to modify it to your needs. Example output:

Level 1: 0
Level 2: 55
Level 3: 116
Level 4: 184
Level 5: 259
Level 6: 343
Level 7: 435
Level 8: 536
Level 9: 649
Level 10: 773
Planimeter answered 5/8, 2011 at 11:59 Comment(0)
K
1

Here is a fast solution I used for a similar problem. You will likely wanna change the math of course, but it will give you the level from a summed xp.

    $n = -1;
    $L = 0;

    while($n < $xp){
        $n += pow(($L+1),3)+30*pow(($L+1),2)+30*($L+1)-50;
        $L++;
    }

    echo("Current XP: " .$xp);
    echo("Current Level: ".$L);
    echo("Next Level: " .$n);
Kapor answered 27/7, 2012 at 11:58 Comment(0)
V
0

I take it what you're looking for is the amount of experience to decide what level they are on? Such as: Level 1: 50exp Level 2: 100exp Level 3: 150exp ?

if that's the case you could use a loop something like:

$currentExp = x;
$currentLevel;
$i; // initialLevel

for($i=1; $i < 100; $i *= 3)
{
     if( ($i*50 > $currentExp) && ($i < ($i+1)*$currentExp)){
         $currentLevel = $i/3;
         break;
     }
}

This is as simple as I can make an algorithm for levels, I haven't tested it so there could be errors.

Let me know if you do use this, cool to think an algorithm I wrote could be in a game!

Vocative answered 5/8, 2011 at 10:44 Comment(2)
when i put high numbers into that equation as the exp (eg, 14554) then its not outputting a level.Nefen
Oh I'd add an if statement after the for loop in case you have gone over the max level (which was set at 100).Vocative
U
0

The original was based upon a base of 50, thus the 25 scattered across the equation.

This is the answer as a real equation. Just supply your multiplier (base) and your in business.

$_level = floor( floor( ($_multipliter/2)
                      + sqrt( ($_multipliter^2) + ( ($_multipliter*2) * $_score) ) 
                      ) 
                      / $_multipliter
               ) ;
Unfrequented answered 10/11, 2014 at 19:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.