Ik heb een nieuwe programmeeromgeving ontdekt en ik ben een beetje verliefd.

Hoera voor pico-8, een soort mini-console met ingebouwde IDE en sprite editor en map editor en muziekschrijfprogramma en alles! ‘t Is doelbewust heel erg beperkt gehouden: 16 kleuren, 128×128 pixels, alleen twee joysticks als input (up-down-left-right-A-B), 4 bleep bloop geluidskanalen.

Als ik een nieuw ding vind, dan doe ik altijd hetzelfde: een spelletje van vijf op een rij, tegen de computer, waarbij van onderaan en rechts stenen het veld op geschoven kunnen worden, en de nieuwe stenen doen de andere stenen verschuiven, enfin ‘t is gemakkelijk en geestig.

Stap één is normaal gezien het allemaal werkend krijgen, en dan stap twee het een uitzicht geven — maar met pico-8 is het bijna vanzelfsprekend om het eerst te tekenen, en dan pas te beginnen denken aan programmeren.

Ik dus rap wat sprites getekend:

pico0

…waarmee dan een speelveld kan gemaakt worden:

pico4

Joystick selecteert de positie, button A schuift een pion in, en er is een geluidje als dat gebeurt. Hoera!

Volgende stap: een beetje opkuis houden in de code die de pionnen zet. Neen, het is geen goed idee om het zo te doen, foei:

pico5

Mijn excuus is dat ik het in de rapte wou doen en dat ik niet direct snel een manier vond om een beetje time-out te laten tussen de bewegingen en dat ik het dan dus maar allemaal maal 10 heb gedaan en dan gedeeld door 10, maar dat dat niet helemaal deed wat het moest doen en dat de volgorde dan verkeerd zat en dan.. aargh, ja, spaghetti.

Maar vóór ik er aan begin voor ‘t echt, moet ik wel weten wat er allemaal mogelijk is met de gelobotomiseerde versie van Lua die in de pico-8 zit. Een beetje spel heeft een min of meer intelligente tegenspeler nodig. Minimax to the rescue, en dan recursief borden evalueren — maar lukt dat wel, recursie?

Eens kijken of ik faculteiten kan berekenen? Jawel! Hoppatey:

pico1 pico2

…zo lang het niet om al te grote getallen gaat, tenminste:

pico6 pico7

Tee hee. 🙂

Volgende stap: een functie schrijven om een spelpositie te evalueren, en dan iets in deze zin

evaluatie(ply, bord, speler)
  if (ply=computersterkte)
    return evalueer(bord)
  end
  waarde=-9999
  for move=1,10 do
    nieuwbord = [nieuw bord met move]
    dezewaarde = spelerwaarde*evaluatie(ply+1, nieuwbord, andere speler)
    if (dezewaarde>waarde) waarde=dezewaarde
  end
  return speler*waarde
end

Telkens alle zetten afgaan, een nieuw bord maken, en dan weer alle zetten als reactie op die zet maken en een nieuw bord maken, en blijven doen tot een bepaald maximum — dat geeft dan uiteindelijk, als alles goed gaat, een redelijk degelijke zet van de computer. Op voorwaarde dat de evalueerfunctie haar werk doet, natuurlijk.

L e u t i g !

Ik zou enorm graag hebben dat minstens één van onze kinderen daar evenveel plezier mee zou hebben als ik er mee had toen ik zo oud was. ‘t Zit er niet in, vrees ik, maar ik geef het niet op.