For a Foosball game at work we implemented a rating system based on the Elo system. Allthough we achieved a sensible result so far, which provided us with a lot of fun (which is the goal) we feel we can do better by:

  1. accounting for uncertainty for new players
  2. removing/ignoring inactive players

Game description

A game is played by 4 players, 2 versus 2. The first team to reach 10 goals with a two point difference wins.

Current rating system

Each player gets an initial rating of 1000 points. When a match is played the outcome of the match is predicted by an adaptation of Elo's rating system. First we predict the probability of team A scoring a single goal before team B (team A wins one 'ball') by $$ E_A = \frac{1}{1 + 10^{(R_B-R_A)/800}}$$ where $E_A$ is the probability that team A will win this ball and $R_{A,B}$ the sum of ratings of the players in team $A,B$ respectively.

The predicted outcome of the match is then found by 'translating' this prediction to 20 balls: $$E_{\Delta S} = 20*(E_A-\frac{1}{2}) $$ with $E_{\Delta S}$ the predicted difference in score and $E_A$ the probability of team A winning a ball. If $E_{\Delta S} > 0$ team A is expected to win with a difference of $E_{\Delta S}$ goals, if $E_{\Delta S} < 0$ team B is expected to win with a difference of $E_{\Delta S}$.

The change in rating for the players in this match is then calculated from the difference between the prediction and the actual outcome $\Delta S$: $$ \Delta r = k\cdot (\Delta S - E_{\Delta S})) $$ With $k$ a parameter to make the changes in rating more agressive. For us a value of $k=10$ works nicely since every goal different from the predicted score earns you $10$ points. A nice round number to remember in the heat of the game.

The ratings for the players in the match are then updated by adding $\Delta r$ to their old rating for the players in team A, and subtracting $\Delta r$ for the players in team B.


I have not thoroughly examined the performance of this algorithm since I know it has some flaws. However the expected score predictions 'feel' good. They match relatively well with what we expect when playing with/against people we know.

Furthermore in the last 50 of 170 the error in expected score $\epsilon = \mathrm{abs}(E_{\Delta S} - \Delta S)$ was on average 3. This may not be as accurate as it gets, but we consider this reasonable (especially since we have not accounted for the fact that games must end with a 2 point difference).

Question 1

We do notice however that the most inaccurate predictions are given when a player's rating is insanely high or low because he/she has recently achieved a very improbable result (lost or won with a very large score difference). This we would like to solve by predicting how accurate the rating of a player is, and adapting the change in rating accordingly. This could also help the fact that new players start with a 1000 points which is in most cases not accurate at all.

What do you think is a good measure for the accuracy of the current rating and what is an appropriate relation to the ratingchange?

Question 2

We have a high throughput of employees, and so there are a lot of players that no longer play. We can however not simply delete their entries since the average amount of points per player must remain at 1000 so as to counteract inflation/deflation.

What are your ideas on removing players and what should I do with their points?


Also rough thoughts and ideas are welcome, we may be able to translate your thoughts and ideas to formulas ourselves.


If you're interested in use (more than in development), you should give a try to rankade, our ranking system.

Rankade is free and easy to use, and provides rankings and stats (including matchup stats) and maybe you should compare results from your model (ree algorithm is not public domain, for the time being).

Like the one you're working on, rankade can manage matches with two 2-players factions (we've some groups playing 3-on-3 foosball on a bigger table, and rankade's flexible, as it can manage one-on-one, faction vs. faction (two teams, which may be asymmetrical), multiplayer, multi-faction, cooperative games, single player games), and it features - as per your request in Question 2 - activity/inactivity dynamics (for players who join late the group, or who stop playing, or who plays far less than the average), but (like many other 'classic' ranking system, as Elo and Glicko, that you implicitly cited - here's a comparison between most known) it does not include score in the update rule (you can insert result for upcoming stats, indeed), as your model does.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.