Simon! Simon! Wat doen al die kleuren hier?
Oefening 6: Simon!
Al ooit gehoord van het spel ‘Simon’? Simon is een geheugenspel met 4 ‘knoppen’, elk in een andere kleur. De speler krijgt een reeks kleuren te zien, die hij/zij vervolgens in juist diezelfde volgorde moet aanduiden. De eerste reeks bestaat uit 1 kleur, de tweede uit 2 kleuren, etc.. Zolang je juist blijft antwoorden, worden de reeksen met kleuren steeds langer. Maak je een fout? Dan is het spel onverbiddelijk, GAME OVER!
Het eindresultaat
Project
Om je wat tijd te bespraren, hebben we in dit project weer vanalles voor jou klaargemaakt. Zorg ervoor dat volgende dingen allemaal mogelijk zijn:
- Het spel wordt ingeleid door Ruby en start
- Iedere ronde wordt er een nieuwe kleur aan de reeks kleuren toegevoegd
- De kleuren worden één voor één getoond aan de speler in de juiste volgorde
- De speler kan na het zien van de reeks kleuren, kleuren aanklikken
- De kleuren die de speler aanklikt worden geëvalueerd
- Indien de speler een fout maakt, stopt het spel
Stappenplan
Stap 1: Eerst even nadenken
Voor we beginnen met het maken van dit spel, moeten we dit spel eerst goed leren kennen. Om een spel beter te leren kennen kan je het spel zelf een aantal keer spelen, of kijk je erg aandachtig naar het filmpje. Dus doe dat eerst!
Na het filmpje te bekijken, proberen we te beschrijven wat er gebeurt:
- Ruby introduceert het spel.
- Alle kleuren lichten drie keer op.
- Ruby geeft het startsein.
- Een nieuwe kleur wordt getoond.
- De speler moet een kleur kiezen.
- Maakt de speler een fout, dan is het spel gedaan.
- Als de speler de juiste kleur kiest, gebeuren de volgende dingen:
- de speler krijgt een punt bij in de score
- er wordt een nieuwe kleur toegevoegd aan de reeks
- de speler is weer aan de beurt, en probeert alle kleuren van de reeks in de juiste volgorde aan te klikken.
- Dit blijft zich herhalen tot de speler een fout maakt.
Als we het spel hebben beschreven, moeten we nadenken hoe we dit zouden programmeren. Dit doen we door eerst wat vragen te stellen:
- Hoe zorgen we ervoor dat een kleur oplicht?
- Hoe zorgen we ervoor dat alle kleuren tegelijk oplichten?
- Hoe wordt de reeks van kleuren die de speler moet onthouden, onthouden door het programma?
- Hoe wordt een willekeurige kleur gekozen en toegevoegd aan de reeks van kleuren die het programma onthoudt?
- Hoe controleren we of de speler een fout heeft gemaakt?
- Hoe onthouden we de score van de speler?
Nu dat we een heleboel vragen hebben gesteld, gaan we stap voor stap het programma bouwen en deze vragen beantwoorden.
Stap 2: Introduceer het spel!
Zorg ervoor dat Ruby het spel introduceert. Dit kan heel erg simpel zijn zoals we dat ook in het filmpje doen.
Stap 3: Alles begint te branden
Alle kleuren moeten drie keer na elkaar oplichten. Maak gebruik van een signaal om alle kleursprites te laten weten dat ze moeten oplichten.
Hoe zorgen we dat een kleur oplicht? Nou, we kunnen gebruik maken van het transparant effect van een sprite om deze lichter of donkerder te maken. Maak dus in elke kleursprite een “licht op”-blokje en doe daarin het volgende:
- Zet het transparant effect op 0.
- Wacht eventjes. Bijvoorbeeld 1 seconde.
- Zet het transparant effect weer op 99. Zet dit niet op 100, want anders kan je niet meer op de sprite klikken!
Zo lijkt het lichtje dus aan en uit te gaan. Vergeet dus niet ervoor te zorgen dat wanneer je een signaal krijgt, het blokje oplicht.
Als je dit gedaan hebt kan je al eens testen of dit deel van de code werkt.
Stap 4: Het startsein
Zorg ervoor dat Ruby het startsein geeft voor het spel. Kijk zeker nog eens naar het filmpje hoe wij dit doen.
Stap 5: Een nieuwe kleur kiezen
In deze stap beantwoorden we de twee volgende vragen:
- Hoe wordt de reeks van kleuren die de speler moet onthouden, onthouden door het programma?
- Hoe wordt een willekeurige kleur gekozen en toegevoegd aan de reeks van kleuren die het programma onthoudt?
Je raad het waarschijnlijk al, de oplossing voor de eerste vraag is “lijsten”. We geven het programma een geheugen in de vorm van een lijst. Elke nieuwe kleur voegen we dan toe aan deze geheugenlijst. Maak dus een lijst geheugenlijst en zorg er natuurlijk voor dat bij de start van dit programma de lijst volledig leeg is.
Het antwoord op de tweede vraag is iets uitgebreider. Ook hier gaan we een lijst nodig hebben. Deze lijst gaat de vier kleuren onthouden. Maak dus een lijst kleurenlijst en vul deze lijst met de elementen “groen”, “rood”, “geel” en “blauw”. Deze lijst gaan we gebruiken om een willekeurige kleur uit te kiezen.
Nu we de twee lijsten hebben, kunnen we een nieuwe kleur kiezen en toevoegen aan het geheugen van het programma. Maak nu dus een “voeg kleur toe”-blokje waar je de volgende dingen in doet:
- Kies een willekeurige kleur uit de kleurenlijst en voeg die toe aan de geheugenlijst.
- Laat Ruby zeggen dat een nieuwe kleur is toegevoegd.
- Laat de kleuren oplichten in de volgorde zoals deze staan in de geheugenlijst. (zie volgende stap)
- Laat Ruby zeggen dat het nu aan ons is om de reeks te herhalen.
Stap 6: Toon de geheugenreeks
Natuurlijk moeten we de nieuwe geheugenreeks ook tonen aan de speler, zodat de speler het kan proberen te onthouden. Hier moeten we dus zorgen dat elke kleur vanaf de eerste positie in de geheugenlijst oplicht in die volgorde. Maak dus een “laat kleuren oplichten”-blokje en doe het volgende:
- Maak een variabele positie en start op de eerste positie van de lijst.
- Voor elke element in de lijst doe je het volgende:
- zend een signaal naar naar de juiste kleursprite
- verander de positie met 1
- en wacht 0.5 seconden.
Door onderstaande blokken in elkaar te plaatsen kan je ervoor zorgen dat de kleur van de sprite (bijvoorbeeld “rood”) het signaal wordt dat je kan ontvangen in de juiste sprite. Vergeet dus ook niet om in elke kleursprite het juiste signaal te ontvangen. De sprite rood ontvangt het signaal “rood”, de sprite geel ontvangt het signaal “geel”, enzovoort. Wanneer het signaal wordt ontvangen licht het blokje op.
broadcast [] and wait;
(item (positie) of [gekozen kleuren])
Stap 7: Herhaal de kleurenreeks
In deze stap maken we het deel waar de speler de geheugenreeks gaat proberen te herhalen door op de kleurensprites te klikken. Elke keer wanneer de speler op een kleurensprite klikt, licht deze sprite even op. Zorg er dus voor dat in elke kleursprite het volgende gebeurt:
- Wanneer op de sprite wordt geklikt, licht de sprite op en zend deze een signaal om aan Ruby te laten weten op welke kleur de speler heeft geklikt. Je kan voor de sprite rood dit signaal bijvoorbeeld de naam geven “rood geklikt”.
Natuurlijk is het voor Ruby dus erg belangrijk dat deze signalen worden ontvangen. Wanneer dit signaal wordt ontvangen moet er gecontroleert worden of deze kleur wel correct is in de juiste volgorde. Hiervoor maak je best een “kleur geklikt”-blokje met een parameter kleur.
define kleur geklikt (kleur);
In dit blokje testen we of de geklikte kleur overeenkomt met de kleur in de geheugenlijst. Hier is opnieuw de variabele positie erg belangrijk! Voordat het de beurt is aan de speler om op kleuren te klikken, moet de positie terug gelijk zijn aan 1. We starten namelijk altijd met het eerste element in de lijst. Zorg er dus voor dat op de juiste plaats in het programma de positie weer gelijk is aan 1.
Als de kleur gelijk is aan het element op de juiste positie in de geheugenlijst, dan veranderen we de positie met 1 en controleren nog even of de positie groter is dan de lengte van de geheugenlijst. Als dit zo is, betekent dat dat de speler het laatste element van de lijst heeft geraden. De score wordt dan met 1 verhoogt en een nieuwe kleur wordt toegevoegd aan de geheugenreeks.
TIP: Gerbuik daar dus weer het “voeg kleur toe”-blokje!
Als de kleur niet gelijk is aan het element op de juiste positie in de geheugenlijst, is het spel gedaan. Laat Ruby zeggen dat het spel over is en stop alles met het juiste blokje.
Evaluatie
Tijd om alles nog eens te testen om zeker te zijn dat alles goed werkt.
- Wordt het spel ingeleid door Ruby en start het?
- Wordt er iedere ronde een nieuwe kleur aan de reeks kleuren toegevoegd?
- Worden de kleuren één voor één getoond aan de speler in de juiste volgorde?
- Kan de speler na het zien van de reeks kleuren, kleuren aanklikken?
- Worden de kleuren die de speler aanklikt geëvalueerd?
- Stopt het spel wanneer de speler een fout maakt?
Oplossing
De oplossing vind je hier!
Simon zegt...HEEL GOED gedaan! Welke spellen zouden we nog kunnen maken?