8 · Pong tegen de computer

Je bouwt het allereerste videospel ter wereld na: Pong. Twee peddels, één kaatsende bal, en een tegenstander die je niet kan verslaan door hem te overrompelen — want die tegenstander is de computer zelf. Je leert hoe een bal realistisch terugkaatst (en waarom "draai 180 graden" daarvoor eigenlijk niet klopt), hoe je met x-positie ziet wie een punt scoort, en hoe je in vijf blokken een computer-tegenstander maakt die de bal volgt — inclusief het knopje waarmee je hem makkelijker of gemener maakt.

★★★ pittig 20 stappen ongeveer 100 minuten

Wat leer je?

  • Zelf een sprite tekenen in de teken-editor (een rechthoek als peddel)
  • Werken met richting: wijzen, kaatsen en een richting spiegelen
  • Een sprite binnen het veld houden met x-positie en y-positie
  • Punten scoren op basis van waar de bal is, niet wat hij raakt
  • Je eerste computer-AI: een tegenstander die zelf beslist
  • Een spel eerlijk afstellen — snelheid, reactietijd en moeilijkheid

Wat heb je nodig?

  • Een nieuw, leeg Scratch-project
  • Drie sprites: Speler, Computer (twee zelfgetekende peddels) en Bal
  • Voor de bal kan je de kant-en-klare sprite Ball gebruiken
  • Eventueel een kort geluidje, bijvoorbeeld Pop of Boing

Opdracht 7 eerst gedaan? Dan ken je "zend signaal" al — dat komt hier terug. Anders: Doolhof met levels.

Stap voor stap

Dit project heeft drie sprites, en elke sprite heeft zijn eigen codegebied. Boven elk script staat daarom altijd om welke sprite het gaat — klik die eerst aan, anders bouw je bij de verkeerde figuur. Vink een stap af als hij klaar is; je browser onthoudt dat.

1

Teken je twee peddels

Uiterlijk

Verwijder de kat. Ga rechtsonder met je muis over de sprite-knop en kies het penseeltje ("Teken"). Je komt in de teken-editor met een leeg kostuum. Kies de rechthoek-tool, zet hem op gevuld en teken een staande balk: smal en hoog, ongeveer zo groot als een lucifersdoosje op zijn kant. Belangrijk: teken hem midden op het kruisje in het canvas — dat kruisje is het middelpunt van je sprite.

Hernoem de sprite naar Speler. Klik daarna met de rechtermuisknop op de sprite-tegel en kies dupliceren: je krijgt een identieke tweede peddel. Hernoem die naar Computer en geef hem eventueel een andere kleur.

Waarom precies op het kruisje? Dat kruisje is het rotatiepunt van je sprite. Alle blokken met x en y rekenen vanaf dat punt. Teken je je balk ernaast, dan staat je peddel straks op een heel andere plek dan waar je "ga naar x: ... y: ..." belooft — en dan zoek je je suf.
Waarom dupliceren? Zo zijn je twee peddels gegarandeerd even groot. Een computer-peddel die stiekem 10 pixels langer is dan die van jou, maakt je spel oneerlijk zonder dat iemand begrijpt waarom.
  • Ik heb twee identieke peddels: Speler en Computer
2

Zet de peddels op hun plek

Beweging

Geef beide peddels een startscript. De speler staat links op x: -210, de computer rechts op x: 210, allebei op y: 0. Zet er ook meteen "zet draaistijl op niet draaien" bij, uit Beweging.

Sprite: Speler

als wordt aangeklikt
zet draaistijl op niet draaien
ga naar x: -210 y: 0

Sprite: Computer

als wordt aangeklikt
zet draaistijl op niet draaien
ga naar x: 210 y: 0
Waarom -210 en 210? Het speelveld loopt van x = -240 tot x = 240. Op -210 staat je peddel dicht bij de rand, maar er blijft nog een strookje over waar de bal voorbij kan schieten als je hem mist. Precies op -240 zou hij half buiten beeld hangen.
Waarom "niet draaien"? Straks bewegen deze peddels alleen op en neer, maar sommige Scratch-blokken (zoals "als op rand, keer om") draaien een sprite ongemerkt. Met deze draaistijl staat je peddel gegarandeerd altijd rechtop, wat er ook gebeurt.
  • Mijn peddels staan links en rechts, netjes op hun plek
