5 · Vang de vallende appels

Je bouwt je eerste échte spel: appels vallen uit de lucht en jij vangt ze op met een mand die je met de pijltjestoetsen bestuurt. Je leert wat een variabele is (je houdt er je score en je levens mee bij), je gebruikt een herhaal tot-lus om iets te laten vallen, en je laat het spel moeilijker worden naarmate je beter speelt. Dit is de opdracht waarin losse blokken plots een spel worden.

★★☆ middel 14 stappen ongeveer 60 minuten

Wat leer je?

  • Wat een variabele is en waarom je er een score mee bijhoudt
  • Waarom "maak score 0" buiten je lus moet staan
  • Het verschil tussen herhaal voortdurend en herhaal tot
  • Botsingen herkennen met raakt ...? en de operator of
  • Een spel eerlijk maar moeilijker maken naarmate de score stijgt

Wat heb je nodig?

  • Een nieuw, leeg Scratch-project
  • De sprite Bowl (de mand of schaal) — of een andere sprite als mand
  • De sprite Apple (de appel)
  • Eén geluidje, bijvoorbeeld Pop of Boing

Weet je niet meer waar de sprite-knop staat? Kijk even bij De werkplek.

Stap voor stap

Je werkt in dit project met twee sprites. Boven elk script staat daarom altijd duidelijk bij welke sprite het hoort — klik die sprite eerst aan, anders bouw je je blokken bij de verkeerde figuur. Vink een stap af als hij klaar is; je browser onthoudt dat.

1

Zet je twee sprites klaar

Uiterlijk

Verwijder de kat (klik op het prullenbakje op de kat-tegel rechtsonder). Klik daarna op de sprite-knop rechtsonder en zoek Bowl: dat wordt je mand. Voeg op dezelfde manier Apple toe. Je hebt nu twee sprites, en elke sprite heeft zijn eigen codegebied. Geef ze meteen een startpositie en een startgrootte, zodat elke ronde hetzelfde begint.

Sprite: Mand

als wordt aangeklikt
maak grootte 100 %
ga naar x: 0 y: -140

Sprite: Appel

als wordt aangeklikt
maak grootte 60 %
Waarom y: -140? Het speelveld loopt van y = -180 (helemaal onderaan) tot y = 180 (helemaal bovenaan). Op -140 staat je mand mooi op de bodem, maar valt hij er niet half uit. Een kleinere appel (60 %) maakt het spel bovendien wat pittiger.
  • Ik zie twee sprites: Mand en Appel
2

Bestuur de mand met links en rechts

Besturing

Klik de sprite Mand aan. Sleep uit Besturing een "herhaal voortdurend" onder je startblokken, en zet daar twee "als ... dan"-blokken in. De zeshoekjes vul je met "toets ... ingedrukt?" uit Waarneming. In de mond van elk als-blok komt "verander x met ..." uit Beweging.

Sprite: Mand

als wordt aangeklikt
maak grootte 100 %
ga naar x: 0 y: -140
herhaal voortdurend
als toets pijltje rechts ingedrukt? dan
verander x met 10
als toets pijltje links ingedrukt? dan
verander x met -10
Waarom alleen x? Je mand mag naar links en naar rechts, maar nooit omhoog of omlaag — anders kan je alle appels gewoon gaan ophalen. Door alléén x te veranderen blijft y vastzitten op -140. En waarom een lus? Zonder "herhaal voortdurend" kijkt Scratch precies één keer of je op een toets duwt, in de eerste milliseconde van je spel. Met de lus kijkt hij tientallen keren per seconde opnieuw.
  • Mijn mand schuift heen en weer met de pijltjes

Testmoment — bestuurt je mand goed?

controle

Klik op de groene vlag en hou de pijltjestoetsen ingedrukt. De mand hoort vloeiend naar links en rechts te schuiven. Werkt het niet? Loop deze lijst af:

  • Heb je de sprite Mand geselecteerd toen je de blokken sleepte? Klik de sprite aan en kijk of je script er staat.
  • Zitten de twee als-blokken écht in de mond van "herhaal voortdurend", of staan ze eronder? Sleep het hoedblok een stukje: alles moet meekomen.
  • Beweegt de mand maar één klein stapje en dan niet meer? Dan is je "herhaal voortdurend" vergeten of los blijven zweven.
  • Gaat de mand de verkeerde kant op? Dan staan +10 en -10 verwisseld.
  • Klik eerst één keer op het speelveld voor je de pijltjes gebruikt — anders luistert je browser nog niet naar Scratch.
  • De mand reageert netjes op links en rechts
4

Maak de variabele "score"

Variabelen

Klik links op de oranje categorie Variabelen en dan op Maak een variabele. Typ als naam score en kies Voor alle sprites. Er verschijnt nu links een oranje bolletje "score", én linksboven op het speelveld een klein scorebordje.

