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
- Ouvre Thonny.
- Télécharge le starter via ce lien, décompresse le ZIP et ouvre
main.pydans Thonny. - Clique sur Run. Tu vois le boss en haut, ton vaisseau en bas. Pas encore de mouvement, pas encore de projectiles.
- 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_speedboss_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 = FalseDessine 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 :
- Facile : change la couleur du boss selon la phase (vert → orange → rouge).
- Moyen : ajoute un score : plus tu bats le boss vite, plus tu marques de points.
- Difficile : fais aussi tirer le boss en diagonale en phase 2 (en biais à gauche et à droite).
- Très difficile : ajoute un deuxième joueur qui peut participer avec les touches WASD.