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.pyet le dossierimages/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.circleavecrandom.randint→random.seed()pour réinitialiser. Comme ça, les étoiles ne clignotent pas. - Déplacement des aliens : parcours
aliens, faisalien.x += ALIEN_SNL * alien_richting. Ensuite : calculerechts = max(a.right for a in aliens)etlinks = min(a.left for a in aliens). Sirechts >= BREEDTE or links <= 0: inversealien_richtinget faisalien.y += ALIEN_VALpour chaque alien. - Tirer : vérifie
pygame.time.get_ticks() - laatste_schot >= COOLDOWN_MS. Ajoute unpygame.Rectau-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 variablesglobal. Appelle-la avecpygame.K_rquandgame_overvaut True.