Wat is een variabele? Denk aan een doosje met een naam erop. In het doosje "score" zit precies één ding tegelijk: een getal. Je kan er iets nieuws in leggen (maak score 0), je kan er iets bij doen (verander score met 1), en je kan er altijd in kijken door het ronde blokje score te gebruiken. Zonder variabele kan je computer niets onthouden tijdens het spelen.
maak score 0
verander score met 1
score
Let op het verschil: "maak score 0" gooit het doosje leeg en legt er 0 in. "verander score met 1" laat zitten wat er al is en telt er 1 bij. Wie deze twee door elkaar haalt, houdt eeuwig een score van 1 over.
  • De variabele score staat op mijn speelveld
5

Zet de score op 0 — buiten de lus!

Variabelen

Klik nu de sprite Appel aan; die krijgt de rest van het spel. Sleep "maak score 0" tot vlak onder het hoedblok. Dat blok hoort dus vóór je grote lus te staan — het is een startinstelling, iets wat maar één keer per spel gebeurt.

Sprite: Appel

als wordt aangeklikt
maak grootte 60 %
maak score 0
De klassieke fout: zet je "maak score 0" straks per ongeluk in je "herhaal voortdurend", dan wordt je score bij elke appel opnieuw op nul gezet. Je telt dan wel punten, maar ze verdwijnen meteen weer en je scorebord blijft op 0 of 1 hangen. Onthoud: instellen doe je buiten de lus, tellen doe je erin.
  • "maak score 0" staat vlak onder mijn hoedblok
6

Maak de variabele "levens" en zet ze op 3

Variabelen

Maak op dezelfde manier een tweede variabele: levens, ook voor alle sprites. Zet ze bij de start op 3. Elk doosje bewaart één ding, dus je hebt echt twee aparte variabelen nodig: één voor je punten en één voor je kansen.

Sprite: Appel

als wordt aangeklikt
maak grootte 60 %
maak score 0
maak levens 3
Waarom ook levens resetten? Speel je een tweede ronde zonder deze regel, dan begin je met 0 levens en is het spel meteen voorbij. Alles wat aan het begin van een spel moet kloppen — score, levens, positie, grootte, snelheid — zet je hier netjes op een rij.
  • Score staat op 0 en levens op 3 bij de start
7

Laat de appel bovenaan verschijnen — op een willekeurige plek

Beweging

Sleep onder je startinstellingen een "herhaal voortdurend" uit Besturing. Zet daar als eerste "ga naar x: ... y: ..." in. In het x-vakje sleep je het ronde blokje willekeurig getal tussen ... en ... uit de groene categorie Operatoren. Vul -220 en 220 in, en zet y op 170.

Sprite: Appel

als wordt aangeklikt
maak score 0
maak levens 3
herhaal voortdurend
ga naar x: willekeurig getal tussen -220 en 220 y: 170
Waarom -220 en 220? Het speelveld loopt van x = -240 tot x = 240. Zou je -240 en 240 kiezen, dan verschijnt je appel half buiten beeld. Met 220 blijft hij altijd volledig zichtbaar. Het blokje "willekeurig getal" kiest élke keer opnieuw een ander getal — daarom valt je appel nooit twee keer op precies dezelfde plek.
  • Mijn appel springt bovenaan van plek naar plek
8

Laat de appel vallen tot hij iets raakt

Besturing

Sleep uit Besturing een "herhaal tot ..." onder je "ga naar"-blok, maar nog steeds binnen de grote lus. In het zeshoekje zet je de operator of uit Operatoren, en daarin twee keer "raakt ...?" uit Waarneming: één keer Mand, één keer rand. In de mond komt "verander y met -5".

Sprite: Appel

herhaal voortdurend
ga naar x: willekeurig getal tussen -220 en 220 y: 170
herhaal tot raakt Mand ? of raakt rand ?
verander y met -5
Twee lussen in elkaar — wat gebeurt er precies? De binnenste lus zegt: "zak 5 pixels, kijk of je iets raakt, zak nog 5 pixels, kijk opnieuw ...". Zodra de appel de mand óf de rand raakt, stopt die lus en gaat het script verder. De buitenste lus stuurt de appel dan weer naar boven, en het begint opnieuw. Herhaal voortdurend stopt nooit, herhaal tot stopt zodra de voorwaarde waar wordt.
Waarom "of"? Er zijn twee manieren waarop het vallen mag eindigen: gevangen (raakt Mand) óf gemist (raakt rand, want dan is hij onderaan). Het blokje "of" is waar zodra minstens één van de twee waar is. Zou je "en" gebruiken, dan moest de appel de mand én de rand tegelijk raken — dat gebeurt bijna nooit en je appel valt eeuwig door.
  • De appel valt naar beneden en springt daarna terug omhoog
