Space Invaders : Notes du coach

Objectif du défi

Un ninja a terminé le défi si :

  • ✅ Basic : le vaisseau se déplace, la formation va et vient et descend d’un cran, le joueur peut tirer avec un temps de recharge.
  • ⭐ Stretch : les projectiles touchent les aliens (score), les aliens tirent au hasard en retour, les vies baissent quand le joueur est touché ; écran de game over.
  • 🔥 Expert : la formation accélère quand il reste moins d’aliens, game over à l’atterrissage, redémarrage avec R.

Préparation

  • Donne le code de départ au ninja. Il contient main.py et le dossier images/ avec ship.png, enemy.png et laser.png.
  • La fenêtre, l’horloge, la police, les couleurs, les constantes, le chargement des images et maak_vijanden() sont déjà dans le code de départ.
  • Vérifie que pygame est disponible sur l’ordinateur portable (voir Installer Thonny).

Questions fréquentes

« Les aliens bougent, mais ils ne descendent pas » La vérification du bord doit venir après le déplacement, pas avant. Le ninja calcule d’abord les nouveaux rechts/links après le décalage, et seulement ensuite la vérification du bord. Vérifie que alien.y += ALIEN_VAL se trouve bien dans le bloc if.

« Tous les aliens descendent deux fois d’un coup » Une seule frame peut toucher à la fois le bord droit et le bord gauche (si la formation est large et dépasse les deux en même temps). Correction : vérifie le bord une fois par frame, pas une fois par alien. Déplace la vérification du bord en dehors de la boucle sur les aliens.

« Le projectile ne part qu’une fois » Le ninja supprime le projectile dès qu’il sort de l’écran, mais oublie de le supprimer aussi quand il touche un alien. Ou l’inverse : le projectile disparaît après la collision, mais pas l’alien. Vérifie les deux appels à remove().

« Je parcours la liste pendant que je supprime dedans » for k in speler_kogels alors que tu appelles speler_kogels.remove(k) provoque des sauts inattendus. Utilise for k in speler_kogels[:] (une copie de la liste) pour que la liste d’origine puisse être modifiée sans risque.

« Le joueur tire à toute vitesse » COOLDOWN_MS = 500 doit être vérifié via pygame.time.get_ticks(). Vérifie que le ninja garde laatste_schot et le compare à nu - laatste_schot >= COOLDOWN_MS avant d’ajouter un projectile.

« Le score monte mais le texte ne s’affiche pas » font.render() renvoie une Surface. Il faut encore la mettre à l’écran avec screen.blit(). Vérifie que le ninja n’a pas oublié la deuxième étape.


Indices par niveau

✅ Basic

  • Étoiles : random.seed(42) → 70× pygame.draw.circle avec random.randint → random.seed() pour réinitialiser. Comme ça, les étoiles ne clignotent pas.
  • Déplacement des aliens : parcours aliens, fais alien.x += ALIEN_SNL * alien_richting. Ensuite : calcule rechts = max(a.right for a in aliens) et links = min(a.left for a in aliens). Si rechts >= BREEDTE or links <= 0 : inverse alien_richting et fais alien.y += ALIEN_VAL pour chaque alien.
  • Tirer : vérifie pygame.time.get_ticks() - laatste_schot >= COOLDOWN_MS. Ajoute un pygame.Rect au-dessus du vaisseau : pygame.Rect(speler.centerx - KOGEL_B // 2, speler.top - KOGEL_H, KOGEL_B, KOGEL_H).

⭐ Stretch

  • Collision projectile ↔ alien : for k in speler_kogels[:]: for alien in aliens[:]: if k.colliderect(alien): remove k, remove alien, score += 10, break.
  • Les aliens tirent : for alien in aliens: if random.random() < SCHIET_KANS: ajoute un projectile sous l'alien.
  • Vies : for k in alien_kogels[:]: if k.colliderect(speler): remove k, levens -= 1; if levens <= 0: game_over = True.

🔥 Expert

  • Vitesse : restant = len(aliens) / (RIJEN * KOLOMMEN); snelheid = max(1, round(1 + 3 * (1 - restant))). Recalcule ça à chaque frame avant la boucle sur les aliens.
  • Atterrissage : for alien in aliens: if alien.bottom >= HOOGTE - 50: game_over = True; break.
  • Reset : écris une fonction reset() qui réinitialise toutes les variables global. Appelle-la avec pygame.K_r quand game_over vaut True.