ruby-on-railsrubymathformula

Formula for calculating user experience


I would like (without using a gem) to create a level and experience point system for my users.

When creating his account, he starts level 0 with 0 experience points. To reach level 1 he will need 10 additional points, for a total of 10 points. For level 3 he will need 30 additional points, for a total of 60 experience points. Each additional level requires 10 more experience points. (see example below).

Level  |  Total XP  |  XP for next level|
----------------------------------------|
0      |    0       |    10             |
1      |    10      |    20             |               
2      |    30      |    30             |
3      |    60      |    40             |
4      |    100     |    50             |
5      |    150     |    60             |
etc...

I would like an xp column in my user table that would represent the total experience of a user.

In my view I would like to display its level. But what is the formula for calculating this?

Let's imagine that my user has 157 experience points in total. Which corresponds to a level 5. How to calculate a level only via the total experience points and how to calculate this regardless of its total experience point whether it is 38 like 369 or 4393.


Solution

  • I'm not sure if this is exactly what you wanted. It's more of an algorithm than a formula, but here is a method that will return the proper level based on the experience given. Think of the bar variable like the bar you have to get over to meet a new level, and think of the step variable like the amount of experience added between each level (as you describe in your right-most column).

    def calculate_level(experience)
      level = 0
      bar   = 10
      step  = 10
      while experience >= bar
        level += 1
        step  += 10
        bar   += step
      end
      level
    end
    

    Example output:

    irb> calculate_level(0)   # => 0
    irb> calculate_level(9)   # => 0
    irb> calculate_level(10)  # => 1
    irb> calculate_level(11)  # => 1
    irb> calculate_level(29)  # => 1
    irb> calculate_level(30)  # => 2
    irb> calculate_level(31)  # => 2
    irb> calculate_level(59)  # => 2
    irb> calculate_level(60)  # => 3
    irb> calculate_level(61)  # => 3
    irb> calculate_level(99)  # => 3
    irb> calculate_level(100) # => 4
    irb> calculate_level(101) # => 4
    irb> calculate_level(149) # => 4
    irb> calculate_level(150) # => 5
    irb> calculate_level(151) # => 5