9

Punt erbij of leven eraf

Besturing

Als de val-lus klaar is, moet je weten waaróm ze klaar is: gevangen of gemist. Sleep daarom een "als ... dan ... anders"-blok net onder je "herhaal tot", nog steeds binnen de grote lus. Vraag opnieuw "raakt Mand?". Zo ja: punt erbij. Zo nee: leven eraf.

Sprite: Appel

herhaal tot raakt Mand ? of raakt rand ?
verander y met -5
als raakt Mand ? dan
verander score met 1
anders
verander levens met -1
Waarom nog eens vragen? Scratch onthoudt niet hoe de lus eindigde. Door meteen daarna opnieuw "raakt Mand?" te vragen, sta je precies op het moment dat de appel de mand nog aanraakt en weet je zeker welk van de twee er gebeurd is. "Anders" vangt alle overige gevallen op — hier dus: de appel is de bodem geraakt.
  • Score gaat omhoog bij vangen, levens gaan omlaag bij missen

Testmoment — speel drie appels lang

controle

Klik op de vlag en speel even. Vang er eentje, mis er eentje, en kijk naar de twee tellers linksboven. Klopt er iets niet? Loop deze lijst af:

  • Score springt niet omhoog als je vangt? Je mand heet in het blok "raakt ...?" misschien nog Bowl in plaats van Mand. Kies de juiste naam in het dropdownlijstje.
  • Score blijft op 0 of 1 hangen? Dan staat "maak score 0" per ongeluk in je lus in plaats van erboven.
  • De appel wordt meteen "gevangen" zonder te vallen? Hij raakt de bovenrand al bij het verschijnen. Zet y op 150 in plaats van 170, of maak je appel wat kleiner.
  • Levens gaan met sprongen van 2 of 3 omlaag? Dan staat je als/anders per ongeluk binnen de "herhaal tot"-lus in plaats van eronder.
  • Alles gaat razendsnel? Dat hoort een beetje zo. Zet -5 tijdelijk op -3 om rustiger te kunnen testen.
  • Vangen geeft +1 punt, missen kost precies 1 leven
11

Een geluidje bij het vangen

Geluid

Klik bovenaan links op het tabblad Geluiden (naast Uiterlijken). Klik linksonder op het luidsprekertje en kies een kort geluid, bijvoorbeeld Pop of Boing. Ga terug naar Code en sleep "start geluid ..." als eerste blok in de dan-tak van je als/anders.

Sprite: Appel

als raakt Mand ? dan
start geluid Pop
verander score met 1
anders
verander levens met -1
"start geluid" of "speel geluid af en wacht"? In een spel gebruik je bijna altijd start geluid: het geluidje begint en je script loopt meteen verder. Kies je "speel geluid ... af en wacht", dan staat je hele spel stil zolang het geluid duurt — je appel hangt dan telkens even in de lucht. Wacht-blokken zijn fijn in een verhaaltje, hinderlijk in een spel.
  • Ik hoor een plopje als ik een appel vang
12

Game over bij 0 levens

Besturing

Een spel dat nooit eindigt, is geen spel. Zet in de anders-tak, vlak onder "verander levens met -1", een nieuw "als ... dan". In het zeshoekje komt de operator = uit Operatoren: links het ronde blokje levens, rechts het getal 0. In de mond zet je een "zeg"-blok uit Uiterlijk en daaronder "stop alles" uit Besturing.

Sprite: Appel

als raakt Mand ? dan
start geluid Pop
verander score met 1
anders
verander levens met -1
als levens = 0 dan
zeg Game over! gedurende 2 seconden
stop alles
Waarom net hier? Levens kunnen alleen in de anders-tak veranderen, dus dat is de enige plek waar je moet controleren. En let op de vorm van "stop alles": dat blok heeft geen nokje onderaan. Er kan niets meer achter komen, want daarna gebeurt er niets meer — het is een eindblok.
  • Bij 0 levens stopt het spel met een boodschap
13

Steeds sneller — het spel groeit met jou mee

Variabelen

Maak een derde variabele: valsnelheid. Zet ze bij de start op -5 (negatief, want de appel gaat naar beneden). Vervang daarna in je val-lus het vaste getal -5 door het ronde blokje valsnelheid. En elke keer dat je een appel vangt, doe je er -0.3 bij: -5 wordt -5,3 wordt -5,6 ... hoe hoger je score, hoe sneller de appels vallen.

Sprite: Appel — bij de startinstellingen

maak valsnelheid -5

Sprite: Appel — in de val-lus

herhaal tot raakt Mand ? of raakt rand ?
verander y met valsnelheid

Sprite: Appel — in de dan-tak, na het punt

