## The Problem

Many games (such as my own Pixel Blacksmith and Blacksmith Slots) contain an XP / level system, where performing actions will reward experience, and eventually new levels. These new levels often unlock new content, or provide currency, so keeping players incentivised without feeling like a “grind” is a tricky balance.

## The Solution

First, come up with a basic formula to use for calculating the XP required for a level. The most common by far is `(level/x)^y`

, with `x`

affecting the amount of XP (lower values = more XP required per level), and `y`

being how quickly the required xp per level should increase (higher values = larger gaps between levels).

Next, make a spreadsheet where `x`

and `y`

can be quickly and easily modified, and the XP per level seen. Here is my spreadsheet, feel free to make a copy.

As an example, here’s a comparison of the XP required for levels using varying values of `x`

and `y`

. Note that using 2/3 for `y`

is recommended, so that built in squaring / cubing functions can be used.

### Example 1: X: 0.07, Y: 2

This has a fairly quickly increasing amount of XP per level (`y`

) and a large amount of XP (`x`

), and is good for games where XP is relatively easy to gain.

Level | XP | Difference |

0 | 0 | 0 |

1 | 204.0816327 | 204 |

2 | 816.3265306 | 612 |

3 | 1836.734694 | 1020 |

4 | 3265.306122 | 1429 |

5 | 5102.040816 | 1837 |

6 | 7346.938776 | 2245 |

7 | 10000 | 2653 |

8 | 13061.22449 | 3061 |

9 | 16530.61224 | 3469 |

10 | 20408.16327 | 3878 |

### Example 2: X: 0.3, Y: 2

This has a high value for `x`

, so the amounts of XP required for a level up are very small. This would be good for a game where XP is relatively hard to obtain (e.g. requires collecting items). Note that the % increase in XP between levels 1 and 2 is the same as Example 1 (3x higher).

Level | XP | Difference |

0 | 0 | 0 |

1 | 11.11111111 | 11 |

2 | 44.44444444 | 33 |

3 | 100 | 56 |

4 | 177.7777778 | 78 |

5 | 277.7777778 | 100 |

6 | 400 | 122 |

7 | 544.4444444 | 144 |

8 | 711.1111111 | 167 |

9 | 900 | 189 |

10 | 1111.111111 | 211 |

### Example 3: X: 0.07, Y: 3

This uses a different value for `y`

than the other 2 examples, and as such the XP required rapidly increases. This would be used in a game where higher levels have significantly higher XP gaining potential (e.g. an incremental game).

Level | XP | Difference |

0 | 0 | 0 |

1 | 2915.451895 | 2915 |

2 | 23323.61516 | 20408 |

3 | 78717.20117 | 55394 |

4 | 186588.9213 | 107872 |

5 | 364431.4869 | 177843 |

6 | 629737.6093 | 265306 |

7 | 1000000 | 370262 |

8 | 1492711.37 | 492711 |

9 | 2125364.431 | 632653 |

10 | 2915451.895 | 790087 |

### Using The Formula

Now that we have a formula for XP required for any level (using Example 1: `XP = (level/0.07)^2`

), we also need to know the current level based on XP. Inverting the formula gives us `level = 0.07 * √XP`

. The second formula can be harder to implement due to requiring “nth root of”, hence why using a value of 2/3 is recommended.

XP and levels can now be converted easily and efficiently, without requiring any lengthy formulas. However, how useful the formula will be depends entirely on how well the `x`

and `y`

values are tuned for the specific use case. Get it wrong, and players will power through content or complain about being too grindy, get it right and they’ll never mention it!

## The Conclusion

Levels are an extremely common way of rewarding consistent players, and providing an incentive to continue playing the game, or to replay older content. Balancing the formula is extremely important, and the simplicity of the formula described in this post means that consistent complaints of level ups being too frequent or too infrequent can be fixed by changing a single variable.

It is applicable to pretty much any game on any platform, but is especially useful in mobile applications, where processing power can be more limited, and player attention harder to keep.

A gist of a Java implementation of converting between XP & levels, as well as calculating current % progress towards next level is available here.