Help me create a player ranking system for a game
June 29, 2015 9:03 PM   Subscribe

I want to create a ranking system for a game that will be more refined than just ranking the users in order 1, 2, 3, etc.

I have a game, the participant number is variable and can go into the thousands. I already have a point system where I can rank them in order (1- however many participants there are, based on how many points they have obtained in the game). But ranking them 1, 2, 3, etc. is boring (and also communicates too much about how they are doing in relation to other players).

I want to instead create an artificial number for the ranking. So similar to a credit score, I want to take their actual ranking, do some math wizardry, and then tie it to a different number on a scale, similar to how a credit score can go from 300-850. Bonus points if you're able to give me some formula that lets me choose different ranges of numbers.
posted by banished to Grab Bag (5 answers total) 1 user marked this as a favorite
 
Many games use Elo rating systems, with much success.
posted by ill3 at 9:09 PM on June 29, 2015 [1 favorite]


If it's single-player vs single player, the basic system is Elo. If this is a computer game there's a more sophisticated variant that I like better, Glicko-2 (if you're not on a computer, it'll be too much work to compute.)

If you have teams working together, there's a version for team activities called TrueSkill.

There's a small community of people who work on ranking algorithms; if you can tell us a bit more about your game, we might be able to give you more specific ideas.
posted by dgould at 9:22 PM on June 29, 2015 [3 favorites]


Best answer: Elo / Glicko are the right answers if the players are competing head-to-head, like in chess or tennis, and you want to aggregate their ratings.

If instead you have a bunch of points, instead of a bunch of competition results (i.e. Alice has 500 points, Bob has 300, Carol has 110, etc) then what you want to do is normalize and scale the scores. The basic idea would be that you first convert all the scores to a number between 0 and 1, with the highest scoring player at 1 and the lowest at zero. Then you decide what your range is, and multiply the scores by that range. Finally, if you want a minimum floor score, you add it to all of them.

So to take the credit score example, let's say you do want the best player to have a score for 850, and the worst to have 300, you would set the target range to be 850 - 300 = 550 and the target floor to be 300. We'd find the player with the highest score (Alice) and the lowest score (Carol) and find the real range, which would be 500 - 110 = 390. We'd subtract the lowest score (Carol's) from all the scores, and divide them all by the real range to normalize them: Alice gets (500 - 110) / 390 = 1.0, Bob gets (300 - 110) / 390 = 0.487, and Carol gets (110 - 110) / 390 = 0.0. Then multiply their scores by the desired range, and add in the desired floor, and their "credit scores" are Alice = (1.0 * 550) + 330 = 850, Bob = (0.487 * 550) + 300 = 568, and Carol = (0.0 * 550) + 300 = 300.

There are a couple of problems with this that you could improve. First, if you do this straight normalization, then the best player will *always* have a credit score of 850 (even if their "real score" changes) and the worst will always be 300. And other players credit scores will change based on changes in the best / worst. So what you'd probably want to do is define the "max" and "minimum" ends of the real score range ahead of time and not vary them based on performance.

You might find that you want to round the scores to the nearest whole number, or even the nearest multiple of five or ten to give nice-looking "buckets" of player performance, and not give people scores of, i.e. 543.1912, but instead something "nice" like 545.

Finally, the real scores in many competitions are often unequally distributed, with the best players having scores that are much higher than the worst players (i.e. Alice might have 100,000, Bob 1,500, and Carol 15). If that's the case, you can take the log of the scores and divide by a constant ahead of time; you'll have to play with the numbers to see what feels good.

I've done a couple of these systems in the past and I find Excel or another spreadsheet a really useful tool for doing quick prototyping and playing with ranges.
posted by bbuda at 10:48 PM on June 29, 2015 [1 favorite]


Best answer: Instead of showing players a numerical value, you could give them titles based on their rank. The top 5% are the "Cream of the Crop", the next 5% are the "Bee's Knees", and so on.
posted by clorox at 12:01 AM on June 30, 2015


If you've ever played Left 4 Dead (and I haven't in years, so forgive my memory if this turns out to be incorrect), at the end of each round the players are shown different metrics on their performance (Player 1 killed 30 zombies, Player 2 killed 40, etc.). What made it stand out to me was the variety of metrics being measured -- things like # of times each player had saved their teammates, number of times they had defeated certain types of enemies.

The effect was that while you, as a player, had a sense of your ranking in a given category, there was no overarching point system that would allow you to square one type of metric with another. This meant that determining "overall skill" was a personal decision on the relative important of the categories ("Is it better to save my teammates or defeat more enemies?"). I'm not sure if this is the sort of ranking ambiguity that you want, but I've always thought it was an interesting reward/incentive system in a team-based context.
posted by .holmes at 5:44 AM on June 30, 2015


« Older Help me make my basement a little more habitable   |   Spiderman as saviour and the absurdity of belief Newer »
This thread is closed to new comments.