verander score met 1
verander valsnelheid met -0.3
Waarom een variabele in plaats van een vast getal? Een vast getal kan je tijdens het spelen niet meer veranderen — een variabele wél. Precies daarom bestaan variabelen. Bij een score van 20 val je al aan -11 pixels per stap: bijna dubbel zo snel als in het begin. Dat heet een moeilijkheidscurve, en het is wat een spel spannend houdt. Vergeet niet de valsnelheid ook bij de start te resetten, anders begint je tweede ronde meteen op topsnelheid.
  • Hoe hoger mijn score, hoe sneller de appels vallen

Eindtest — speel je spel helemaal uit

controle

Speel tot je alle drie je levens kwijt bent, en start daarna meteen een tweede ronde. Alles moet dan weer netjes van voren af aan beginnen. Controleer:

  • Begint ronde twee echt met score 0, 3 levens én de trage beginsnelheid? Zo niet: er ontbreekt een "maak ..."-blok bij je startinstellingen.
  • Blijft het spel doorlopen ná "Game over"? Dan zit "stop alles" nog niet op zijn plek, of staat het buiten het als-blok.
  • Wordt het spel onspeelbaar snel? Zet -0.3 op -0.15. Te makkelijk? Probeer -0.5.
  • Klik op het volledige-scherm-knopje boven het speelveld en laat een klasgenoot spelen zonder uitleg. Snapt hij het spel meteen? Dat is de echte test.
  • Mijn opdracht 5 is af — het spel is uitspeelbaar en herspeelbaar

Het volledige script

Zo ziet je afgewerkte project eruit. Let goed op: het zijn twee scripts, elk bij een andere sprite. Vergelijk ze met wat er op jouw scherm staat.

Sprite: Mand

als wordt aangeklikt
maak grootte 100 %
ga naar x: 0 y: -140
herhaal voortdurend
als toets pijltje rechts ingedrukt? dan
verander x met 10
als toets pijltje links ingedrukt? dan
verander x met -10

Sprite: Appel

als wordt aangeklikt
maak grootte 60 %
maak score 0
maak levens 3
maak valsnelheid -5
herhaal voortdurend
ga naar x: willekeurig getal tussen -220 en 220 y: 170
herhaal tot raakt Mand ? of raakt rand ?
verander y met valsnelheid
als raakt Mand ? dan
start geluid Pop
verander score met 1
verander valsnelheid met -0.3
anders
verander levens met -1
als levens = 0 dan
zeg Game over! gedurende 2 seconden
stop alles
De klassieke beginnersfout Bijna iedereen zet "maak score 0" een keer in de lus in plaats van erboven. Het lijkt zo logisch — het hoort toch bij het spel? Maar dan gebeurt dit: appel valt, je vangt hem, score wordt 1 ... en bij de volgende ronde van de lus zet Scratch je score meteen weer op 0. Je scorebord knippert wat, maar je komt nooit verder dan 1. Precies hetzelfde geldt voor "maak levens 3": staat dat in de lus, dan kan je nooit game over gaan, want je krijgt je levens elke ronde cadeau. De vuistregel: alles wat je één keer per spel instelt (score, levens, snelheid, positie) hoort boven de lus; alles wat elke ronde opnieuw gebeurt, hoort erin. Twijfel je? Sleep het blok een stukje opzij en kijk waar de gele arm van "herhaal voortdurend" omheen ligt.

Uitdagingen

Klaar en nog tijd over? Deze drie uitdagingen hebben géén uitgewerkte oplossing — zoek zelf uit hoe je ze oplost. Alle blokken die je nodig hebt, ken je nu.

A

Een bonusappel

makkelijk

Voeg een tweede vallende sprite toe — bijvoorbeeld een gouden appel of een banaan — die 5 punten waard is in plaats van 1. Tip: klik met de rechtermuisknop op je appel-sprite en kies "dupliceren". Je krijgt dan een kopie mét script; je hoeft er maar twee getallen in aan te passen.

B

Een bom die je moet ontwijken

middel

Laat er ook bommen vallen. Vang je er één, dan verlies je meteen een leven in plaats van er punten bij te krijgen. Tip: het script lijkt sterk op dat van de appel, maar in de dan-tak en de anders-tak staat precies het omgekeerde. Denk goed na over wat er moet gebeuren als een bom de bodem raakt — dat is dan juist géén straf.

C

Highscore die blijft staan

pittig

Maak een vierde variabele highscore die je niet op 0 zet bij de start. Vergelijk aan het einde van elk spel je score met de highscore, en zet er de hoogste van de twee in. Tip: je hebt de operator > nodig en een als-blok op de juiste plaats. Extra pittig: laat de mand een klein sprongetje of een kleurflits doen als je een nieuw record haalt.

Vorige opdracht 6 · De interactieve quiz