Ondanks dat ik bijna altijd programmeer in Java, met een enkel uitstapje naar PHP en wat vingeroefeningen in andere talen, vandaag toch een blog over iets totaal anders. Hoewel…

Het is een typische dag in Corona-tijd: ik ben thuis aan het werk voor mijn opdrachtgever en vandaag heb ik gezelschap van mijn tienjarige zoon. Zijn juf is namelijk ziek, dus moet ook hij een dagje thuiswerken.

Gelukkig is hij gisteren gewapend met zijn Chromebook thuisgekomen, dus kunnen we gezellig samen aan de eetkamertafel werken. Elk op onze eigen computer.

Hij weet natuurlijk dat mijn werk programmeren is, dus vindt hij het heel leuk om mij de game die hij heeft gemaakt te laten zien.

Gemaakt in Scratch (https://scratch.mit.edu/).

Nu had ik al weleens gehoord van Scratch, maar heb er nooit zoveel aandacht aan besteed. Tot de demo van mijn zoon.

Spooky game

Hij liet me zijn zelfgemaakte game zien: een vleermuis die op jacht is naar magische drankjes en 2 spoken die hem proberen tegen te houden en te vangen.

Nieuwsgierig naar hoe hij te werk is gegaan, heb ik zelf een gratis account gemaakt op de Scratch-website en een clone van zijn game gemaakt.

Een fork van zijn project dus eigenlijk 😉

Het spel bestaat uit verschillende figuren die op het speelbord te plaatsen zijn. Als je dit in Java-termen uit wil drukken, kom je al snel bij ‘Objecten’. Elk object heeft zijn eigen eigenschappen en gedrag.

Dit gedrag wordt door de jonge programmeur bepaald door blokken te slepen en daarin gegevens in te vullen. En ook hier zie je al van overeenkomsten met hoe een volwassen collega te werk gaat.

Er is bijvoorbeeld een ‘forever’-blokje, waarin je een ander blokje kunt zetten. Een while(true) dus eigenlijk. Een ander voorbeeld is ‘wait’, waarin je een aantal seconden in kunt vullen. Thread.sleep(x) dus. Naast deze blokjes zijn er nog blokjes voor zaken als een ‘if’, ‘if else’, ‘while()’, enzovoorts.

Scratch biedt praktisch alles om een fatsoenlijke flow van een applicatie te bepalen.

flow

Natuurlijk moet de score bijgehouden worden, dus daar is ook een variabele voor gemaakt. Blijkbaar kan ik daar alleen nummers in kwijt, maar voor dit doel is dat voldoende. En het neemt meteen mijn angst weg dat het een soort van ‘variant’ is, die ‘alles’ kan bevatten. De scope van deze score variabele is dan wel globaal, maar in de context van wat we hier aan het doen zijn, is dat niet eens zo verkeerd.

Al met al begin ik best enthousiast te worden over Scratch.

Nu noemde ik eerder dat de objecten zoals de vleermuis en de spoken, maar ook het drankje en de startknop hun eigen eigenschappen hebben. Ze werken ook helemaal onafhankelijk van elkaar. Zie het als meerdere threads.

‘Gelukkig’ kun je daarmee ook een irritant muziekje op de achtergrond laten spelen, terwijl alle objecten zich gedragen conform hun eigen code.

En over gedrag gesproken; hiervoor worden blokjes als ‘Move <> steps’ aangeboden om een object te verplaatsen. Tussen de <> plaats je weer een object of voer je een vaste waarde in. Het eerste spookje beweegt altijd 10 stappen, maar de tweede beweegt score steps, huh?

Als ik navraag bij de hoofdprogrammeur doe over waarom dit is, vertelt hij dat dat is om het spel steeds iets moeilijker te maken. Dit heeft helaas tot gevolg dat het spookje zo snel gaat bewegen als de punten toenemen, dat tot nu toe niemand meer dan 25 punten heeft kunnen halen.

A feature, or a bug?

We verzinnen een oplossing: beide spookjes bewegen steps, zolang de score maar kleiner is dan 10. Is hij hoger, dan beweeg je gewoon vanaf dat moment met een snelheid van 10 steps. Een simpele ‘if-else’ toegevoegd met een conditie van ‘score < 10’ en alles werkt zoals we willen.

Ieder object kan events ontvangen. Op die manier kunnen we de interactie tussen de objecten regelen. Ook iets wat de gemiddelde programmeur niet onbekend voorkomt.

Dit principe is heel krachtig en dat bewijst Scratch ook maar weer eens. Het spel was afgelopen als een spook jou gevangen had, maar dat passen we met een paar klikken aan naar puntenvermindering. Ieder object heeft immers toegang tot de globale ‘score’.

Het spel kan nu eeuwigdurend gespeeld worden, maar dat is natuurlijk niet handig. Dus maken we een ‘Stop’-knop die het ‘Game over’-event verstuurt. Alle objecten reageren hierop door te stoppen.

Events gebruiken ik en mijn Scratch-master bijvoorbeeld ook om het spel te starten en de vleermuis de cursor te laten volgen.

Al met al was Scratch heel leuk om eens mee te spelen. Ik denk dat het heel leerzaam is voor kinderen om Scratch te gebruiken, want toen ik mijn zoon vroeg wat hij er nu van had geleerd had hij in zijn beleving niet zozeer geleerd, maar gespeeld.

Ik op mijn beurt denk dat hij in werkelijkheid een basis heeft gelegd die heel waardevol is in zijn verdere leven: hij heeft logisch nagedacht en een groter probleem in kleinere stappen opgedeeld. Vervolgens heeft hij iedere stap opgelost en met al die kleine stapjes samen een grotere oplossing gemaakt.

Iets wat wij developers iedere dag doen natuurlijk. Problemen oplossen waar, met dank aan Scratch voor de reminder, altijd wel een mouw aan te passen is. Als je het maar weet terugbrengen tot kleine blokjes.

Zo maakt Scratch op een heel toegankelijk manier duidelijk hoe mooi programmeren toch is en hoe nuttig het is voor kinderen om zich er ook eens aan te wagen.

Aanrader!

 

PS De code van CIO Nathan staat hier: https://scratch.mit.edu/projects/535611199/ en mijn speelprojectje staat hier: https://scratch.mit.edu/projects/537377157. In scratch is alles open source, je kunt gewoon je eigen ‘Remix’ (Fork!) maken van een bestaand project. Veel plezier.