Pak de Kaas
0 Wat gaan we leren
We gaan nog een projectje maken met Thonny (uit de vorige les) en bij dit project gaan we gebruik maken van de standaard Python library:
pgzero
Weet je nog hoe je een pacakge installeert in Thonny?
Yep, Tools - Manage Packages en dan pgzero zoeken en installeren.
1 Pak de Kaas – Les 1
In deze les gaan we met Python en Pygame Zero leren hoe je plaatjes (sprites) op het scherm kunt zetten.
Je leert hoe je het scherm wist, en hoe je sprites op een bepaalde positie tekent.
Wat gaan we doen?
We gaan een muis en een stuk kaas op het scherm laten verschijnen.
Hiervoor gebruiken we screen.blit()
in de draw()
-functie van Pygame Zero.
📦 Benodigdheden
- Thonny met Pygame Zero geïnstalleerd
- Een map
images/
met daarin twee bestanden:mouse.png
encheese.png
🔰 Startercode
# Spelgrootte
WIDTH = 800
HEIGHT = 600
def draw():
screen.clear()
screen.blit("mouse", (150, 150))
screen.blit("cheese", (50, 50))
ℹ️ Uitleg
WIDTH
enHEIGHT
bepalen hoe groot het venster isdraw()
is een speciale functie die automatisch wordt aangeroepen om het scherm te tekenenscreen.clear()
wist het scherm bij elke framescreen.blit("mouse", (150, 150))
tekent het plaatjemouse.png
op positie (150, 150)
🛠️ Opdracht
Pas de coördinaten van de muis en de kaas aan en kijk wat er gebeurt.
- Zet de muis linksonder in beeld
- Zet de kaas rechtsboven in beeld
Wat gebeurt er als je dezelfde positie voor beide gebruikt?
📤 Inleveren
Maak een screenshot van het venster waarin je zowel de muis als de kaas ziet, elk op een andere plek.
Geef in je inlevering ook de coördinaten die je gebruikt hebt.
2 Beweeg de muis
In deze les gaan we de muis laten bewegen met de pijltjestoetsen.
We doen dat door de positie van de muis aan te passen telkens als een toets wordt ingedrukt.
Wat gaan we doen?
We maken twee variabelen mouse_x
en mouse_y
om de positie van de muis bij te houden.
In de functie update()
passen we deze coördinaten aan als je een pijl indrukt.
🔰 Startercode
# Spelgrootte
WIDTH = 800
HEIGHT = 600
# Startpositie van de muis
mouse_x = 150
mouse_y = 150
def draw():
screen.clear()
screen.blit("mouse", (mouse_x, mouse_y))
screen.blit("cheese", (50, 50))
def update():
global mouse_x, mouse_y
if keyboard.left:
mouse_x -= 5
if keyboard.right:
mouse_x += 5
if keyboard.up:
mouse_y -= 5
if keyboard.down:
mouse_y += 5
ℹ️ Uitleg
mouse_x
enmouse_y
zijn variabelen die bijhouden waar de muis staatupdate()
wordt meerdere keren per seconde uitgevoerd- Met
keyboard.left
controleer je of de linkerpijl wordt ingedrukt - Bij elke toetsdruk wordt de positie een klein stukje aangepast
🛠️ Opdracht
- Voer de code uit en beweeg de muis met de pijltjestoetsen
- Pas de waarde
5
aan naar een groter of kleiner getal. Wat merk je? - Probeer ervoor te zorgen dat de muis niet buiten het scherm kan verdwijnen
💡 Extra uitdaging
Laat de muis niet verder bewegen als hij het scherm uit dreigt te gaan. Voeg hiervoor `if`-statements toe zoals:
if keyboard.left and mouse_x > 0:
mouse_x -= 5
📤 Inleveren
Maak een screenshot van je aangepaste code waarbij de muis niet uit het scherm kan bewegen.
Zet in tekst erbij welke toetsen je gebruikt om de muis te bewegen en wat je aangepast hebt.
3 Botsing met de kaas
In deze les gaan we kijken of de muis de kaas aanraakt.
Daarvoor gebruiken we een if
-statement en controleren we of de muis en de kaas elkaar overlappen.
Wat gaan we doen?
We maken een rechthoek rondom de muis en rondom de kaas, en gebruiken colliderect()
om te kijken of ze elkaar raken.
Als de muis de kaas raakt, tonen we een bericht in de console met print()
.
🔰 Startercode
# Spelgrootte
WIDTH = 800
HEIGHT = 600
# Startpositie van de muis en kaas
mouse_x = 150
mouse_y = 150
cheese_x = 50
cheese_y = 50
def draw():
screen.clear()
screen.blit("mouse", (mouse_x, mouse_y))
screen.blit("cheese", (cheese_x, cheese_y))
def update():
global mouse_x, mouse_y
if keyboard.left:
mouse_x -= 5
if keyboard.right:
mouse_x += 5
if keyboard.up:
mouse_y -= 5
if keyboard.down:
mouse_y += 5
# Botsing controleren
mouse_rect = Rect((mouse_x, mouse_y), (64, 64))
cheese_rect = Rect((cheese_x, cheese_y), (64, 64))
if mouse_rect.colliderect(cheese_rect):
print("Gevonden!")
ℹ️ Uitleg
- Een
Rect
is een rechthoek: (x, y, breedte, hoogte) colliderect()
geeftTrue
als twee rechthoeken elkaar raken- In dit voorbeeld zijn muis en kaas beide 64×64 pixels groot
- Als er een botsing is, toont Python het woord
Gevonden!
🛠️ Opdracht
- Probeer de muis met de pijltjestoetsen naar de kaas te bewegen
- Als je
Gevonden!
ziet in de console, werkt de botsing - Pas de grootte van de
Rect
aan als je plaatjes groter of kleiner zijn
💡 Extra uitdaging
Toon een boodschap op het scherm als de muis de kaas heeft gevonden:
gevonden = False
def update():
...
if mouse_rect.colliderect(cheese_rect):
gevonden = True
def draw():
...
if gevonden:
screen.draw.text("Gevonden!", (350, 10), fontsize=60, color="red")
📤 Inleveren
Maak een screenshot van je console waarin je ziet dat "Gevonden!" verschijnt als de muis de kaas aanraakt.
Leg in een zinnetje uit hoe botsingen worden gecontroleerd in jouw code.
4 Kaas verspringt
In deze les gaan we ervoor zorgen dat de kaas naar een nieuwe plek springt als de muis hem aanraakt.
We doen dat met de functie random.randint()
om een willekeurige positie te kiezen.
Wat gaan we doen?
We importeren de random
-bibliotheek en maken een functie die een nieuwe plek kiest voor de kaas.
Als er een botsing is, roepen we die functie aan en verplaatsen we de kaas.
🔰 Startercode
import random
WIDTH = 800
HEIGHT = 600
mouse_x = 150
mouse_y = 150
cheese_x = 50
cheese_y = 50
def nieuwe_kaas_plek():
x = random.randint(0, WIDTH - 64)
y = random.randint(0, HEIGHT - 64)
return x, y
def draw():
screen.clear()
screen.blit("mouse", (mouse_x, mouse_y))
screen.blit("cheese", (cheese_x, cheese_y))
def update():
global mouse_x, mouse_y, cheese_x, cheese_y
if keyboard.left:
mouse_x -= 5
if keyboard.right:
mouse_x += 5
if keyboard.up:
mouse_y -= 5
if keyboard.down:
mouse_y += 5
mouse_rect = Rect((mouse_x, mouse_y), (64, 64))
cheese_rect = Rect((cheese_x, cheese_y), (64, 64))
if mouse_rect.colliderect(cheese_rect):
cheese_x, cheese_y = nieuwe_kaas_plek()
ℹ️ Uitleg
import random
zorgt ervoor dat we willekeurige getallen kunnen gebruikenrandom.randint(a, b)
geeft een willekeurig getal tussena
enb
WIDTH - 64
zorgt ervoor dat het plaatje niet buiten beeld komt- Als de muis de kaas raakt, wordt
cheese_x
encheese_y
aangepast
🛠️ Opdracht
- Laat de muis de kaas aanraken en kijk of deze naar een nieuwe plek verspringt
- Probeer het een paar keer en kijk of het altijd binnen het scherm blijft
- Pas de afmetingen van de sprite aan als jouw plaatjes groter of kleiner zijn dan 64x64
💡 Extra uitdaging
Voeg een geluid toe dat afspeelt als de muis de kaas raakt:
if mouse_rect.colliderect(cheese_rect):
sounds.eat.play()
cheese_x, cheese_y = nieuwe_kaas_plek()
📁 Zet dan ook een bestand eat.wav
in de map sounds/
📤 Inleveren
Maak een screenshot van je werkende code waar de kaas verspringt.
Leg kort uit wat random.randint()
doet en waarom je WIDTH - 64
gebruikt.
5 Score bijhouden
In deze les gaan we een score bijhouden: elke keer als de muis de kaas raakt, telt de score één punt op.
Deze score tonen we ook op het scherm.
Wat gaan we doen?
We maken een variabele score
die begint op 0 en steeds verhoogd wordt bij een botsing.
In de draw()
-functie tekenen we de score linksboven in het scherm.
🔰 Startercode
import random
WIDTH = 800
HEIGHT = 600
mouse_x = 150
mouse_y = 150
cheese_x = 50
cheese_y = 50
score = 0
def nieuwe_kaas_plek():
x = random.randint(0, WIDTH - 64)
y = random.randint(0, HEIGHT - 64)
return x, y
def draw():
screen.clear()
screen.blit("mouse", (mouse_x, mouse_y))
screen.blit("cheese", (cheese_x, cheese_y))
screen.draw.text(f"Score: {score}", (10, 10), fontsize=40, color="black")
def update():
global mouse_x, mouse_y, cheese_x, cheese_y, score
if keyboard.left:
mouse_x -= 5
if keyboard.right:
mouse_x += 5
if keyboard.up:
mouse_y -= 5
if keyboard.down:
mouse_y += 5
mouse_rect = Rect((mouse_x, mouse_y), (64, 64))
cheese_rect = Rect((cheese_x, cheese_y), (64, 64))
if mouse_rect.colliderect(cheese_rect):
cheese_x, cheese_y = nieuwe_kaas_plek()
score += 1
ℹ️ Uitleg
score = 0
zet de score aan het begin op nul- Elke keer als de muis de kaas aanraakt, wordt de score verhoogd met
score += 1
screen.draw.text()
toont tekst op het scherm
🛠️ Opdracht
- Speel het spel een paar keer en kijk of de score steeds verder oploopt
- Pas de tekstkleur of positie aan van de score
- Maak de tekst groter of kleiner door
fontsize
aan te passen
💡 Extra uitdaging
Laat de kleur van de tekst veranderen bij een bepaalde score:
kleur = "black"
if score >= 5:
kleur = "red"
screen.draw.text(f"Score: {score}", (10, 10), fontsize=40, color=kleur)
📤 Inleveren
Maak een screenshot van het spel waarbij de score zichtbaar is (minimaal 3 punten).
Leg in een zinnetje uit wat score += 1
betekent.
6 Tijdslimiet
In deze les gaan we een tijdslimiet toevoegen. De speler heeft bijvoorbeeld 30 seconden om zoveel mogelijk kaas te pakken.
Aan het einde tonen we “Game Over” en stoppen we het spel.
Wat gaan we doen?
We maken een teller tijd_over
die elke seconde met 1 omlaag gaat. Als de tijd op is, stopt het spel.
We tonen de tijd linksboven in beeld naast de score.
🔰 Startercode
import random
WIDTH = 800
HEIGHT = 600
mouse_x = 150
mouse_y = 150
cheese_x = 50
cheese_y = 50
score = 0
tijd_over = 30
game_over = False
def nieuwe_kaas_plek():
x = random.randint(0, WIDTH - 64)
y = random.randint(0, HEIGHT - 64)
return x, y
def draw():
screen.clear()
screen.blit("mouse", (mouse_x, mouse_y))
screen.blit("cheese", (cheese_x, cheese_y))
screen.draw.text(f"Score: {score}", (10, 10), fontsize=40, color="black")
screen.draw.text(f"Tijd: {tijd_over}", (10, 50), fontsize=40, color="blue")
if game_over:
screen.draw.text("Game Over", center=(WIDTH//2, HEIGHT//2), fontsize=60, color="red")
def update():
global mouse_x, mouse_y, cheese_x, cheese_y, score
if game_over:
return
if keyboard.left:
mouse_x -= 5
if keyboard.right:
mouse_x += 5
if keyboard.up:
mouse_y -= 5
if keyboard.down:
mouse_y += 5
mouse_rect = Rect((mouse_x, mouse_y), (64, 64))
cheese_rect = Rect((cheese_x, cheese_y), (64, 64))
if mouse_rect.colliderect(cheese_rect):
cheese_x, cheese_y = nieuwe_kaas_plek()
score += 1
def verlaag_tijd():
global tijd_over, game_over
if tijd_over > 0:
tijd_over -= 1
if tijd_over == 0:
game_over = True
clock.schedule_interval(verlaag_tijd, 1.0)
ℹ️ Uitleg
tijd_over
begint op 30 (seconden)clock.schedule_interval(verlaag_tijd, 1.0)
zorgt ervoor dat elke seconde de functieverlaag_tijd()
wordt aangeroepen- Als
tijd_over
op 0 staat, verandertgame_over
inTrue
en stopt het spel - In de
draw()
-functie tonen we de resterende tijd en, als het spel voorbij is, de tekst “Game Over”
🛠️ Opdracht
- Laat het spel lopen en probeer zoveel mogelijk punten te halen binnen de tijd
- Pas de tijd aan naar 10 of 60 seconden – wat vind je leuker?
- Laat bij “Game Over” ook de eindscore groter in beeld zien
💡 Extra uitdaging
Voeg een herstart-mogelijkheid toe met de R
-toets:
def on_key_down(key):
global score, tijd_over, game_over, mouse_x, mouse_y, cheese_x, cheese_y
if key == keys.R:
score = 0
tijd_over = 30
game_over = False
mouse_x, mouse_y = 150, 150
cheese_x, cheese_y = nieuwe_kaas_plek()
📤 Inleveren
Maak een screenshot van het spel als de tijd op is en je “Game Over” ziet.
Schrijf erbij welke score jij had gehaald en hoeveel seconden je gebruikte.
7 Reflectie en eindopdracht
In deze les kijk je terug op wat je hebt gemaakt, én krijg je de kans om je spel op een leuke manier uit te breiden of aan te passen.
🧠 Reflectie
Beantwoord de onderstaande vragen eerlijk en in je eigen woorden. Je mag dat in een apart document doen of onderaan je codebestand zetten als commentaar.
- Wat vond je het leukste om te doen?
- Wat vond je moeilijk of lastig om te begrijpen?
- Welke onderdelen van Python begrijp je nu beter?
- Waar ben je trots op?
🎮 Eindopdracht
Kies één (of meerdere) van de volgende uitbreidingen en voeg die toe aan je spel:
- 🧀 Zet meerdere stukjes kaas tegelijk op het scherm (gebruik een
for
-loop) - 💣 Voeg een “giftige” kaas toe: als je die pakt, verlies je punten
- 🔊 Voeg geluiden toe voor eten, botsing of game over
- 🎨 Verander het uiterlijk van de muis of de achtergrond
- 🕒 Laat het spel moeilijker worden naarmate de tijd verstrijkt (bijv. snellere muis of bewegende kaas)
💡 Bedenk zelf ook een uitbreiding? Schrijf het plan op en probeer het te maken!
📤 Inleveren
Lever één van de volgende dingen in:
- Een werkend Python-bestand waarin jouw uitbreiding is verwerkt
- Een kort filmpje of animatie waarin je jouw spel laat zien
- Een screenshot van je spel mét uitleg in tekst wat je hebt gedaan
Tot slot: lever ook je reflectie in met de antwoorden op de vragen hierboven.