3

Bestuur je peddel met omhoog en omlaag

Besturing

Klik de sprite Speler aan. Sleep een "herhaal voortdurend" onder je startblokken en zet er twee "als ... dan"-blokken in. In de zeshoekjes komt "toets ... ingedrukt?" uit Waarneming, in de mond "verander y met ..." uit Beweging.

Sprite: Speler

herhaal voortdurend
als toets pijltje omhoog ingedrukt? dan
verander y met 10
als toets pijltje omlaag ingedrukt? dan
verander y met -10
Waarom alleen y? Een pongpeddel mag alleen op en neer. Zou je ook x mogen veranderen, dan kon je gewoon naar de bal toe rijden en nooit meer missen. Door x nooit aan te raken blijft je peddel voor eeuwig op -210 hangen.
Waarom 10 en niet 4? In een doolhof wil je precisie, in pong wil je snelheid: de bal komt hard aan en je moet er nog net bij kunnen. 10 voelt sportief. Later mag je hiermee spelen — het is een van de knopjes waarmee je je spel eerlijk afstelt.
  • Mijn peddel schuift met de pijltjes op en neer
4

Hou je peddel binnen het veld

Operatoren

Probeer je peddel maar eens helemaal naar boven te duwen: hij verdwijnt half uit beeld. Voeg daarom twee extra als-blokken toe in dezelfde lus. In het zeshoekje komt de operator > (of <) uit Operatoren, met links het ronde blokje y-positie uit Beweging en rechts een getal.

Sprite: Speler — onderaan in dezelfde lus

als y-positie > 130 dan
ga naar x: -210 y: 130
als y-positie < -130 dan
ga naar x: -210 y: -130
Hoe werkt dit? Je laat je peddel gewoon te ver gaan, en daarna duw je hem terug op de grenswaarde. Dat gebeurt tientallen keren per seconde, dus je ziet het niet: het lijkt of je peddel netjes tegen een onzichtbare muur botst. Deze truc heet klemmen en je gebruikt hem in bijna elk spel dat je nog gaat maken.
Waarom 130 en niet 180? Het speelveld loopt tot y = 180, maar dat is het midden van je peddel. Je peddel is ongeveer 100 pixels hoog, dus de helft daarvan steekt eruit. Met 130 blijft hij helemaal zichtbaar. Is jouw peddel groter of kleiner? Pas het getal aan tot het klopt op je scherm.
  • Mijn peddel blijft altijd volledig in beeld

Testmoment — beweegt je peddel netjes?

controle

Klik op de groene vlag en hou de pijltjes ingedrukt. Je peddel schuift vloeiend op en neer en blijft volledig in beeld. Werkt het niet? Loop deze lijst af:

  • Klik eerst één keer op het speelveld voor je de pijltjes gebruikt, anders luistert je browser nog niet naar Scratch.
  • Beweegt hij maar één stapje? Dan zweeft "herhaal voortdurend" los, of staan de als-blokken eronder in plaats van erin.
  • Trilt je peddel aan de bovenkant heen en weer? Dan staat er in het klem-blok een ander x-getal dan -210, of je hebt "verander y" in plaats van "ga naar" gebruikt.
  • Verdwijnt hij nog steeds half uit beeld? Verlaag 130 naar 120 of 110 tot het klopt.
  • Gaat hij de verkeerde kant op? Verwissel de 10 en de -10.
  • Zet ook even y-positie aan met het vinkje in de blokkenlijst: dan zie je live welk getal er in zit terwijl je stuurt. Handig om de grenzen af te stellen.
  • Mijn peddel stuurt vlot en blijft binnen het veld
6

De bal: startpositie en een willekeurige richting

Beweging

