Ik ben bezig met een stukje code om op basis van een aantal spelers een swiss tournament in te delen (à la MtG). Dit maak ik in PHP, maar de taal is hier niet belangrijk. De code kan ik wel maken, de vraag die ik heb is meer *hoe* ik het laatste stuk van de code kan gaan maken, welke berekeningen ik moet gaan doen, daar heb ik wat hulp bij nodig.
Voor de mensen die zich afvragen wat een swiss toernooi is:
- X aantal spelers, daarbij een Y aantal ronden (t/m 8 spelers 3 ronden, t/m 16 spelers 4 ronden etc)
- Winst 3 punten, verlies 0 punten, draw 1 punt
- Spelers nooit 2x tegen elkaar
- Bij oneven spelers, krijgt de laagste speler in de ranking een bye en 3 punten (mits niet eerder bye gehad dit toernooi)
- Spelers worden gepaired tegen elkaar op basis van ranking (sterksten tegen elkaar)
- Als spelers evenveel punten hebben, wordt de ranking bepaald op basis van andere statistieken (niet belangrijk in dit geval)
- Info: Wikipedia: Swiss-system tournament
In het kort betekent dit dat alle spelers "random" gepaired worden tegen elkaar (ronde 1). Ronde twee is vrij eenvoudig te maken, namelijk de spelers met 3 punten pair je tegen elkaar, de spelers met 0 punten en eventueel de spelers met 1 punt.
Tot zover gaat alles iedere keer zonder problemen!
Wat ik tot nu toe heb:
De code die ik tot nu toe heb is eigenlijk compleet, ik heb meerdere "testruns" gedraaid, en hier kwamen bijna altijd goede pairings uit. Tot het moment dat ik met een oneven aantal spelers ging spelen en er BYEs in het spel kwamen, en volgens mij ook een keer toen er in een ronde gelijkspel was, maar dat kan ik me niet zo snel herinneren, want dit ging later wel weer goed volgens mij.
Wat ik doe bij het maken van pairings in de code.
1. Ik zoek alle spelers die meedoen in het toernooi, die zijn gesorteerd op volgorde van standings en gaan in een array (#1 t/m #X)
2. Ik haal alle pairings op uit de database van eerdere ronden.
3. (Indien oneven aantal spelers) Ik kijk of de onderste speler een BYE heeft gehad, zo niet, geef ik de BYE, zo ja, kijk ik naar de een-na onderste speler etc... Totdat ik een speler met een BYE heb. Deze haal ik uit de array.
4. Ik pak de speler #1 uit de standings, kijk of deze al tegen speler #2 heeft gespeeld. Zo niet, pair ik deze en haal ze uit de array. Hebben #1 en #2 al tegen elkaar gespeeld, kijk ik of #1 al tegen #3 heeft gespeeld. Zo niet, pair ik deze, zo ja, kijk ik naar #1 en #4 etc. Iedere keer als spelers gepaired worden, haal ik ze uit de array.
5. Zo ga ik door totdat iedereen gepaired is.
Dit gaat goed in ongeveer 80% van de gevallen die ik getest heb. Echter kwam ik een testrun tegen waarbij speler #7 en #8 al eerder tegen elkaar gespeeld hebben. Deze kon ik dus niet pairen. Maar omdat er geen speler #9 was (ivm BYE) kon ik dit ook niet controleren.
Waar ik nu hulp bij zoek is het geval dat het fout gaat. Wat kan ik het beste doen als speler #7 en #8 al tegen elkaar gespeeld hebben. Omdat #1 t/m #6 al gepaired zijn, kan ik hier wat lastig in schuiven. (Op dit moment is er nog niets opgeslagen dus er kan nog van alles gewijzigd worden)
Waar ik zelf aan zat te denken:
Optie 1: Eerst pairen, en dan de speler die overblijft de BYE geven. Mogelijk probleem is dat niet de "slechtste" speler de BYE krijgt.
Optie 2: Groeperen op punten, en dan random gaan pairen tot iedereen met evenveel punten is gepaired, het probleem daarbij is alleen als je een oneven aantal mensen hebt met hetzelfde aantal punten.
Helaas kon ik met Googlen niet een manier vinden hoe ik precies deze berekeningen moet doen. Als iemand dit wel weet, of kan vinden, houd ik me aanbevolen. Ik weet bijvoorbeeld niet of het juist is om eerste de BYE te bepalen, of dat ik de laatst overgebleven speler de BYE moet geven.
TL;DR: Hulp nodig bij ontwikkelen pairing systeem. Werkt nu in ~80% van de gevallen, soms fout ivm dubbele pairing.
Voor de mensen die zich afvragen wat een swiss toernooi is:
- X aantal spelers, daarbij een Y aantal ronden (t/m 8 spelers 3 ronden, t/m 16 spelers 4 ronden etc)
- Winst 3 punten, verlies 0 punten, draw 1 punt
- Spelers nooit 2x tegen elkaar
- Bij oneven spelers, krijgt de laagste speler in de ranking een bye en 3 punten (mits niet eerder bye gehad dit toernooi)
- Spelers worden gepaired tegen elkaar op basis van ranking (sterksten tegen elkaar)
- Als spelers evenveel punten hebben, wordt de ranking bepaald op basis van andere statistieken (niet belangrijk in dit geval)
- Info: Wikipedia: Swiss-system tournament
In het kort betekent dit dat alle spelers "random" gepaired worden tegen elkaar (ronde 1). Ronde twee is vrij eenvoudig te maken, namelijk de spelers met 3 punten pair je tegen elkaar, de spelers met 0 punten en eventueel de spelers met 1 punt.
Tot zover gaat alles iedere keer zonder problemen!
Wat ik tot nu toe heb:
De code die ik tot nu toe heb is eigenlijk compleet, ik heb meerdere "testruns" gedraaid, en hier kwamen bijna altijd goede pairings uit. Tot het moment dat ik met een oneven aantal spelers ging spelen en er BYEs in het spel kwamen, en volgens mij ook een keer toen er in een ronde gelijkspel was, maar dat kan ik me niet zo snel herinneren, want dit ging later wel weer goed volgens mij.
Wat ik doe bij het maken van pairings in de code.
1. Ik zoek alle spelers die meedoen in het toernooi, die zijn gesorteerd op volgorde van standings en gaan in een array (#1 t/m #X)
2. Ik haal alle pairings op uit de database van eerdere ronden.
3. (Indien oneven aantal spelers) Ik kijk of de onderste speler een BYE heeft gehad, zo niet, geef ik de BYE, zo ja, kijk ik naar de een-na onderste speler etc... Totdat ik een speler met een BYE heb. Deze haal ik uit de array.
4. Ik pak de speler #1 uit de standings, kijk of deze al tegen speler #2 heeft gespeeld. Zo niet, pair ik deze en haal ze uit de array. Hebben #1 en #2 al tegen elkaar gespeeld, kijk ik of #1 al tegen #3 heeft gespeeld. Zo niet, pair ik deze, zo ja, kijk ik naar #1 en #4 etc. Iedere keer als spelers gepaired worden, haal ik ze uit de array.
5. Zo ga ik door totdat iedereen gepaired is.
Dit gaat goed in ongeveer 80% van de gevallen die ik getest heb. Echter kwam ik een testrun tegen waarbij speler #7 en #8 al eerder tegen elkaar gespeeld hebben. Deze kon ik dus niet pairen. Maar omdat er geen speler #9 was (ivm BYE) kon ik dit ook niet controleren.
Waar ik nu hulp bij zoek is het geval dat het fout gaat. Wat kan ik het beste doen als speler #7 en #8 al tegen elkaar gespeeld hebben. Omdat #1 t/m #6 al gepaired zijn, kan ik hier wat lastig in schuiven. (Op dit moment is er nog niets opgeslagen dus er kan nog van alles gewijzigd worden)
Waar ik zelf aan zat te denken:
Optie 1: Eerst pairen, en dan de speler die overblijft de BYE geven. Mogelijk probleem is dat niet de "slechtste" speler de BYE krijgt.
Optie 2: Groeperen op punten, en dan random gaan pairen tot iedereen met evenveel punten is gepaired, het probleem daarbij is alleen als je een oneven aantal mensen hebt met hetzelfde aantal punten.
Helaas kon ik met Googlen niet een manier vinden hoe ik precies deze berekeningen moet doen. Als iemand dit wel weet, of kan vinden, houd ik me aanbevolen. Ik weet bijvoorbeeld niet of het juist is om eerste de BYE te bepalen, of dat ik de laatst overgebleven speler de BYE moet geven.
TL;DR: Hulp nodig bij ontwikkelen pairing systeem. Werkt nu in ~80% van de gevallen, soms fout ivm dubbele pairing.
🃏 TCG Codex - Je volledige TCG verzameling in je broekzak ::: 🍏 TCG Codex for iOS ::: 🤖 TCG Codex for Android