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.pyet le dossiersounds/. - 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 * dtdt 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éplaceself.rect.xetself.rect.y. Sibotsing: metsself.dx = 0; self.dy = 0. - Changement de direction : la même logique, mais teste avec
self.volgende_dxetself.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. Utiliserandom.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 avecself._cirkel_botsing; sipowered_up: score += 200, supprime le fantôme ; sinon :self.staat = GAME_OVER.