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.py en de sounds/-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 * dt

dt 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: verplaats self.rect.x en self.rect.y. Als botsing: zet self.dx = 0; self.dy = 0.
  • Richtingswissel: dezelfde logica, maar test met self.volgende_dx en self.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. Gebruik random.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 met self._cirkel_botsing; als powered_up: score += 200, verwijder geest; anders: self.staat = GAME_OVER.