Voeg de sprite Ball toe en hernoem hem naar Bal. Zet hem op 50 % zodat hij niet te log is. Geef hem een startscript dat hem in het midden zet en hem een willekeurige richting geeft: sleep het ronde blokje willekeurig getal tussen ... en ... uit Operatoren in het vakje van "wijs in richting ...".

Sprite: Bal

als wordt aangeklikt
maak grootte 50 %
ga naar x: 0 y: 0
wijs in richting willekeurig getal tussen 45 en 135
Waarom net 45 en 135? In Scratch is richting 90 = rechts, 0 = omhoog, 180 = omlaag en -90 = links. Tussen 45 en 135 wijst je bal dus altijd ergens naar rechts: soms schuin omhoog (45), soms recht vooruit (90), soms schuin omlaag (135). Zou je "tussen 1 en 360" nemen, dan vertrekt je bal soms bijna recht naar boven en kaatst hij eeuwig tussen plafond en vloer zonder ooit bij een peddel te komen.
Waarom willekeurig? Met een vaste richting is elke ronde identiek en heb je na drie keer een truc gevonden die altijd werkt. Een beetje toeval maakt het spel elke keer nieuw.
  • Mijn bal start in het midden en kijkt elke ronde anders
7

Laat de bal bewegen en kaatsen

Beweging

Sleep onder je startblokken een "herhaal voortdurend" met daarin twee blokken uit Beweging: "beweeg 8 stappen" en "als op rand, keer om". Meer heeft een kaatsende bal niet nodig.

Sprite: Bal

herhaal voortdurend
beweeg 8 stappen
als op rand, keer om
Wat doet "beweeg 8 stappen" eigenlijk? Het verplaatst je sprite 8 pixels in de richting waar hij naar kijkt. Je stuurt dus niet met x en y, maar met de richting. Dat is precies waarom je in stap 6 die richting hebt ingesteld — en waarom je hem straks gaat spiegelen als de bal een peddel raakt.
En "als op rand, keer om"? Dat blok kijkt of je sprite de rand van het speelveld raakt en draait hem dan netjes weg — de natuurkunde van een kaatsende bal, gratis in één blok. Handig voor boven en onder. Links en rechts wil je straks eigenlijk géén kaatsing maar een punt; daar komen we in stap 14 op terug.
  • Mijn bal schiet weg en kaatst tegen de randen

Testmoment — kaatst je bal fatsoenlijk?

controle

Klik een paar keer op de vlag en kijk toe. De bal vertrekt telkens anders, stuitert tegen boven- en onderrand en glijdt (voorlopig nog) dwars door je peddels heen. Klopt er iets niet?

  • De bal blijft stilstaan. "Beweeg 8 stappen" zit niet in de lus, of de lus zweeft los van het hoedblok.
  • De bal plakt trillend aan de rand. Klassiek: "als op rand, keer om" staat vóór "beweeg". Zet het eronder.
  • De bal gaat altijd exact dezelfde kant op. Het blokje "willekeurig getal" zit niet in het vakje van "wijs in richting", maar ligt er los naast.
  • De bal staat ondersteboven of draait raar. Voeg ook bij de Bal "zet draaistijl op niet draaien" toe bij de start.
  • Veel te snel om te volgen? Zet de 8 tijdelijk op 4 zodat je rustig kan testen. Op het einde zet je hem terug.
  • Mijn bal beweegt vloeiend en kaatst boven en onder
9

Terugkaatsen op je peddel — de simpele versie

Waarneming

Zet in de lus van de Bal, onder "als op rand, keer om", een nieuw "als ... dan" met in het zeshoekje "raakt Speler ?" uit Waarneming. In de mond zet je "draai rechtsom 180 graden" uit Beweging.

Sprite: Bal — in de lus

als raakt Speler ? dan
draai rechtsom 180 graden

Test het even. Het werkt — de bal keert om — maar het voelt saai: de bal gaat exact terug over het pad waarlangs hij kwam, alsof hij tegen een spiegel botst. En als hij schuin binnenkomt, vertrekt hij ook schuin terug in dezelfde hoek. Dat is niet hoe een bal tegen een muur kaatst. In de volgende stap doen we het juist.

