Subsecties van Extra uitdagingen
Snake
Notitie
Vereist: sessie 5 afgerond.
De slang beweegt vanzelf. Jij stuurt met de pijltjestoetsen. Eet een stuk fruit: de slang groeit één vakje. Raak de muur of jezelf: game over.
Opstarten
Download de startcode en pak de ZIP uit. Open main.py in Thonny en klik Run. Je ziet een leeg raster. De besturing en de tijdmeting staan al klaar. Jij vult de functies nieuw_fruit(), zet_stap() en teken() in.
Hoe werkt het?
Snake speelt op een rooster. De slang is een lijst van (kolom, rij) coördinaten. Elke stap voeg je een nieuw hoofd toe aan de voorkant van de lijst en verwijder je het laatste element. Eet de slang fruit, dan laat je het laatste element staan, waardoor de slang groeit.
TILE = 20 # grootte van één vakje in pixels
COLS = WIDTH // TILE
ROWS = HEIGHT // TILE
slang = [(10, 10), (9, 10), (8, 10)] # lijst van (kolom, rij)
dx, dy = 1, 0 # richting: 1 stap naar rechts
Afbeeldingen laden en schalen
De fruitplaatjes zijn 64×64 pixels. Dat is te groot voor één vakje van 20×20. Je laadt ze met pygame.image.load() en schaalt ze daarna met pygame.transform.scale(). Dit staat al klaar in de startcode.
surf = pygame.image.load('images/apple.png').convert_alpha()
fruit_images['apple'] = pygame.transform.scale(surf, (TILE, TILE))
convert_alpha() zorgt dat de transparantie van het plaatje goed werkt. pygame.transform.scale() geeft een nieuwe Surface terug op het gevraagde formaat. Het origineel blijft ongewijzigd.
Om een geschaald plaatje op het scherm te zetten, gebruik je screen.blit():
screen.blit(fruit_surf, (fruit_pos[0] * TILE, fruit_pos[1] * TILE))
✅ Basic
- Vul
nieuw_fruit() in: kies een willekeurig fruit, zoek een vrij vakje en sla de positie en Surface op. - Vul
zet_stap() in: bereken het nieuwe hoofd, voeg het toe aan de voorkant van de lijst, verwijder het laatste element. - Vul
teken() in: teken het raster (pygame.draw.line), het fruit (screen.blit), en elke slangbol (pygame.draw.circle). Toon de score met font.render() en screen.blit(). - Spawn fruit als de slang het eet: laat
slang.pop() weg en roep nieuw_fruit() aan.
⭐ Stretch
- Game over als het hoofd buiten het raster valt.
- Game over als het hoofd een eigen segment raakt (
nieuw_hoofd in slang[1:]). - Toon een game-over scherm met de score. Druk op R om opnieuw te starten.
🔥 Expert
- Verhoog de snelheid naarmate de score stijgt: verlaag
STAP_MS op basis van de score (max(60, BASISINTERVAL - score * 10)). - Sla de hoogste score op en toon hem naast de huidige score, ook na een herstart.
- Zorg dat fruit nooit spawnt op een vakje dat de slang al bezet.
Downloads
- Startcode:
main.py met de besturing en tijdmeting klaar; jij vult de functies in. - Fruitafbeeldingen: als je zonder startcode begint (al inbegrepen in de startcode-ZIP).
Fruit: Kenney Food Kit, CC0 (publiek domein). kenney.nl
Space Invaders
Notitie
Vereist: sessie 7 afgerond.
Aliens staan in een 4×9 formatie. Ze bewegen heen en weer, zakken omlaag bij elke rand en schieten willekeurig terug. Jij hebt één schip en drie levens. Schiet ze allemaal neer voordat ze landen.
Opstarten
Download de startcode en pak de ZIP uit. Open main.py in Thonny en klik Run. Je ziet het schip en de alien-formatie. De besturing en de afbeeldingen staan al klaar. Jij vult de beweging, het schieten en de botsingen in.
Hoe werkt het?
Alle aliens zijn pygame.Rect-objecten in één lijst. Elk frame beweeg je ze allemaal met hetzelfde aantal pixels. Raakt de formatie een rand, dan keer je de richting om en laat je elk alien ALIEN_VAL pixels zakken.
for alien in aliens:
alien.x += snelheid * alien_richting
rechts = max(a.right for a in aliens)
links = min(a.left for a in aliens)
if rechts >= BREEDTE or links <= 0:
alien_richting *= -1
for alien in aliens:
alien.y += ALIEN_VAL
Kogels zijn ook pygame.Rect-objecten. Speler-kogels gaan omhoog (k.y -= KOGEL_SNL), alien-kogels gaan omlaag (k.y += ALIEN_SNL). Botsingen check je met k.colliderect(alien).
✅ Basic
- Teken de achtergrond (gebruik
random.seed(42) voor vaste sterren), het schip en alle aliens. - Beweeg het schip links/rechts met de pijltjestoetsen.
- Laat de formatie heen en weer bewegen en omlaag zakken bij een rand.
- Schiet een kogel omhoog als de speler op spatie drukt. Gebruik
COOLDOWN_MS om razendsnel schieten te voorkomen.
⭐ Stretch
- Speler-kogel raakt alien: verwijder beide, score += 10.
- Elk alien schiet willekeurig terug:
if random.random() < SCHIET_KANS. - Alien-kogel raakt speler: levens -= 1, bij 0 levens → game over.
- Toon score en levens linksboven.
🔥 Expert
- De formatie versnelt naarmate er minder aliens zijn:
1 + 3 * (1 - restant). Van 1 pixel/frame bij het begin tot 4 pixels/frame bij de laatste alien. - Game over als een alien de onderkant bereikt (
alien.bottom >= HOOGTE - 50). - Game over (gewonnen) als de lijst leeg is.
- Herstart met R: stel alle variabelen opnieuw in via een
reset()-functie.
Downloads
- Startcode:
main.py met venster, afbeeldingen en alien-rooster klaar; jij vult de logica in. - Afbeeldingen: ship.png, enemy.png en laser.png als je zonder startcode begint.
Afbeeldingen: Kenney Space Shooter Redux, CC0 (publiek domein). kenney.nl
Pac-Man
Notitie
Vereist: sessie 9 afgerond.
Een doolhof van blauwe muren. Witte stippen overal. Vier gekleurde geesten die op je afkomen. Eet alle stippen om te winnen. Raak een geest en het is game over.
Opstarten
Download de startcode en pak de ZIP uit. Open main.py in Thonny en klik Run. Het doolhof verschijnt en Pac-Man staat klaar. Jij voegt de beweging, de botsingen en de geesten toe.
Hoe werkt het?
Pac-Man beweegt in pixels, niet in vakjes. Elk frame verplaatst hij snelheid × dt pixels in zijn richting. dt is de tijd (in seconden) die het vorige frame duurde. Zo beweegt het spel even snel op trage én snelle computers.
nieuw_x = self.rect.x + self.dx * PACMAN_SNL * dt
Muurbotsing check je door een test-rect te maken op de nieuwe positie en te kijken of die overlapt met een muurblok:
test = self.rect.copy()
test.x = nieuw_x
test.y = nieuw_y
botsing = any(test.colliderect(m.rect) for m in muren)
✅ Basic
- Laat Pac-Man in zijn huidige richting bewegen (pijltjestoetsen staan al klaar).
- Voeg muurbotsing toe: stop als de nieuwe positie een muur raakt.
- Laat de richtingswissel werken: schakel pas over naar de nieuwe richting als die vrij is.
⭐ Stretch
- Eet witte stippen: als Pac-Man een stip raakt, verwijder die en tel 10 punten.
- Eet gele power stippen: verwijder, tel 50 punten en zet
self.powered_up = True. - Win als alle stippen op zijn: zet
self.staat = GEWONNEN.
🔥 Expert
- Laat geesten bewegen: probeer richtingen en kies een vrije (geen muurbotsing).
- Laat geesten op Pac-Man jagen: kies de richting die de afstand tot Pac-Man verkleint.
- Als een geest Pac-Man raakt en
powered_up is False: game over. - Als een geest Pac-Man raakt en
powered_up is True: eet de geest (+200 punten).
Downloads
- Startcode:
main.py + geluidsbestanden; jij vult de beweging en botsingen in.
Frogger
Notitie
Vereist: sessie 5 (Breakout) afgerond.
Een kikker wil de overkant bereiken. Daarvoor moet hij een drukke weg oversteken én een gevaarlijke rivier. Auto’s rijden in drie banen, houtblokken drijven op het water. Eén verkeerde stap en het is gedaan.
Opstarten
Download de startcode en pak de ZIP uit. Open main.py in Thonny en klik Run. Je ziet het speelveld maar de kikker beweegt nog niet. Jij vult de functies in.
Hoe werkt het?
Het scherm is opgedeeld in horizontale banen van 40 pixels:
- Boven: 5 vijvers waar de kikker veilig moet geraken
- Rivier (3 banen): houtblokken drijven voorbij. Op een blok ben je veilig, in het water verdrink je.
- Gras berm: veilige rustplek in het midden
- Weg (3 banen): auto’s rijden heen en weer. Geraakt worden = dood.
- Onder: startpositie van de kikker
TEGEL = 40
KOLOMMEN, RIJEN = 13, 14
# Banen: (rij, richting, snelheid)
AUTO_BANEN = [
(6, 1, 2), # rechts, traag
(7, -1, 4), # links, snel
(8, 1, 3), # rechts, gemiddeld
]
Auto’s en houtblokken zijn pygame.Rect-objecten in een lijst. Elk frame verschuif je ze allemaal en verwijder je ze als ze buiten het scherm vallen.
De kikker beweegt in vaste stappen van TEGEL pixels. Druk op een pijltjestoets en de kikker springt één vakje in die richting.
Botsingen check je met rect.colliderect(andere_rect).
✅ Basic
- Kikker verplaatsen: vang de pijltjestoetsen in
KEYDOWN en pas kikker.x en kikker.y aan met TEGEL. - Auto’s spawnen: vul
spawn_auto(). Kies een willekeurige baan, maak een Rect net buiten het scherm, voeg toe aan auto_lijst. - Auto’s bewegen: in
update(): verschuif elke auto met rect.x += richting * snelheid. Verwijder auto’s buiten het scherm. Houd minstens 6 auto’s. - Houtblokken spawnen: vul
spawn_hout(). Hetzelfde principe, maar met HOUT_BANEN en een grotere breedte. - Houtblokken bewegen: in
update(): verschuif en verwijder zoals bij auto’s. Houd minstens 4 blokken. - Auto-botsing: als
kikker.colliderect(auto): roep sterf() aan. - Verdrinking: als de kikker in de rivier is (rij 2, 3 of 4) en niet op een houtblok:
sterf(). - Vijver check: als de kikker dicht bij een onbezette vijver is: zet
huizen_gevuld[i] = True, score += 10, reset de kikker. 5 vijvers vol = gewonnen.
Klaar? Je hebt een werkende Frogger!
⭐ Stretch
- Levenden teller: het
levens-systeem staat al klaar. Zorg dat het spel stopt als levens <= 0 en toon “GAME OVER”. - Timer: voeg een timer toe. Start met 30 seconden per level. Als de timer afloopt verlies je een leven. Toon de timer in de HUD. Bij elke gevulde vijver krijg je 5 seconden extra.
- Moeilijkheidsgraad: verhoog de snelheid van auto’s en houtblokken naarmate de score stijgt (
snelheid = basis + score // 50).
🔥 Expert
- Bonusvlieg: een groen insect verschijnt willekeurig op de kaart en beweegt rond. Vang het voor 20 bonuspunten. Laat het na 5 seconden verdwijnen.
- High score: sla de hoogste score op in een variabele
high_score. Toon hem naast de huidige score. Werk bij als de speler een nieuw record zet. - Verschillende voertuigen: voeg vrachtwagens toe (2 vakjes breed, trager) en motoren (1 vakje, sneller). Gebruik een aparte lijst of een
type-veld. - Animatie: laat de kikker kort knipperen als hij sterft (
dood_timer staat al klaar). Teken een kleine plons als de kikker verdrinkt.
Downloads
- Startcode:
main.py met het speelveld, de kikker en alle teken-code klaar; jij vult de logica in.
Geïnspireerd op het klassieke Frogger (1981, Konami). Tekeningen met pygame.draw.