Pac-Man: Coach-notities
Doel van de uitdaging
Een ninja heeft de uitdaging afgerond als:
- ✅ Basic: Pac-Man beweegt via pijltjestoetsen, stopt bij muren en wisselt correct van richting.
- ⭐ Stretch: stippen worden verwijderd bij aanraking, score telt op, power stippen activeren
powered_up, game eindigt als alle stippen op zijn. - 🔥 Expert: geesten bewegen door het doolhof en jagen op Pac-Man; botsing leidt tot game over (of het eten van de geest als powered).
Voorbereiding
- Geef de ninja de startcode. Die bevat
main.pyen desounds/-map. - Klik Run: het doolhof en alle sprites verschijnen al. Pac-Man staat stil en loopt door muren (dat is de opdracht voor Basic).
- Test of pygame beschikbaar is op de laptop (zie Thonny instellen).
Nieuw concept: pixel-beweging met dt
Dit is de eerste keer dat ninjas met frame-rate-onafhankelijke beweging werken. Leg het uit als ze vragen waarom dt:
nieuw_x = self.rect.x + self.dx * PACMAN_SNL * dtdt is de tijd (seconden) die het vorige frame duurde. Op een snelle computer is dt klein (bijv. 0.016 s bij 60 FPS), op een trage computer is dt groter. Door te vermenigvuldigen met dt beweegt het spel altijd even snel.
Veelgestelde vragen
“Pac-Man blijft door muren gaan na Basic”
De test-rect moet gemaakt worden vóór de verplaatsing van self.rect. Controleer of de ninja test = self.rect.copy() aanmaakt en dan test.x = nieuw_x zet, en niet self.rect.x = nieuw_x en daarna testen.
“Pac-Man kan niet van richting wisselen”
De richtingswissel staat in een apart if self.volgende_dx != 0 or self.volgende_dy != 0-blok. Dit blok moet vóór de beweging komen. Controleer de volgorde.
“De score telt niet op”
pygame.sprite.spritecollide(self.pacman, self.pellets, True) verwijdert de pellet en geeft hem terug. Als de ninja p.punten niet optelt, is de score altijd 0. Controleer of de lus over de teruggegeven lijst loopt.
“De geesten bewegen maar botsen niet met muren”
De test-rect moet gecheckt worden tegen muren, niet tegen alles. Controleer of de ninja de juiste groep gebruikt.
“Geest raakt Pac-Man maar er gebeurt niets”
De ninja gebruikt waarschijnlijk pygame.sprite.spritecollide zonder de nauwkeurigere cirkelcheck. _cirkel_botsing staat al klaar in de Spel-klasse. Wijs de ninja erop.
Hints per niveau
✅ Basic
- Muurbotsing:
test = self.rect.copy(); test.x = nieuw_x; test.y = nieuw_y; botsing = any(test.colliderect(m.rect) for m in muren). - Als
not botsing: verplaatsself.rect.xenself.rect.y. Alsbotsing: zetself.dx = 0; self.dy = 0. - Richtingswissel: dezelfde logica, maar test met
self.volgende_dxenself.volgende_dy. Als vrij:self.dx = self.volgende_dx; self.dy = self.volgende_dy; self.volgende_dx = 0; self.volgende_dy = 0.
⭐ Stretch
- Pellets:
geraakt = pygame.sprite.spritecollide(self.pacman, self.pellets, True)→ loop →self.score += p.punten; self.alles.remove(p). - Power pellets: zelfde, plus
self.powered_up = True; self.power_timer = POWER_DUUR. - Win:
if len(self.pellets) == 0 and len(self.power_pellets) == 0: self.staat = GEWONNEN; self._stop_muziek().
🔥 Expert
- Willekeurige beweging:
for richting in richtingen: rdx = richting[0]; rdy = richting[1]; test met 4 px vooruit; als vrij: kies die richting. Gebruikrandom.shuffle(richtingen)zodat de keuze willekeurig is. - Jacht: bereken voor elke vrije richting
afstand = ((toekomst_x - pacman.rect.centerx)**2 + (toekomst_y - pacman.rect.centery)**2)**0.5. Kies de richting met de kleinste afstand (of grootste als kwetsbaar). - Botsing:
geest_hits = pygame.sprite.spritecollide(self.pacman, self.geesten, False); filter metself._cirkel_botsing; alspowered_up: score += 200, verwijder geest; anders:self.staat = GAME_OVER.