Waarom eerst de foute versie bouwen? Omdat je dan zélf voelt wat er niet klopt. Een spel dat "werkt" is nog geen spel dat leuk is, en het verschil tussen die twee zit hem in details zoals deze. Programmeren is niet één keer goed typen, het is bijstellen tot het lekker aanvoelt.
  • De bal keert om als hij mijn peddel raakt
10

Echt kaatsen: spiegel de richting

Operatoren

Vervang "draai rechtsom 180 graden" door het blok hieronder: "wijs in richting (0 - richting)". Je hebt daarvoor het min-blokje uit Operatoren nodig, met links een 0 en rechts het ronde blokje richting uit Beweging. Zet er meteen ook een tweede "beweeg 8 stappen" onder.

Sprite: Bal — in de lus

als raakt Speler ? dan
wijs in richting 0 - richting
beweeg 8 stappen
Waarom werkt 0 min richting? Reken het na met de Scratch-richtingen. Komt de bal schuin omhoog naar rechts (richting 45), dan wordt hij -45: schuin omhoog naar links. Recht naar rechts (90) wordt -90, recht naar links. Schuin omlaag naar rechts (135) wordt -135, schuin omlaag naar links. In alle gevallen blijft de op-en-neer-beweging hetzelfde en draait alleen de links-rechts-beweging om — precies wat er gebeurt als een bal tegen een verticale muur kaatst.
En waarom die extra "beweeg 8 stappen"? Om de bal met één zet uit de peddel te duwen. Zonder dat blok kan de bal na het spiegelen nog steeds de peddel raken; dan spiegelt hij nóg een keer, en nog een keer... Je bal blijft dan trillend aan je peddel plakken. Dit heet vastlopen in een botsing, en één duwtje lost het op.
  • De bal kaatst nu schuin weg, precies zoals het hoort
11

Doe hetzelfde voor de computer-peddel

Waarneming

Klik met de rechtermuisknop op je nieuwe als-blok en kies dupliceren. Klik de kopie vast onder het origineel en zet in het dropdownlijstje van "raakt ...?" de sprite Computer. Klaar — beide peddels kaatsen nu.

Sprite: Bal — in de lus

als raakt Computer ? dan
wijs in richting 0 - richting
beweeg 8 stappen
Waarom niet één blok met "of"? Je zou kunnen schrijven "als (raakt Speler? of raakt Computer?) dan", en dat werkt hier prima. Toch houden we ze apart: straks wil je bij de ene peddel misschien een ander geluidje, of alleen bij jouw peddel een punt. Twee losse blokken laten die deur openstaan. Dupliceren kost je vijf seconden.
Tip: dupliceren is in Scratch de snelste manier om jezelf typfouten te besparen. Alles binnenin komt mee — je hoeft alleen het lijstje aan te passen.
  • Allebei de peddels kaatsen de bal terug

Testmoment — kaats de bal tien keer heen en weer

controle

De computer-peddel staat nog stil, dus zet hem eventjes zelf op de goede hoogte door hem met de muis te verslepen. Kaats de bal daarna tien keer heen en weer. Klopt er iets niet?

  • De bal blijft trillend aan de peddel plakken. De extra "beweeg 8 stappen" ontbreekt, of staat boven het "wijs in richting" in plaats van eronder.
  • De bal vliegt dwars door de peddel. Je bal is te snel: bij 8 stappen per beeldje kan hij over een dunne peddel heen springen. Maak je peddel breder in de teken-editor, of zet de snelheid tijdelijk op 5.
  • De bal kaatst terug maar gaat daarna raar zweven. Kijk of "zet draaistijl op niet draaien" bij de bal staat, en of hij ergens per ongeluk een tweede "draai"-blok heeft.
  • Er gebeurt niets bij de tweede peddel. In het dropdownlijstje staat waarschijnlijk nog "Speler" in plaats van "Computer".
  • De bal verdwijnt links of rechts uit beeld. Dat hoort nu nog: "als op rand, keer om" stuurt hem terug, maar er is nog geen puntentelling. Dat komt in stap 14 en 15.
  • Tien keer heen en weer zonder vastlopen of doorschieten
