Spelregels waarmee oma ook kan winnen
Aflevering 2: punten waarbij snel tikken niet automatisch wint, een klok die op elke telefoon gelijk loopt, codes zonder vieze woorden en achttien fouten die ik er expres in stopte.

Vorige week schreef ik vooral woorden. Deze week de spelregels: punten, tijd, de code op de tv en de show zelf. Klinkt als de saaiste week van het project. Het werd de week waarin oma een kans kreeg.
Snel is niet slim
In de meeste quizzen wint wie het snelst tikt. Op een familiefeest weet je dan al vooraf wie er wint, en dat is nooit oma.
Bij ons is goed gewoon goed: 500 punten. Oma tikt na 15 seconden, het neefje na 1 seconde, en ze krijgen allebei 500. Wie het spannender wil, zet de competitieve stand aan: dan komt er een snelheidsbonus bij, tot 250 punten. Standaard? Rustig.

Nog twee regels. Wie gelijk staat, deelt de plek: niemand verliest op een tiende seconde. En de jarige scoort niet op vragen over zichzelf, want Sarah wordt vijftig, niet de quizkampioen van haar eigen leven. Zo kan oma Riet gewoon de prijs "Kent Sarah het best" winnen.
En de trage wifi dan? Uitgerekend: 200 milliseconden vertraging op 4G kost in de competitieve stand ongeveer 2,5 punten. Te weinig om ingewikkeld over te doen.
Tijd is lastig
Dan de klok. De tv telt af, en elke telefoon moet precies hetzelfde laten zien. Alleen staat de klok van een telefoon zelden goed.
Ik vroeg Claude wat daar de standaard voor is. Het antwoord kwam met bronnen: NTP, dezelfde methode waarmee computers hun klok gelijk zetten. Vraag de server een paar keer hoe laat het is, en onthoud het antwoord met de kortste rondreis. Een telefoon waarvan de klok 3 seconden verkeerd staat, loopt daarna toch gelijk met de tv, tot op 250 milliseconden.
De valkuil zagen we net op tijd. Date.now(), de gewone klok van de browser, kan verspringen als de telefoon zijn eigen klok bijstelt. Dus tellen we met performance.now(), een klok die niet verspringt.
De server is streng: te laat is te laat. Daarom sluit de telefoon zijn knoppen net iets eerder, zodat elke tik die hij nog aanneemt ook op tijd aankomt. Niemand ziet "Te laat" terwijl zijn scherm nog 1 seconde gaf.
Vier letters, geen vieze woorden
Op de tv staat een code van vier letters. Zonder I, L, O, Q, U en V, want die lees je van een tv aan de overkant van de zaal verkeerd. Blijven er 160.000 codes over.

Daarna de lijst met woorden die er nooit in mogen. De gewone scheldwoorden, en woorden die op een verjaardag gewoon ongemakkelijk zijn: DOOD, DEAD, FAT. Een code mag zo'n woord ook niet bevatten, dus ASEX valt af, niet alleen SEX. Twee keer 100.000 codes getest, geen enkel verboden woord.
De enige fout zat in mijn test: mijn testgenerator koos één letter te vaak. De echte, met crypto, was wel eerlijk. En tante Els? Die typt "bake" in kleine letters en komt gewoon binnen.
Een show die nooit half klopt
De show zelf is een state machine, een lijstje stappen in een vaste volgorde: lobby, ronde-intro, vraag, antwoorden dicht, onthulling, tussenstand, prijzen, einde, en pauze. Een verboden stap geeft een nette fout, nooit een crash. Twee keer snel op "volgende" tikken slaat dus geen vraag over, en pauze bevriest elk scherm. Daarna loopt de tijd verder waar hij was.
Claude adviseerde eerst om de tussenstand alleen na elke ronde te tonen. Bij het bouwen zag het zelf dat dat niet klopte met het bouwplan en het concept, en kwam het op zijn advies terug. Voordat er één regel code stond. Zo wil ik samenwerken.
Een show heeft ook één vaste beschrijving, gedeeld door de Studio, de AI die straks de vragen maakt en de tv. Streng: een onbekend veld is een fout, geen stille weglating. Schrijft de AI "answer" in plaats van "correct_option", dan merken we dat meteen. Een show met een vraag zonder goed antwoord start niet.
Achttien keer expres kapot
Bij elk onderdeel stopte ik er met opzet fouten in. Drie in de state machine, vier in de punten, vijf in de klok, zes in de show. De tests vingen ze alle achttien. Ik heb deze week achttien keer expres iets kapotgemaakt, en voor het eerst in mijn leven was dat de bedoeling.
Voor de nerds: de spelregels zijn pure TypeScript in een eigen package, getest met Vitest. De state machine: 152 tests, 100% coverage, 10.000 willekeurige acties zonder crash. De klok: 1.000 nagebootste telefoons met een klok 3 seconden ernaast en 20 tot 400 ms netwerk. De 21 rekenvoorbeelden voor de punten staan in één bestand dat straks ook de database controleert. De showbeschrijving: 22 kapotte voorbeeldshows, en elke fout wijst precies aan waar het misgaat.
Volgende week: hoe het eruitziet. Kleuren, letters, knoppen en een logo. Lees je mee? Volg @quizplayground of zet je op de lijst, dan hoor je het zodra je zelf een show kunt maken.
