Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Quiz
Doel: de leerlingen schrijven een quizprogramma in Python waarbij ze spreekwoorden op de juiste manier
moeten afmaken. Een goed antwoord levert punten op.
Beginsituatie: De leerlingen kennen de basisbeginselen van programmeren in Python (introductieles), het
werken met lijsten (zinnengenerator, alfabetische volgorde), het omgaan met input (alfabetisch ordenen),
het werken met randomness (zinnengenerator) en lussen (alfabetische volgorde). De leerlingen hebben
ervaring met de programmeerconcepten strings, lijsten, input, randomness, lussen, voorwaarden en
variabelen (in Scratch).
Materiaal: een laptop/pc per leerling of duo
Werkvorm: Als aan de voorwaarden voor de beginsituatie voldaan is, kunnen de leerlingen deze les
zelfstandig maken. De leerlingen werken bij voorkeur in tweetallen.
Start – kern – slot De leerlingen kunnen zelfstandig met deze les aan de slag, een klassikale introductie of afsluiting is
facultatief. De leerlingen werken met de lesbrief. De leerkracht loopt rond om vragen te beantwoorden
en hulp te bieden waar nodig. Een aantal opdrachten in deze les wordt in tweetallen gemaakt.
Naar eigen inzicht kunnen delen van de les klassikaal gedaan worden.
Quiztime! Wat is de hoofdstad van Spanje?
Hoeveel poten heeft een spin?
Wie heeft de gloeilamp uitgevonden?
Weet je het antwoord op deze vragen? Dan ben je vast ook goed in quizzen. Maar, ben je ook goed in het
maken van quizzen voor iemand anders? Na deze les wel. Je gaat namelijk een quiz maken in Python die
door anderen gespeeld kan worden. Wie haalt de hoogste score op jouw quiz?
Je maakt een quiz over tegenstellingen, maar als je weet hoe dat moet, kun je daarna net zo makkelijk
quizzen maken over elk onderwerp dat je wil! Laten we beginnen.
We gebruiken hiervoor dingen die je al weet over programmeren in Scratch, maar het uiteindelijke
programma schrijven we in Python. We gebruiken ook dingen die je in de vorige lessen al geleerd hebt
over programmeren in Python.
De basis Wat zijn de belangrijkste onderdelen van een quiz? Natuurlijk de vragen en de antwoorden! Dus die ga je
eerst bedenken. De quiz die je gaat maken, gaat over tegenstellingen, zoals warm-koud. Schrijf hieronder
vijf tegenstellingen op.
Nu gaan we de tegenstellingen in ons programma zetten. Maak daarvoor een nieuw bestand aan op
repl.it en noem dat bestand ‘quiz’.
? De computer is niet zo slim als jij, je moet hem nog vertellen welke woorden bij elkaar horen. Hoe zou
je dat kunnen doen, denk je?
Misschien heb je in Scratch wel eens een quiz gemaakt.1 Dan heb je waarschijnlijk twee lijsten gemaakt,
een met alle vragen en een met alle antwoorden. Je hebt er dan waarschijnlijk voor gezorgd dat de vraag
en het antwoord die bij elkaar horen op dezelfde plaats in de lijst stonden; de eerste vraag hoorde bij het
eerste antwoord, de tweede vraag bij het tweede antwoord, enzovoort. Dat zag er dan ongeveer zo uit:
Je kunt je programma
dan laten controleren
of de vraag en het
antwoord op
dezelfde plaats staan
in de lijst en als dat
zo is, dan krijg je
punten anders niet,
of ben je af.
In Python zoud je dat ook zo kunnen doen. Je weet tenslotte al hoe je lijsten moet maken en hoe je
daarmee moet werken. Je moet alleen wel heel erg goed opletten dat je vraag en je antwoord op dezelfde
plaats staan, ieder in hun eigen lijst. In Python kunnen we dit op een andere manier oplossen: We kunnen
een lijst maken van… lijsten!
We maken van elk vraag-antwoord-paar een lijst, en van die lijsten met vraag-antwoord-paren maken we
dan één lange lijst waarin alle vraag-antwoord-paren staan. Snap je het nog? Geen nood, we doen het
samen, stap voor stap!
De voorbereidingen
Stap 1: alles op een rijtje Maak eerst eens een lijst waarin je jouw tegenstellingen zet, elk woord is een apart item in deze lijst, en
noem deze lijst ‘tegenstellingen’. Eerst het ene woord, daarna het tegengestelde, dan het volgende woord
en daarna hiervan het tegengestelde en zo door. Hoe ziet jouw lijst eruit?
! Heb je eraan gedacht dat je elk woord tussen aanhalingstekens moet zetten?
1 Bijvoorbeeld in de MOOC Scratch: programmeren voor kinderen op https://courses.edx.org/courses/course-v1:DelftX+ScratchX+2T2016/course/
Het is niet erg als dit wat snel gaat voor de leerlingen, dat is met
opzet. In het vervolg van de les wordt alles stap voor stap duidelijk.
In zowel de les over de zinnengenerator als
de les over alfabetische volgorde hebben de
leerlingen al met lijsten gewerkt. Dit zou dus
niet moeilijk voor ze moeten zijn. Verwijs
anders naar deze voorgaande lessen.
Probeer nu eens de woorden uit je lijst op je scherm te printen. Weet je nog hoe dat moet? In de les over
de zinnengenerator heb je dat ook al gedaan.
Het is ook heel gemakkelijk om een woord en zijn tegengestelde toe te voegen aan deze lijst. Bedenk nog
twee tegenstellingen en voeg deze toe aan je lijst. Als je niet meer weet hoe dat ging, kun je kijken bij de
les over de zinnengenerator.
Stap 2: paren maken Wij weten nu dat woorden die naast elkaar staan elkaars tegengestelde zijn. Tenminste, het eerste en het
tweede woord uit de lijst ‘tegenstellingen’ zijn elkaars tegengestelde, maar het tweede en het derde
woord zijn dat niet. En als we een woord en zijn tegengestelde uit de lijst willen halen, moeten we heel
erg voorzichtig zijn dat we wel een setje weggooien en niet per ongeluk het verkeerde woord. Daarom is
het handig om ervoor te zorgen dat woorden die bij elkaar horen, ook in het programma bij elkaar horen.
We gaan nu van elk setje van woorden die bij elkaar horen een lijst maken. Je krijgt dan een heleboel
lijsten van twee woorden.
Schrijf hieronder jouw tegenstellingen op en maak er lijstjes van twee van.
Nu ga je van al die lijstjes van twee één grote lijst maken. Dit doe je zo:
tegenstellingen = [ [‘hard’, ‘zacht’], [‘dik’, ‘dun’] ]
! Om iedere lijst van twee woorden staan rechte haken, zodat Python weet dat het een lijst is. Om de
grote lijst van lijsten staan ook rechte haken, zodat Python weet dat dit een lijst is, een lijst met daarin als
items allemaal lijstjes!
Stap 3: wat zit waar Probeer de volgende stukjes code nu eens uit met jouw programma en beschrijf wat ze doen:
print(tegenstellingen[0])
print(tegenstellingen[1])
Het is belangrijk dat de leerlingen
zien hoe een lijst van lijsten eruit
ziet. Dat items van een lijst van alles
kunnen zijn, dus ook een lijst. Dit is
een lastig concept, het is goed om
hier even (klassikaal / aan het eind
van de les) bij stil te staan.
print(tegenstellingen[0][0])
print(tegenstellingen[0][1])
Het eerste getal tussen de rechte haken geeft je het item dat op die plaats staat in de grote lijst. En dat
item is steeds een lijst van twee woorden. Omdat de items uit de grote lijst zelf ook lijsten zijn, kun je daar
ook weer de items uithalen en dat doe je met het tweede getal tussen de rechte haken. Zo kijkt
print(tegenstellingen[0][0]) dus naar het eerste item van de grote lijst (in het voorbeeld
[‘hard’, ‘zacht’]) en geeft van dat item, die lijst, weer het eerste item (in het voorbeeld ‘hard’).
Vraag… We hebben nu alle onderdelen die we nodig hebben en kunnen die oproepen wanneer we willen. Nu
gaan we hiermee een quiz maken om je kennis van de tegenstellingen te testen (of die van je
klasgenoten).
De quiz begint met aan de deelnemer te vragen wat het tegengestelde is van een woord. Hiervoor
moeten we aan die deelnemer vragen om iets in te typen en dat antwoord moeten we onthouden om
later te vergelijken met het goede antwoord.
Misschien weet je nog hoe in Scratch vraagt aan de gebruiker om iets in te voeren. Inderdaad, met
.
Er verschijnt dan een invoervak bij de Sprite en wat je daar in typt, wordt opgeslagen in .
Er staan nu twee getallen tussen
rechte haken, om toegang te
kunnen krijgen tot de items in de
ingebedde lijsten. Dit is een lastig
concept, het is goed om hier even
(klassikaal / aan het eind van de
les) bij stil te staan.
In Python kunnen we iets vergelijkbaars doen. Alleen moet je in Python zelf aangeven waar je het
antwoord wil opslaan, er is geen vooraf gemaakte ‘antwoord’-variabele. In Python neem je de volgende
stappen:
• Bedenk wat je aan de lezer wil vragen, bijvoorbeeld ‘Wat is je keuze?’
• Kies een naam voor de variabele waar je het antwoord in wil opslaan, bijvoorbeeld keuze.
Je code in Python ziet er dan als volgt uit:
keuze = input(‘Wat is je keuze?’)
dit is wat je aan de lezer vraagt
dit betekent dat je aan de lezer vraagt om iets in te voeren
samen doet dit hetzelfde als het vraag-blok in Scratch
In deze variabele wordt het antwoord van de lezer opgeslagen.
Je gaat nu oefenen met vraag en antwoord (input), maak hiervoor een apart bestand aan in repl.it, zodat
je niet per ongeluk aan je quiz dingen verandert. Noem dit bestand ‘oefenen’.
Probeer eens hoe het werkt door de volgende code te typen en uit te voeren in repl.it
keuze = input(‘Wat is je keuze?’)
Wat gebeurt er?
Je kunt nu iets typen in het venster rechts en dat wordt opgeslagen in de variabele keuze. Door
print(keuze) aan je code toe te voegen, kun je dit controleren.
Doordat je in Python het antwoord van de lezer in een zelfgekozen variabele opslaat, kun je ook makkelijk
meerdere antwoorden opslaan en onthouden, zonder dat de eerdere antwoorden vergeten worden, zoals
in het voorbeeld hieronder.
keuze_kleur = input('Wat is je lievelingskleur?') keuze_dier = input('Wat is je lievelingsdier?') keuze_getal = input('Wat is je lievelingsgetal?') print('Je lievelingskleur is', keuze_kleur) print('Je lievelingsdier is', keuze_dier) print('Je lievelingsgetal is', keuze_getal) Probeer nu zelf ook eens meerdere dingen aan de gebruiker te vragen en in verschillende variabelen op te slaan.
Nu wordt het extra mooi: je kunt een item uit je lijst gebruiken in je vraag aan de gebruiker. Ga weer naar
je code van de quiz en probeer het volgende stukje code eens uit:
antwoord = input('Wat is het tegengestelde van ' + tegenstellingen[0][0] +'?')
print(antwoord)
Probeer ook eens of je naar de andere tegenstellingen kunt vragen.
… en antwoord! Het is heel mooi dat de quizdeelnemer nu zijn antwoord in kan typen en dat we dat antwoord ook kunnen
printen, maar dat is nog geen quiz natuurlijk. We moeten nog wel controleren of dat antwoord ook goed
is!
! Het tegengestelde van tegenstellingen[0][0] zit natuurlijk in tegenstellingen[0][1],
het tegengestelde van tegenstellingen[1][0] zit in tegenstellingen[1][1] enzovoort.
We moeten nu dus het antwoord dat de gebruiker heeft gegeven vergelijken met het goede antwoord.
Als deze antwoorden hetzelfde zijn, dan heeft de deelnemer het goed, anders niet.
Als we in Scratch zouden programmeren, zouden we een speciaal blok gebruiken voor deze keuze, weet jij
welk? ____________________________________________________
Inderdaad, je gebruikt dit blok , daarmee kun je programmeren dat als iets het geval is, dan
moet er iets speciaals gebeuren. Dit kunnen we gebruiken om het juiste pad van het algoritme te volgen,
afhankelijk van de keuze van de gebruiker. Het Engelse als-dan-blok in Scratch ziet er zo uit: .
If is Engels voor als en then is Engels voor dan. In Python gebruik je ook deze Engelse woorden.
Een voorbeeld:
Deze code betekent: als (de variabele) antwoord gelijk
is aan 1, dan zegt de sprite ‘Goed!’
In Python ziet dat er dan zo uit:
if antwoord == 1: print('Goed!') Kijk eens goed naar dit stukje code, wat valt je op?
Eigenlijk gebeurt er hetzelfde als in het stukje Scratch-code, er zijn twee regels. Op de eerste regel staat wat waar moet zijn en op de tweede regel wat er dan gebeurt. Ook de volgorde op de eerste regel is hetzelfde. Eerst staat er if (Engels voor als), dan wat waar moet zijn dan een dubbele punt. Die dubbele punt staat in de plaats van het woordje dan (of het Engelse then). Het was je vast al opgevallen dat er == staat in Python en maar één = in Scratch. Dat is zo, om te zorgen dat je niet in de war raakt. In Python gebruik je één = als iets in een variabele of een lijst wil stoppen en == wanneer je wil controleren of twee dingen gelijk zijn aan elkaar. De tweede regel staat een stukje naar rechts, dit noemen we inspringen. In Scratch zit het als-dan-blok om het zeg-blok heen om te laten zien dat het zeg-blok bij het als-dan-blok hoort. Daardoor staat het zeg-blok ook een beetje naar rechts. Het mag alleen uitgevoerd worden als de voorwaarde waar is. In Python laat je zien dat een stukje code op deze manier bij een ander stukje code hoort door het te laten inspringen. Maak nu de volgende Scratch-voorbeelden na in Python. (gebruik hiervoor ook weer even je oefen- bestand in repl.it, zodat je niet per ongeluk iets aan je quiz verandert)
In het
woorden-
boek zie je
meer ma-
nieren om
voorwaar-
den te
contro-
leren.
Het kan de leerlingen helpen om
klassikaal aandacht te besteden
aan de overeenkomsten tussen
de code in Scratch en in Python.
Daardoor wordt duidelijker wat
elk stukje van de code voor
functie heeft.
Natuurlijk mag je ook zelf voorbeelden verzinnen. Bedenk nu eens hoe je het antwoord van de quizdeelnemer (dat opgeslagen zit in de variabele
‘antwoord’) kunt vergelijken met het goede antwoord en print ‘Goed zo!’ als het antwoord goed is en
‘Jammer, volgende keer beter’ als het antwoord fout is.
Waarschijnlijk
ziet je
programma er
ongeveer zo uit.
Vragen door elkaar Je programma vraagt nu naar het tegengestelde van een bepaald woord. Dat is niet echt een spannende
quiz… Laten we ervoor zorgen dat je programma steeds zelf een nieuw woord kiest waarvan de speler het
tegengestelde moet geven. Je hebt al eerder een stukje code geschreven waarbij je programma een
willekeurig item uit een lijst kiest, weet je nog? Dat was in de les waarin je een zinnengenerator hebt
gebouwd die van een lijst onderwerpen en een lijst persoonsvormen steeds nieuwe zinnen maakt.
Hiervoor gebruikte je de regel from random import randint om de functie randint() in je
programma te gebruiken. randint() doet hetzelfde als het Scratch-blok .
Probeer eens uit hoe je de functie randint() kunt gebruiken om je programma steeds een nieuwe
willekeurige vraag te laten stellen. Overleg met je maatje.
! Let op dat je willekeurig een paar uit de lijst tegenstellingen kiest en dat het programma dit paar moet
gebruiken om de vraag te stellen én om het antwoord te controleren. Per beurt gebruik je dus maar één
keer de functie randint().
Extra: een andere manier van willekeurig kiezen Wanneer je aan het begin van je programma de regel
from random import *
typt in plaats van
from random import randint,
kun je ook andere functies gebruiken die in de module random zitten, zoals choice(). De functie choice
kiest een willekeurig item uit een lijst. Het handige hiervan is dat het niet uitmaakt hoe lang die lijst is, dit
hoef je dus ook niet aan te geven. Wanneer je choice(tegenstellingen) gebruikt, kiest je
programma willekeurig een item uit de lijst tegenstellingen.
Pas je programma zo aan dat je choice() gebruikt om een willekeurig paar uit je lijst tegenstellingen te
kiezen. Probeer je programma uit om te kijken wat er gebeurt.
Van één vraag naar een quiz We willen de speler natuurlijk meer dan één vraag laten beantwoorden. We gebruiken hiervoor een
‘while’-lus zoals je dat ook hebt gedaan bij de les over alfabetische volgorde. Als voorbeeld kiezen we
ervoor om de speler tien beurten te geven.
Om bij te houden hoeveel beurten de speler heeft gehad, maken we een variabele ‘beurten’. Die
variabele begint met de waarde 1, want de speler begint met beurt 1. Schrijf hiervoor aan het begin van
je programma, net voor of na je lijst met lijsten van tegenstellingen beurten = 1
Aan het eind van iedere beurt, verhogen we de waarde van deze variabele met 1:
beurten = beurten + 1
Je kunt nu de while-lus zo lang laten lopen als je van tevoren bepaalt. while beurten < 11: zorgt er
bijvoorbeeld voor dat het programma stopt na 10 beurten.
Waarom is dat zo?
Pas je programma nu aan zodat de speler 10 beurten heeft. Overleg met je maatje welke delen van je
programma in de while-lus moeten en welke juist niet. Probeer je programma steeds uit om te kijken wat
er gebeurt.
Ben ik goed? Kun je een variabele score maken die bijhoudt hoe vaak iemand het goede antwoord heeft gegeven? Of
die voor ieder goed antwoord twee punten geeft en voor ieder fout antwoord er weer een punt aftrekt?
Of bedenk een ander systeem van punten geven.
De leerlingen moeten hier zelf bepalen welke code er in de
while-lus moet. Dat kan best lastig zijn. Je kunt hier samen
met de leerlingen over nadenken. Laat de leerlingen
uitproberen wat er gebeurt wanneer bepaalde onderdelen
van het programma juist wel en juist niet in de lus staan.
EXTRA-EXTRA-EXTRA-EXTRA- EXTRA- EXTRA- EXTRA- EXTRA- EXTRA- EXTRA- EXTRA- EXTRA- EXTRA- EXTRA- EXT
De keuze is reuze Je kunt nu een quiz maken over ieder onderwerp dat je zou willen. Maak er een voor aardrijkskunde, voor
de tafels, voor Engelse woordjes…
Hoeveel rondes? Kun je je programma zo maken dat de speler zelf kan bepalen hoe lang hij speelt? Door van tevoren aan te
geven hoeveel rondes hij wil spelen bijvoorbeeld. Of door aan het eind van iedere ronde aan te geven of
hij nog verder wil spelen.
Of misschien stopt jouw quiz wel als de speler een fout heeft gemaakt.
Of misschien verwijdert je programma een paar van tegenstellingen uit de lijst als de speler goed heeft
geantwoord en stopt je programma als er geen tegenstellingen meer over zijn om aan de speler te vragen.
Hier kun je zelf een puntensysteem bij bedenken.
Plezier voor twee. Of drie. Of vier… Kun je je quiz zo aanpassen dat er meerdere spelers kunnen spelen, ieder met een eigen score?
Woordenboek
Scratch Nederlands Scratch Engels Python Wat doet deze code?
if antwoord == 1: print(‘Goed!’)
Als het antwoord gelijk is aan 1, print het programma ‘Goed!’.
if antwoord == 1: print(‘Goed!’) else: print(‘Helaas, dat is fout.’)
Als het antwoord gelijk is aan 1, print het programma ‘Goed!’ en anders print het programma ‘Helaas, dat is fout.’.