13

Twee scoreborden

Variabelen

Ga naar Variabelen en klik twee keer op Maak een variabele. Maak score speler en score computer, allebei voor alle sprites. Zet ze bij de start van de Bal op 0. Sleep de twee bordjes op je speelveld naar de goede kant: die van jou naar links, die van de computer naar rechts.

Sprite: Bal — bij de startinstellingen

als wordt aangeklikt
maak grootte 50 %
maak score speler 0
maak score computer 0
ga naar x: 0 y: 0
wijs in richting willekeurig getal tussen 45 en 135
Waarom bij de Bal en niet bij de peddels? Omdat de bal degene is die straks beslist wie er scoort. Een variabele "voor alle sprites" kan je vanuit élke sprite lezen en aanpassen, dus het maakt technisch niets uit waar je het startblok zet. Maar het is veel makkelijker terug te vinden als alles wat met de spelregels te maken heeft, bij één sprite staat.
Denk aan de klassieke fout: "maak score ... 0" hoort boven de lus, bij je startinstellingen. Zet je het erin, dan wordt je score bij elk beeldje weer op nul gezet en blijft je scorebord eeuwig op 0 staan.
  • Twee scoreborden staan op mijn speelveld en beginnen op 0
14

Een punt voor de computer — hoe merk je dat?

Operatoren

Mis jij de bal, dan schiet hij links voorbij je peddel. Maar hoe weet Scratch dat? Niet met "raakt ...?", want daar is niets om te raken. Je kijkt dus naar de plaats van de bal: is zijn x-positie kleiner dan -230, dan is hij voorbij je peddel en heeft de computer een punt.

Sleep uit Beweging het ronde blokje x-positie in de linkerkant van een <-operator, en typ rechts -230. Zet dat zeshoekje in een nieuw "als ... dan", onderaan in je lus.

Sprite: Bal — in de lus

als x-positie < -230 dan
verander score computer met 1
ga naar x: 0 y: 0
wijs in richting willekeurig getal tussen 45 en 135
wacht 0.5 seconden
Waarom -230 en niet -240? Je bal is rond en heeft een straal. Op x = -240 zit zijn middelpunt op de rand en is de helft al buiten beeld. Bovendien duwt "als op rand, keer om" hem daar meteen terug — dan zou je nooit voorbij die grens komen. Met -230 vuurt je controle af nog vóór het kaats-blok toeslaat.
Waarom die wacht-blokjes? Zonder pauze knalt de bal meteen na het punt weer weg en heb je geen idee wat er gebeurde. Een halve seconde adempauze maakt het spel leesbaar. Merk ook op dat je hier precies dezelfde drie blokken herhaalt als bij de start — een uitstekende kandidaat voor een eigen blok "nieuwe ronde", als je opdracht 7 al gedaan hebt.
  • Mis ik de bal, dan krijgt de computer een punt
15

En een punt voor jou

Variabelen

Dupliceer je vorige als-blok en pas drie dingen aan: de < wordt een >, de -230 wordt 230, en "score computer" wordt score speler. Nu scoor jij als de bal rechts voorbij de computer-peddel glipt.

Sprite: Bal — in de lus

als x-positie > 230 dan
verander score speler met 1
ga naar x: 0 y: 0
wijs in richting willekeurig getal tussen 45 en 135
wacht 0.5 seconden
Let op de richting van het teken. De open kant van < en > wijst altijd naar het grootste getal. "x-positie > 230" betekent dus: de x is groter dan 230, de bal zit rechts. Draai je de twee per ongeluk om, dan scoor je meteen bij de start een punt — want 0 is inderdaad kleiner dan 230.
Waarom start de bal hier weer naar rechts? Eerlijker zou zijn: naar de speler die net het punt kreeg. Dat is een prima uitdaging voor later — je hebt er een als/anders en een tweede bereik van willekeurige richtingen voor nodig.
  • Beide scoreborden lopen op de juiste momenten op

