Een AI die altijd wint bij boter kaas en eieren speelt vals
6 september 2026
Afgelopen weekend ging een potje boter kaas en eieren viraal waarin de computer élk potje wint. Niet door slim te spelen, maar door je kruisjes weg te gummen, twee keer achter elkaar te zetten en je winst ongeldig te verklaren. Ik heb de code gelezen. Hieronder staat precies hoe het bedrog werkt en waarom het niet anders kán.
Je hebt drie kruisjes op een rij. Linksboven, midden, rechtsonder. Je hand gaat al van de muis, want dit is binnen. En dan verdwijnt het kruisje in het midden. Het vakje is gewoon leeg. In de zijbalk verschijnt een nette regel: “Three in a row? One of those Xs was offside.”
Dat is tictactoe.gripe, gemaakt door ontwikkelaar Shaw. Hij zette het op 5 september op X met één zin erbij: “I made a tic tac toe game where the AI wins every time.” Een dag later stond er een eigen domeinnaam onder, want het liep uit de hand. In de titelbalk van de pagina staat waar het echt over gaat: Tic Tac Cheat, the house always wins.
Waarom een eerlijke computer dit potje nooit kan winnen
Hier zit de grap in, en de meeste mensen die het spelen zien hem niet meteen. Boter kaas en eieren is een opgelost spel. Alle 255.168 mogelijke partijen zijn uitgerekend, en de uitkomst bij foutloos spel van beide kanten ligt vast: remise. Altijd.
Een computer die perfect speelt wint dus niet van jou. Hij wacht tot jíj een fout maakt. Maak je die niet, dan wordt het gelijkspel en daar houdt het op. Dat is geen zwakte van het algoritme, dat is het spel. Minimax rekent alle takken door en komt tegen een foutloze tegenstander steevast op nul uit.
Dus als iemand zegt dat zijn AI altijd wint bij boter kaas en eieren, hoef je niet naar de code te kijken om te weten dat er iets niet klopt. Er zijn maar twee mogelijkheden: de tegenstander maakt elke keer een fout, of de regels zijn onderweg veranderd. Shaw koos de tweede, en hij is er tenminste eerlijk over.
De eerste zet is eerlijk, en dat is precies de val
In het bestand rules.js staat één regel die alles verraadt:
// The opening is always exactly one ordinary move, without a violation.
if (turn === 1) { place(); return { steps, board, kind: 'legal' }; }
Beurt één is schoon. Eén O, netjes in een leeg vakje, geen enkele overtreding. Dat is het haakje: je moet even geloven dat je tegen een gewoon spelletje speelt, anders is de rest niet grappig. Vanaf beurt twee wisselt het programma tussen twee vaste trucs, en welke van de twee eerst komt wordt per potje door een muntje bepaald.
| Wat je in de zijbalk leest | Wat de code doet |
|---|---|
| “Your X has expired.” | Een willekeurig kruisje van jou wordt van het bord gehaald |
| “Actually, one more thing.” | De zetfunctie draait twee keer: twee O’s in één beurt |
| “Three in a row? One of those Xs was offside.” | Sta je op winst, dan gaat er meteen een kruisje uit die rij; heb je twee winnende rijen tegelijk, dan precies het vakje dat ze delen |
| “We need this seat.” | Geen leeg vakje meer voor een O, dus gaat er een kruisje weg om plaats te maken |
| “A draw? We have reopened your application.” | Bord vol zonder winst voor het huis: een kruisje verdwijnt en het potje loopt door |
Die laatste twee zijn het venijnigst. Remise is de enige uitslag die je met eerlijk spel kunt afdwingen, en die uitkomst is er domweg uitgesloopt. Er staat letterlijk een regel in de code met de opmerking “Never hand back a full board as a draw.” Van de drie soorten remise die dit spel kent haal je er hier nul.
Ik heb het geteld: in 38 potjes lukte het me precies één keer om drie kruisjes op een rij te krijgen. Die werd meteen afgekeurd, met de offside-melding uit de tabel hierboven. In de andere 37 kwam ik niet eens zo ver, omdat er telkens een kruisje verdween of het huis er twee rondjes tegelijk bij zette.
Zeven O’s op het bord en er ligt altijd een rij
Dit is het stukje waar ik echt om moest lachen. Boven de code staat een commentaarregel die je normaal in serieuze software tegenkomt, een korte redenering waarom het programma niet oneindig kan doorlopen:
// Every response adds an O and never removes one. Seven Os force a // winning line; even repeated erasures cannot produce an endless game.
Vertaald: elke beurt komt er een O bij en er verdwijnt er nooit een. Op een bord van negen vakjes kun je hooguit zes O’s kwijt zonder dat er drie op een rij komen, en dat lukt maar op twee manieren: de vier randvakjes plus twee hoeken die schuin tegenover elkaar liggen. Bij de zevende O kan het niet meer misgaan. Het bedrog is dus niet zomaar wat gerommel, het is een sluitend bewijs dat het huis binnen een vast aantal beurten wint. Iemand is gaan zitten uitrekenen dat zijn valsspelen gegarandeerd afloopt.
Speel het maar met een blocnote ernaast. Kruisjes komen en gaan, het aantal O’s loopt alleen maar op.
In beroep gaan kost je een punt
Rechts van het bord houdt de pagina een incidentenlijst bij, met een teller die meeloopt. Elke overtreding wordt netjes genoteerd, genummerd en bewaard. Daaronder zit een knop, “File an appeal”, en die is de beste vondst van het hele ding. Je klikt, en het huis krijgt er een punt bij: “Appeal denied. A processing fee of one point was awarded to the House.”
Onderaan staat als kleine letters “Score certified by the House Department of Scoring” en in de voettekst “built with artificial intelligence insecurity”. Het is een grap over algemene voorwaarden en over elk systeem dat tegelijk speler en scheidsrechter is. Precies daarom werkt hij: iedereen die weleens bezwaar heeft gemaakt bij een partij die zelf over dat bezwaar gaat, herkent de knop.
Onverslaanbaar is een woord waar je naar moet doorvragen
Onder de lol zit iets dat ik serieus meen. “Deze AI wint altijd” klinkt als een prestatie, maar bij een opgelost spel is het een bekentenis. Je hoort de claim, je weet dat de uitkomst wiskundig vastligt, en dan is er nog maar één conclusie mogelijk: er is aan de regels gezeten. Bij boter kaas en eieren kun je dat in vijf minuten narekenen. Bij grotere claims over kunstmatige intelligentie lukt dat meestal niet, en dat is nou precies waarom dit grapje zo lekker landt.
Het aardige is dat de film WarGames dit punt in 1983 al maakte, alleen omgekeerd. Daar leert de computer via boter kaas en eieren dat sommige spellen niet te winnen zijn, en dat je dus beter niet kunt beginnen. Shaws computer trekt uit hetzelfde spel de tegenovergestelde les: als je niet kunt winnen, verander dan de spelregels. Twee eerlijke antwoorden op dezelfde wiskunde. Raad eens welke van de twee in 2026 gemaakt is.
Onze eigen knop heet ook Onverslaanbaar, en dat is te groot
Eerlijk is eerlijk: wij gebruiken datzelfde woord. Het zwaarste niveau van de computer op deze site heet Onverslaanbaar, en dat klinkt indrukwekkender dan het is. Die AI wint niet altijd. Die verliest alleen nooit. Speel je zelf foutloos, dan sta je gewoon met gelijkspel op het bord, en dat is geen kunststukje: in een klas met 24 leerlingen liep het 22 keer op remise uit, binnen een half uur.
“Onverslaanbaar” is dus een nette naam voor “haalt minimaal gelijkspel”. Dat is precies wat perfect spel oplevert en geen millimeter meer. Wie dat woord op onze site leest en denkt dat de computer hem gaat inmaken, wordt door ons ook een beetje op het verkeerde been gezet.
Zesenvijftig regels code, en je ziet het zelf
Het mooiste aan deze grap is dat hij openligt. Ga naar tictactoe.gripe/tic-tac-cheat/rules.js en je hebt het complete bedrog voor je: zesenvijftig regels, gewone woorden, functies die erase en place heten. Ook zonder programmeerervaring zie je aan de namen wat er gebeurt.
Dat is meteen het nuttigste dat je vandaag met dit verhaal kunt doen, en het geldt breder dan één grappig spelletje: bij elke website die iets doet in je browser kun je zelf gaan kijken wat er onder de motorkap zit. Een spel dat op je scherm draait, houdt zijn regels niet geheim. Voor kinderen die een beetje willen leren programmeren is dit trouwens een prachtig eerste bestand, want de code doet iets ondeugends en dat leest een stuk fijner dan een oefening met optellen.
Ga daarna een potje spelen tegen een computer die zich wel aan de regels houdt en probeer remise te halen. Dat lukt, en juist daarom is het interessant. Een tegenstander die niet kan verliezen is een puzzel. Een tegenstander die niet kan verliezen omdat hij de puzzel mag herschrijven, is een cabaretnummer met een knop erop.
Het spel staat nu op een eigen domein, dus voorlopig blijft het staan. Interessanter wordt het als er kopieën verschijnen die de grap weglaten: dezelfde trucs, geen incidentenlijst, geen bekentenis in de zijbalk. Dan wint de computer nog steeds altijd, en zoekt de speler de fout bij zichzelf.