Session 3 : Space Blaster

Les ennemis sont en formation en haut de l’écran. Toi, tu es en bas avec un vaisseau et un seul objectif : les éliminer tous avant qu’ils atteignent le fond. Appuie sur ESPACE pour tirer, et ne rate pas.

Ce que tu vas apprendre aujourd’hui

  • Garder les projectiles dans une liste
  • Créer un projectile quand tu appuies sur ESPACE
  • La collision entre les projectiles et les ennemis
  • Game over quand un ennemi atteint le fond

Étape 0 : Installation

  1. Ouvre Thonny.
  2. Télécharge le starter via ce lien, décompresse le ZIP et ouvre main.py.
  3. Clique sur Run. Tu vois le vaisseau en bas et 12 ennemis dans une grille, mais rien ne bouge et tu ne sais pas encore tirer.

Étape 1 : Fais bouger le vaisseau

Le vaisseau bouge déjà avec les flèches. Vérifie le code dans update(). Fais en sorte que le vaisseau ne sorte pas de l’écran :

if keyboard.left and ship.x > 30:
    ship.x -= 5
if keyboard.right and ship.x < WIDTH - 30:
    ship.x += 5

Étape 2 : ✅ Basic : tirer avec ESPACE

Complète la fonction shoot(). Un projectile est un Actor qui commence à la position du vaisseau :

def shoot():
    kogel = Actor('bullet')
    kogel.x = ship.x
    kogel.y = ship.y - 20
    bullets.append(kogel)

Appelle shoot() quand la barre d’espace est pressée. Utilise on_key_down (style Pgzero) :

def on_key_down(key):
    if key == keys.SPACE:
        shoot()

Fais monter les projectiles dans update() et supprime-les quand ils sortent de l’écran :

for kogel in bullets[:]:
    kogel.y -= 8
    if kogel.y < -10:
        bullets.remove(kogel)

Étape 3 : ⭐ Stretch : toucher les ennemis

colliderect vérifie si la hitbox rectangulaire de deux actors se chevauche. Bouge ta souris sur l’écran ci-dessous pour voir quand ça arrive :

Vérifie dans update() si un projectile touche un ennemi :

for kogel in bullets[:]:
    kogel.y -= 8
    if kogel.y < -10:
        bullets.remove(kogel)
        continue
    for vijand in enemies[:]:
        if kogel.colliderect(vijand):
            bullets.remove(kogel)
            enemies.remove(vijand)
            global score
            score += 10
            break

Condition de victoire : Si enemies est vide, tu as gagné :

    if not enemies:
        screen.draw.text("TU GAGNES !", center=(WIDTH/2, HEIGHT/2), color="yellow", fontsize=60)

Étape 4 : 🔥 Expert : faire bouger les ennemis et game over

Fais descendre les ennemis lentement. Utilise un timer :

vijand_timer = 0

def update():
    global vijand_timer
    vijand_timer += 1
    if vijand_timer % 90 == 0:   # toutes les 1,5 seconde
        for vijand in enemies:
            vijand.y += 20

Game over quand un ennemi atteint le fond :

        for vijand in enemies:
            if vijand.y > HEIGHT - 30:
                global game_over
                game_over = True

Tirer plus vite : Prévois un cooldown pour que le ninja ne puisse pas tirer à l’infini :

shoot_cooldown = 0

def update():
    global shoot_cooldown
    if shoot_cooldown > 0:
        shoot_cooldown -= 1

def on_key_down(key):
    global shoot_cooldown
    if key == keys.SPACE and shoot_cooldown == 0:
        shoot()
        shoot_cooldown = 15

Showcase

Montre ton jeu à un coach. En combien de temps tu élimines tous les ennemis ? Compare ton score avec un buddy.

À la prochaine !

« La prochaine fois : deux joueurs, une balle : PONG. Et tu apprends le vrai pygame, sans pgzrun. »

À emporter chez toi

  1. Facile : change la couleur des projectiles ou des ennemis.
  2. Moyen : fais bouger les ennemis à gauche et à droite (une seule direction par pas, demi-tour au bord).
  3. Difficile : ajoute une second wave : quand tous les ennemis sont partis, fais apparaître une nouvelle rangée qui descend plus vite.
  4. Très difficile : fais aussi tirer les ennemis : envoie un projectile vers le bas au hasard toutes les N frames.

Regarde le cheatsheet de cette session

Dojo Defender

Télécharge le starter Dojo Defender d’aujourd’hui.

Tu n’étais pas là la dernière fois ? Télécharge la solution de la session 1 et commence avec ça.

La fiche de travail complète : Dojo Defender Session 2.