Testmoment — klopt de puntentelling?

controle

Speel even tegen een stilstaande computer. Laat de bal expres links voorbijgaan, en sla hem daarna expres voorbij de rechterkant. Elk van beide moet precies één punt opleveren.

  • Er springen meteen 3 of 4 punten bij. Je "wacht 0.5 seconden" ontbreekt, of de bal wordt niet naar het midden teruggezet. Zolang hij voorbij de grens blijft hangen, telt de lus elke beeldje opnieuw een punt.
  • De scores tellen niet. Kijk of je "verander score ... met 1" gebruikt en niet "maak score ... 1". "Verander" telt op, "maak" overschrijft.
  • Bij de start staat er meteen 1-0. Je hebt < en > verwisseld.
  • De bal komt nooit voorbij de grens. "Als op rand, keer om" grijpt te vroeg in. Zet -230 op -225 en 230 op 225, of controleer of je grens-als-blokken echt in de lus staan.
  • Het verkeerde bordje loopt op. Links is jóúw kant: gaat de bal daar voorbij, dan scoort de computer. Verwissel de twee dropdowns.
  • Elk gemist balletje geeft precies één punt aan de juiste kant
17

De computer leert spelen — je eerste AI

Waarneming

Nu het mooiste stuk. Klik de sprite Computer aan en geef hem een "herhaal voortdurend" met daarin één "als ... dan ... anders". De vraag die hij zichzelf steeds stelt: zit de bal boven mij of onder mij? Daarvoor gebruik je het blokje ... van ... uit Waarneming: kies daarin y-positie van Bal. Rechts van de > zet je het gewone ronde blokje y-positie uit Beweging — dat is de computer zijn eigen hoogte.

Sprite: Computer

als wordt aangeklikt
zet draaistijl op niet draaien
ga naar x: 210 y: 0
herhaal voortdurend
als y-positie van Bal > y-positie dan
verander y met 4
anders
verander y met -4
Dit is echt kunstmatige intelligentie — in het klein. Er zit geen enkel trucje in: de computer meet elke honderdste seconde waar de bal is, vergelijkt dat met waar hij zelf is, en beslist dan wat hij doet. Meten, vergelijken, beslissen, herhalen. Dat is precies wat een zelfrijdende auto of een schaakcomputer doet, alleen met duizenden metingen in plaats van één.
Waarom als/anders en geen twee losse als-blokken? De bal zit óf boven óf onder de peddel — nooit allebei. Precies daarvoor is als/anders gemaakt: één vraag, twee uitkomsten, altijd exact één ervan. Twee losse als-blokken zouden hier hetzelfde doen maar meer werk zijn.
  • De computer-peddel volgt de bal helemaal zelfstandig
18

Stel je tegenstander af — makkelijker of gemener

Variabelen

Speel drie punten. Te makkelijk? Te onmogelijk? Dat regel je met dat ene getal 4. Maak er een variabele van, dan kan je hem tijdens het spelen bijstellen: maak een variabele reactie, zet ze bij de start op 4 en vervang de twee getallen door het ronde blokje. Voor de "anders"-tak heb je 0 - reactie nodig, want dat is het negatieve getal.

Sprite: Computer — in de lus

maak reactie 4
als y-positie van Bal > y-positie dan
verander y met reactie
anders
verander y met 0 - reactie

Zet het bordje reactie op je speelveld en klik er met de rechtermuisknop op: kies schuifknop. Nu kan je tijdens het spelen live schuiven en meteen voelen wat er verandert.

Wat is een goede waarde? Onder de 3 is de computer sloom en win je altijd. Rond 4 à 5 is hij een eerlijke tegenstander. Zet je hem hoger dan jouw eigen 10, dan is hij letterlijk onverslaanbaar — hij haalt élke bal. Een goede tegenstander is er eentje die je net kan kloppen. Dat is geen technisch probleem meer maar spelontwerp, en je stelt het af door te spelen, niet door te rekenen.
Wil je het spannender? Laat de bal sneller worden naarmate het spel vordert. Maak een variabele balsnelheid, zet ze bij de start op 8, vervang de getallen in "beweeg 8 stappen" door het blokje, en doe er bij elke peddel-botsing 0.3 bij. Vergeet niet ze bij elke nieuwe ronde terug te zetten op 8, anders is de vijfde bal onspeelbaar.
  • Ik kan mijn tegenstander makkelijker of moeilijker zetten
