Session 9 : Boss Battle

Le boss final t’attend. Il va et vient, tire des projectiles et devient de plus en plus dangereux à mesure que ses HP baissent. Toi, tu tires en retour, tu suis ses HP sur une barre, et tu survis à trois phases. C’est la session la plus difficile, et la plus satisfaisante si tu y arrives.

Ce que tu vas apprendre aujourd’hui

  • Dessiner une barre de HP à l’écran
  • Une state machine : le boss ne se comporte pas pareil selon la phase
  • Faire tirer le boss avec un timer de projectiles
  • Activer des phases à des seuils de HP

Étape 0 : Installation

  1. Ouvre Thonny.
  2. Télécharge le starter via ce lien, décompresse le ZIP et ouvre main.py dans Thonny.
  3. Clique sur Run. Tu vois le boss en haut, ton vaisseau en bas. Pas encore de mouvement, pas encore de projectiles.
  4. Des problèmes ? Demande à un coach.

Étape 1 : Faire bouger le boss

Le boss va et vient sur l’écran. Quand il touche le bord, il repart dans l’autre sens.

Cherche # ÉTAPE 1 et ajoute :

boss_rect.x += boss_speed

# Repartir dans l'autre sens au bord
if boss_rect.right >= WIDTH or boss_rect.left <= 0:
    boss_speed = -boss_speed

boss_speed = 3 est déjà en haut du fichier. Clique sur Run : le boss traverse l’écran de gauche à droite !

Bouger le joueur et tirer (cherche # JOUEUR) :

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player_rect.left > 0:
    player_rect.x -= PLAYER_SPEED
if keys[pygame.K_RIGHT] and player_rect.right < WIDTH:
    player_rect.x += PLAYER_SPEED

# Tirer (cherche # TIR dans la boucle des événements) :
player_bullets.append(pygame.Rect(player_rect.centerx - 3, player_rect.top - 15, 6, 15))

Étape 2 : ✅ Basic : toucher le boss et la barre de HP

Collision entre le projectile du joueur et le boss :

Cherche # ÉTAPE 2 :

for b in player_bullets[:]:
    b.y -= 8
    if b.y < 0:
        player_bullets.remove(b)
        continue
    pygame.draw.rect(screen, YELLOW, b)
    if b.colliderect(boss_rect):
        player_bullets.remove(b)
        boss_hp -= 1
        if boss_hp <= 0:
            running = False  # le joueur gagne !

Dessiner la barre de HP (cherche # BARRE HP) :

# Fond de la barre
pygame.draw.rect(screen, DARK_RED, (10, 10, 300, 20))
# Partie remplie selon les HP actuels
breedte = int(300 * boss_hp / BOSS_MAX_HP)
pygame.draw.rect(screen, RED, (10, 10, breedte, 20))
# Texte
hp_surf = font.render(f"HP du boss : {boss_hp}", True, WHITE)
screen.blit(hp_surf, (320, 10))

Clique sur Run. Tire sur le boss : la barre de HP diminue !

Étape 3 : ⭐ Stretch : le boss tire en retour

Le boss tire un projectile vers le bas toutes les N frames.

Cherche # ÉTAPE 3 :

boss_shoot_timer += 1
if boss_shoot_timer >= boss_shoot_interval:
    boss_shoot_timer = 0
    boss_bullets.append(pygame.Rect(boss_rect.centerx - 4, boss_rect.bottom, 8, 16))

Mettre à jour les projectiles du boss :

for b in boss_bullets[:]:
    b.y += 6
    if b.y > HEIGHT:
        boss_bullets.remove(b)
        continue
    pygame.draw.rect(screen, ORANGE, b)
    if b.colliderect(player_rect):
        boss_bullets.remove(b)
        player_lives -= 1
        if player_lives <= 0:
            running = False

Dessine player_lives en petits cœurs ou en blocs rouges en bas de l’écran.

Étape 4 : 🔥 Expert : trois phases

Maintenant, le boss réagit à ses HP :

  • Phase 1 (HP de 100 à 50) : comportement normal
  • Phase 2 (HP de 50 à 25) : se déplace plus vite, tire plus souvent
  • Phase 3 (HP < 25) : vitesse maximale, projectiles doubles

Cherche # ÉTAPE 4 :

if boss_hp > 50:
    boss_phase = 1
    boss_speed_abs = 3
    boss_shoot_interval = 60
elif boss_hp > 25:
    boss_phase = 2
    boss_speed_abs = 5
    boss_shoot_interval = 35
else:
    boss_phase = 3
    boss_speed_abs = 7
    boss_shoot_interval = 20

# Adapter la vitesse sans changer la direction :
boss_speed = boss_speed_abs * (1 if boss_speed > 0 else -1)

Phase 3 : projectiles doubles (ajoute ceci dans le code de tir) :

if boss_phase == 3:
    boss_bullets.append(pygame.Rect(boss_rect.left + 10, boss_rect.bottom, 8, 16))
    boss_bullets.append(pygame.Rect(boss_rect.right - 18, boss_rect.bottom, 8, 16))
else:
    boss_bullets.append(pygame.Rect(boss_rect.centerx - 4, boss_rect.bottom, 8, 16))

Écran de victoire quand boss_hp <= 0 :

screen.fill(BLACK)
win = font.render("BOSS VAINCU !", True, YELLOW)
screen.blit(win, (WIDTH // 2 - win.get_width() // 2, HEIGHT // 2))
pygame.display.flip()
pygame.time.wait(3000)

Showcase

Montre ton jeu à un coach et à un buddy. Qui atteint la phase 3 et survit ?

À la prochaine !

« La prochaine fois : ton propre jeu, de zéro, entièrement ton idée. »

À emporter chez toi

Essaie une de ces extensions à la maison :

  1. Facile : change la couleur du boss selon la phase (vert → orange → rouge).
  2. Moyen : ajoute un score : plus tu bats le boss vite, plus tu marques de points.
  3. Difficile : fais aussi tirer le boss en diagonale en phase 2 (en biais à gauche et à droite).
  4. Très difficile : ajoute un deuxième joueur qui peut participer avec les touches WASD.

Bloqué ? Demande au dojo suivant à un coach, ou essaie simplement autre chose. Programmer, c’est faire.

Regarde le cheatsheet de cette session