Pac-Man : Notes du coach

Objectif du défi

Un ninja a terminé le défi si :

  • ✅ Basic : Pac-Man se déplace avec les flèches, s’arrête contre les murs et change correctement de direction.
  • ⭐ Stretch : les points sont supprimés au contact, le score monte, les points de power activent powered_up, la partie se termine quand tous les points sont mangés.
  • 🔥 Expert : les fantômes se déplacent dans le labyrinthe et poursuivent Pac-Man ; une collision mène au game over (ou au fait de manger le fantôme s’il est en power).

Préparation

  • Donne le code de départ au ninja. Il contient main.py et le dossier sounds/.
  • Clique sur Run : le labyrinthe et tous les sprites apparaissent déjà. Pac-Man reste immobile et traverse les murs (c’est la tâche de Basic).
  • Vérifie que pygame est disponible sur l’ordinateur portable (voir Installer Thonny).

Nouveau concept : mouvement en pixels avec dt

C’est la première fois que les ninjas travaillent avec un mouvement indépendant de la frame rate. Explique-le s’ils demandent à quoi sert dt :

nieuw_x = self.rect.x + self.dx * PACMAN_SNL * dt

dt est le temps (en secondes) qu’a duré la frame précédente. Sur un ordinateur rapide, dt est petit (par ex. 0.016 s à 60 FPS), sur un ordinateur lent, dt est plus grand. En multipliant par dt, le jeu avance toujours à la même vitesse.


Questions fréquentes

« Pac-Man continue de traverser les murs après Basic » Le rect de test doit être créé avant le déplacement de self.rect. Vérifie que le ninja crée test = self.rect.copy() puis met test.x = nieuw_x, et non self.rect.x = nieuw_x suivi d’un test.

« Pac-Man ne peut pas changer de direction » Le changement de direction se trouve dans un bloc séparé if self.volgende_dx != 0 or self.volgende_dy != 0. Ce bloc doit venir avant le déplacement. Vérifie l’ordre.

« Le score ne monte pas » pygame.sprite.spritecollide(self.pacman, self.pellets, True) supprime le pellet et le renvoie. Si le ninja n’ajoute pas p.punten, le score reste toujours à 0. Vérifie que la boucle parcourt bien la liste renvoyée.

« Les fantômes bougent mais ne heurtent pas les murs » Le rect de test doit être vérifié contre muren, pas contre alles. Vérifie que le ninja utilise le bon groupe.

« Un fantôme touche Pac-Man mais rien ne se passe » Le ninja utilise probablement pygame.sprite.spritecollide sans la vérification circulaire plus précise. _cirkel_botsing est déjà prêt dans la classe Spel. Montre-le au ninja.


Indices par niveau

✅ Basic

  • Collision avec les murs : test = self.rect.copy(); test.x = nieuw_x; test.y = nieuw_y; botsing = any(test.colliderect(m.rect) for m in muren).
  • Si not botsing : déplace self.rect.x et self.rect.y. Si botsing : mets self.dx = 0; self.dy = 0.
  • Changement de direction : la même logique, mais teste avec self.volgende_dx et self.volgende_dy. Si c’est libre : 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) → boucle → self.score += p.punten; self.alles.remove(p).
  • Power pellets : pareil, plus self.powered_up = True; self.power_timer = POWER_DUUR.
  • Gagner : if len(self.pellets) == 0 and len(self.power_pellets) == 0: self.staat = GEWONNEN; self._stop_muziek().

🔥 Expert

  • Mouvement aléatoire : for richting in richtingen: rdx = richting[0]; rdy = richting[1]; teste 4 px plus loin; si libre : choisis cette direction. Utilise random.shuffle(richtingen) pour que le choix soit aléatoire.
  • Poursuite : calcule pour chaque direction libre afstand = ((toekomst_x - pacman.rect.centerx)**2 + (toekomst_y - pacman.rect.centery)**2)**0.5. Choisis la direction avec la plus petite distance (ou la plus grande s’il est vulnérable).
  • Collision : geest_hits = pygame.sprite.spritecollide(self.pacman, self.geesten, False) ; filtre avec self._cirkel_botsing ; si powered_up : score += 200, supprime le fantôme ; sinon : self.staat = GAME_OVER.