19

Wie eerst aan 5 staat, wint

Gebeurtenissen

Een spel zonder einde is geen spel. Maak in Gebeurtenissen een nieuw signaal game over. Zet daarna in élk van je twee punt-blokken, vlak onder "verander score ... met 1", een als-blok dat controleert of die score op 5 staat — en zo ja: zend het signaal.

Sprite: Bal — na het optellen van een punt

verander score speler met 1
als score speler = 5 dan
zend signaal game over

Geef de Bal daarna een tweede hoedblok dat op dat signaal wacht en vertelt wie er gewonnen heeft:

Sprite: Bal — een apart script

wanneer ik signaal game over ontvang
als score speler = 5 dan
zeg Jij wint! gedurende 3 seconden
anders
zeg De computer wint! gedurende 3 seconden
stop alles
Waarom een signaal en niet meteen "stop alles"? Omdat "stop alles" álles onmiddellijk stilzet — ook het "zeg"-blok dat je nog wil laten zien. Met een signaal start je eerst een netjes afgewerkt eindscript, en pas als dát klaar is valt het doek. Bovendien kan je later gratis meer laten meeluisteren: een fanfare bij het speelveld, een vreugdedansje bij een peddel. Eén bericht, zoveel reacties als je wil.
Waarom staat "stop alles" buiten het als/anders? Omdat het in beide gevallen moet gebeuren. Zou je het twee keer binnenin zetten, dan werkt het ook — maar je schrijft dan hetzelfde blok dubbel. Alles wat altijd gebeurt, zet je ná de vork.
  • Bij 5 punten stopt het spel en zie ik wie gewonnen heeft

Eindtest — speel een hele wedstrijd uit

controle

Speel tot iemand 5 punten heeft, en klik daarna meteen opnieuw op de vlag voor een tweede wedstrijd. Alles moet weer helemaal van voren af aan beginnen. Controleer:

  • Beginnen beide scores in ronde twee echt op 0, staat de bal in het midden en staan de peddels op hun startplek? Zo niet: er ontbreekt een "maak ..."- of "ga naar ..."-blok bij de startinstellingen van die sprite.
  • Stopt het spel écht bij 5, of loopt het door tot 6 of 7? Dan staat je controle-als-blok in de verkeerde tak, of gebruik je > in plaats van =.
  • Zie je de eindboodschap volledig? Zo niet, dan staat "stop alles" per ongeluk vóór het "zeg"-blok.
  • Is de wedstrijd spannend? Als je 5-0 wint of 0-5 verliest, klopt de afstelling niet. Speel met reactie (de computer), met de 10 van je eigen peddel en met de balsnelheid tot een wedstrijd meestal eindigt op 5-3 of 5-4.
  • Klik op het volledige-scherm-knopje boven het speelveld en laat een klasgenoot tegen de computer spelen zonder uitleg. Begrijpt hij binnen tien seconden wat hij moet doen? Dan is je spel af.
  • Mijn opdracht 8 is af — een volledige, eerlijke pongwedstrijd

Het volledige script

Zo ziet je afgewerkte project eruit. Let goed op: het zijn vijf scripts, verdeeld over drie sprites. Vergelijk ze met wat er op jouw scherm staat.

Sprite: Speler

als wordt aangeklikt
zet draaistijl op niet draaien
ga naar x: -210 y: 0
herhaal voortdurend
als toets pijltje omhoog ingedrukt? dan
verander y met 10
als toets pijltje omlaag ingedrukt? dan
verander y met -10
als y-positie > 130 dan
ga naar x: -210 y: 130
als y-positie < -130 dan
ga naar x: -210 y: -130

