A while back, I wrote about a scoring system for my video game tournament.
My original formula was that a player got 100*(score/hi_score) per game, so the best player on any given game was 100, and things worked down from there. A player's tournament score was the average of all their game scores. OK, ignore the "average" bit, it doesn't matter and it just confuses things. I liked this system because it was easy to implement in a database, and awarded points for every scoring place, not just "5 for first, 4 for second," etc., which I have some issues with.
The problem with this was that the winner (me, they're all my games) won by too much in my opinion. I want to reward putting up a good score, but my Sinistar scores are triple those of other players. That means I get about 60 extra points that no one else can match, and I shouldn't be able to win by running up the score on Sinistar, Star Wars, and Kaboom!. If I'm going to win, I should have to have a very consistent performance on every game.
Another problem is that for some of the bad players, it's possible to get a decent score without playing all the games. I'm not a big fan of that. Trying is worth something, after all. In the current system, a couple players didn't play every game and got higher scores than players who at least tried every game. That's not right, either.
After learning some Python, and playing around, I have a new system. I found that you can write your own functions in Python for SQLite, so that's what I did.
Here's a comparison of how the scores would have been if we'd used this system for the last tournament. Names have been removed.
ID
new total TP
new TP/game
old total TP
old TP/game
26
1226.38
94.34
1057.50
81.35
19
1219.30
93.79
962.99
74.08
31
1105.90
85.07
649.44
49.96
25
1075.76
82.75
613.73
47.21
27
1063.92
81.84
520.48
40.04
32
1000.46
76.96
368.55
28.35
35
937.55
72.12
250.06
19.24
34
924.90
71.15
273.16
21.01
23
909.33
69.95
223.91
17.22
29
859.24
66.10
188.17
14.47
18
856.64
65.90
171.36
13.18
21
837.24
64.40
159.19
12.25
28
628.62
69.85
183.00
20.33
33
565.56
70.69
183.68
22.96
36
339.15
67.83
75.31
15.06
In the new scheme, a player gets 100 * (1.2 ** ln(hi_score)-ln(score)). So, like the original system a score of 1300 would be perfect. But instead of Sinistar scores falling off 100, 35, 30, etc., they go 100, 80, 79, 78, etc. The lowest Sinistar score is now 56; before, it was just 4, which is not right. Sinistar should award many more points for just showing up.
My little expression there probably simplifies somehow, but I can't remember enough algebra to reduce it.
In this system, instead of winning by 90+ points, I would have won by just over 7 points. To get those 7 points, the second-place player would merely have had to beat the crap out of my Star Wars score, which he could have, or maybe play one strong game of Firepower. The next couple players down had ways to improve their positions, too, without having to play every single game again.
Players 28, 33, and 36 did not bother playing every game. The new system punishes them by awarding 0s for games that award 40+ points for just starting a game and blasting away a little bit. The old system was not so generous. This is a feature.