Je begint bij 1200 en na elke gerangschikte partij beweegt je rating — met een formule die rekening houdt met je kans, je uitslag en hoe ervaren je bent.
Je rating is één getal dat je speelsterkte samenvat. Win je van iemand met een hogere rating, dan stijg je meer dan wanneer je van iemand met een lagere rating wint — precies zoals het officiële Elo-systeem dat de KNSB gebruikt.
Zo weet je waar je staat, wie een eerlijke tegenstander is en hoe je vooruitgaat. Je ranglijstpositie, je profiel en zelfs de indeling bij toernooien gebruiken je rating. Het maakt matchmaking eerlijker — in de wachtkamer zoekt Schaaks eerst binnen ±100 rating, daarna breder.
Na elke partij zie je direct je nieuwe rating, het verschil en een melding met link naar de partij.
Iedere nieuwe speler begint op 1200 — het middenveld. Vanaf je eerste gerangschikte partij beweegt je rating. Je statistieken (total_games, wins/losses/draws) groeien mee en bepalen hoe snel je rating nog kan schommelen.
Na elke partij berekent Schaaks hoeveel je verdiend hebt vergeleken met wat werd verwacht. Die verwachting hangt af van het ratingverschil met je tegenstander.
Verwachting = 1 / (1 + 10(tegenstander − jij)/400). Tegen een gelijke rating is dat 0,50. Tegen 200 punten hoger is het ±0,24 — je wordt geacht minder te scoren, dus winst levert meer op.
Score = 1 bij winst, 0,5 bij remise, 0 bij verlies. Wit en zwart krijgen elk hun eigen score.
Neem (score − verwachting) en vermenigvuldig met je persoonlijke K (zie hieronder). Dat is je ratingverandering.
round() + max(100, …). Beide spelers worden in één transactie bijgewerkt, met een rij in rating_history en een notificatie met je nieuwe rating en link naar de partij.
| Uitslag (jij) | Score | Wat telt |
|---|---|---|
| Winst | 1 | Je krijgt het meest — zeker tegen een sterkere tegenstander. |
| Remise | 0,5 | Je houdt gelijke tred als de verwachting rond 0,5 lag; anders kleine plus/min. |
| Verlies | 0 | Je levert in — minder tegen een sterkere, meer tegen een zwakkere. |
De K-factor bepaalt hoe gevoelig je rating is. Ben je nieuw, dan beweegt hij sneller; ben je ervaren of al hoog, dan stabieler.
| Wanneer | K | Wat het betekent |
|---|---|---|
| Minder dan 75 partijen | 216 / √partijen | Veel partijen = rustiger. Voorbeeld: bij 5 → ±96, bij 25 → ±43, bij 50 → ±30, bij 74 → ±25. Bij 0 telt de code intern als 1 om delen door nul te voorkomen. |
| 75+ partijen en rating < 2100 | 25 | Vaste, gematigde stapjes. |
| 75+ partijen en 2100–2400 | 25 − (rating − 2100)/20 | Lineair aflopend van 25 naar 10 (bij 2200 → 20, bij 2300 → 15). |
| 75+ partijen en ≥ 2400 | 10 | Topniveau — minimale schommelingen. |
Elke speler heeft zijn eigen K (op basis van zijn eigen aantal partijen en rating). Daardoor kan wit +18 krijgen terwijl zwart −12 krijgt bij dezelfde partij — dat is normaal.
We nemen telkens je eigen rating, die van je tegenstander, de K en de uitslag — en laten zien wat er gebeurt.
rating_history + prepend 1200)./speel/partij?game_id=… (via notificaties met `rating_change`).Elke verandering wordt bewaard in rating_history (user_id, game_id, opponent_id, old→new, change, result, created_at) — de bron voor je grafiek en de laatste-5-lijst.
Een partij tegen een gast? Dan zie je de uitslag wel, maar je rating blijft onveranderd — gasten hebben geen profielrij en hun ratingverstoring wordt niet meegeteld. De gast ziet de partij terug via een 4-uurs cookie op /voltooide-partijen.
Alleen gerangschikte partijen tegen een andere geregistreerde speler. Tegen de computer, puzzels, dagelijkse puzzel of oefeningen geven een eigen score/cijfer, maar geen KNSB-rating.
Ja, als je tegenstander veel lager stond, was je verwachting hoog (bijv. 0,90) en is het verschil (1 − 0,90) klein. Ook met een lage K (ervaren/top) wordt de plus kleiner. Met een zwakkere tegenstander moet je dus winnen om hoog te blijven — dat is precies de bedoeling.
Nee — de code doet max(100, …). Je blijft altijd op of boven 100.
Omdat ieder zijn eigen K heeft. Een nieuwe speler (hoge K) beweegt sneller dan een ervaren speler (lage K). De verwachtingen zijn wel elkaars spiegelbeeld (samen 1), maar de K maakt het verschil.
Nee — er is een vangnet: als er al rating_history rijen voor die game_id bestaan, gebeurt er niets meer. Ook het opslaan gebeurt in één transactie voor beide spelers, met melding en historie tegelijk, of helemaal niet.
Time-outs en toernooi-afwikkeling lopen via dezelfde centrale afronding (resolveTimeoutAndFinish → handleGameEnd + toernooi-logica). Zo gaat er nooit rating of toernooipunt verloren, ongeacht of je of de cron de vlagval ontdekt.
Daag iemand uit of ga naar de wachtkamer — je volgende partij telt meteen.