Sprite: Computer

als wordt aangeklikt
zet draaistijl op niet draaien
ga naar x: 210 y: 0
maak reactie 4
herhaal voortdurend
als y-positie van Bal > y-positie dan
verander y met reactie
anders
verander y met 0 - reactie

Sprite: Bal — het hoofdscript

als wordt aangeklikt
maak grootte 50 %
zet draaistijl op niet draaien
maak score speler 0
maak score computer 0
ga naar x: 0 y: 0
wijs in richting willekeurig getal tussen 45 en 135
herhaal voortdurend
beweeg 8 stappen
als op rand, keer om
als raakt Speler ? dan
wijs in richting 0 - richting
beweeg 8 stappen
als raakt Computer ? dan
wijs in richting 0 - richting
beweeg 8 stappen
als x-positie < -230 dan
verander score computer met 1
als score computer = 5 dan
zend signaal game over
ga naar x: 0 y: 0
wijs in richting willekeurig getal tussen 45 en 135
wacht 0.5 seconden
als x-positie > 230 dan
verander score speler met 1
als score speler = 5 dan
zend signaal game over
ga naar x: 0 y: 0
wijs in richting willekeurig getal tussen 45 en 135
wacht 0.5 seconden

Sprite: Bal — het eindscherm

wanneer ik signaal game over ontvang
als score speler = 5 dan
zeg Jij wint! gedurende 3 seconden
anders
zeg De computer wint! gedurende 3 seconden
stop alles
De klassieke beginnersfout In bijna elk pongproject gaat het mis op één plek: de bal die aan de peddel blijft plakken. Je ziet hem trillen, sidderen en niet meer weggaan. De oorzaak is altijd dezelfde. Zolang de bal de peddel raakt, is "raakt Speler?" wáár — en je lus komt tientallen keren per seconde langs. De bal spiegelt dus zijn richting, spiegelt hem terug, spiegelt weer... en komt nooit los. De oplossing is dat ene extra "beweeg 8 stappen" ná het spiegelen: één duwtje dat de bal buiten de peddel zet, zodat de voorwaarde de volgende keer niet meer waar is. Precies dezelfde valkuil zit in je puntentelling: zonder de bal terug naar het midden te sturen blijft "x-positie < -230" waar, en telt de computer twintig punten in één seconde. Onthoud de regel: als een voorwaarde iets in gang zet, moet datgene ervoor zorgen dat de voorwaarde daarna niet meer waar is. Doe je dat niet, dan vuurt hij eindeloos opnieuw af.

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

Geluid en gevoel

makkelijk

Geef je spel een stem: een kort plopje bij elke peddel-botsing, een lagere toon bij de randen, en een fanfare bij het winnen. Tip: gebruik start geluid en niet "speel geluid af en wacht" — anders staat je bal telkens even stil. Extra: laat de bal bij elke botsing kort van kleur veranderen met "verander kleur effect met 25", en zet de effecten weer uit bij een nieuwe ronde.

B

Kaatsen met effect

middel

In het échte pong hangt de hoek af van wáár op de peddel je de bal raakt: bovenaan vliegt hij schuin omhoog, in het midden recht vooruit. Bouw dat na. Tip: bereken het verschil tussen de y-positie van de bal en die van de peddel, en tel dat verschil bij je nieuwe richting op. Je hebt er het min-blok én het plus-blok voor nodig, en veel geduld met uitproberen — de eerste versie schiet je bal gegarandeerd de verkeerde kant op.

C

Een computer die fouten maakt

pittig

Een perfecte tegenstander is saai. Maak er eentje die menselijk aanvoelt: laat hem alleen reageren als de bal naar hem toe komt (tip: kijk of de richting van de bal tussen 0 en 180 ligt), en bouw een kleine vertraging in met een willekeurig getal. Nóg mooier: laat hem gemener worden naarmate hij achterstaat, door reactie te verhogen wanneer jouw score stijgt. Zo blijft elke wedstrijd tot het laatste punt spannend.

Vorige opdracht 9 · Ruimte-shooter met klonen