<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dojo Defender : Session 4 :: CoderDojo Python &amp; Pygame</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-4/index.html</link><description>Aujourd’hui, Dojo Defender devient un vrai jeu avec un menu. Fini le démarrage sur un écran noir — tu obtiens un écran-titre, un écran de game over, et trois types d’ennemis qui ont chacun leur propre mouvement.
Ce que tu vas apprendre aujourd’hui State machines : ton jeu a des états (MENU, PLAYING, GAME OVER) IA des ennemis : chaque ennemi bouge autrement (droit, zigzag, charger) Système de waves : des vagues de plus en plus difficiles avec des mélanges d’ennemis Une fonction reset : tout remettre proprement en place sans redémarrer Étape 0 : Télécharge le starter Le starter est la solution de la session 3 — Dojo Defender en pygame brut avec du son.</description><generator>Hugo</generator><language>fr-BE</language><atom:link href="https://python.coderdojohasselt.be/fr/dojo-defender/session-4/index.xml" rel="self" type="application/rss+xml"/><item><title>Dojo Defender Session 4 : Cheatsheet</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-4/cheatsheet/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/dojo-defender/session-4/cheatsheet/index.html</guid><description>State machine state = "MENU" # "MENU", "PLAYING", "GAME_OVER" # Dans la event loop : if event.key == pygame.K_SPACE: if state == "MENU": reset_game() state = "PLAYING" elif state == "GAME_OVER": reset_game() state = "PLAYING" elif state == "PLAYING" and not game_over: # tire # Dans la boucle de dessin : if state == "MENU": # écran-titre elif state == "PLAYING": # jeu normal elif state == "GAME_OVER": # écran de game over Fonction reset def reset_game(): global ship, asteroids, bullets, enemies, lives, score global game_over, timer, explosion_active, explosion_frame global explosion_timer, invincible, invincible_timer global shoot_cooldown, wave, wave_display_timer global enemies_destroyed, spawn_counter, spawn_interval ship.rect.center = (WIDTH / 2, HEIGHT - 50) ship.visible = True asteroids.clear() bullets.clear() enemies.clear() lives = 3 score = 0 game_over = False timer = 0 explosion_active = False explosion_frame = 0 explosion_timer = 0 invincible = False invincible_timer = 0 shoot_cooldown = 0 wave = 1 wave_display_timer = 0 enemies_destroyed = 0 spawn_counter = 0 spawn_interval = 120 Faire apparaître trois types d’ennemis def spawn_enemy_drone(): enemy = GameObject('enemy_drone.png', random.randint(30, WIDTH - 30), -30) enemy.type = 'drone' enemy.speed = random.uniform(1, 3) enemies.append(enemy) def spawn_enemy_zigzag(): enemy = GameObject('enemy_zigzag.png', random.randint(30, WIDTH - 30), -30) enemy.type = 'zigzag' enemy.speed = random.uniform(2, 4) enemy.dx = random.choice([-2, 2]) enemies.append(enemy) def spawn_enemy_charger(): enemy = GameObject('enemy_charger.png', random.randint(30, WIDTH - 30), -30) enemy.type = 'charger' enemy.speed = random.uniform(3, 5) enemies.append(enemy) Mouvement par type for enemy in enemies[:]: if enemy.type == 'drone': enemy.rect.y += enemy.speed elif enemy.type == 'zigzag': enemy.rect.x += enemy.dx enemy.rect.y += enemy.speed if enemy.rect.left &lt;= 0 or enemy.rect.right >= WIDTH: enemy.dx = -enemy.dx elif enemy.type == 'charger': dx = ship.rect.centerx - enemy.rect.centerx if dx > 0: enemy.rect.centerx += min(enemy.speed, abs(dx)) elif dx &lt; 0: enemy.rect.centerx -= min(enemy.speed, abs(dx)) enemy.rect.y += enemy.speed * 0.8 Sélection de wave def spawn_enemy(): if wave == 1: spawn_enemy_drone() elif wave &lt;= 3: if random.random() &lt; 0.5: spawn_enemy_drone() else: spawn_enemy_zigzag() else: r = random.random() if r &lt; 0.3: spawn_enemy_drone() elif r &lt; 0.65: spawn_enemy_zigzag() else: spawn_enemy_charger()</description></item><item><title>Dojo Defender Session 4 : Démo</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-4/demo/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/dojo-defender/session-4/demo/index.html</guid><description>Comment montrer la solution Ouvre un terminal dans le dossier du projet. Lance : uv run python3 code/sessions/05-breakout/dojo-defender-solution/main.py Montre :
Le jeu démarre dans le MENU avec le titre « DOJO DEFENDER » et « Appuie sur ESPACE pour commencer » ESPACE lance le jeu et remet toutes les valeurs à zéro Trois types d’ennemis : Drone (bleu, carré) — descend tout droit Zigzag (rouge, triangulaire) — bouge en diagonale, rebondit sur les bords Charger (jaune, pointu) — suit le vaisseau horizontalement Système de waves : wave 1 seulement des drones, waves 2-3 drones + zigzag, wave 4+ aussi des chargers Game over : affiche « GAME OVER » avec le score et « Appuie sur ESPACE pour recommencer » Transitions d’état : MENU → PLAYING → GAME_OVER → PLAYING Points de code à montrer :</description></item><item><title>Dojo Defender Session 4 : Notes du coach</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-4/mentor-notes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/dojo-defender/session-4/mentor-notes/index.html</guid><description>Objectif de cette session Après cette session, un ninja sait :
Appliquer une state machine (MENU → PLAYING → GAME_OVER) Écrire une fonction reset qui remet toutes les variables globales à zéro Implémenter plusieurs IA d’ennemis (drone, zigzag, charger) Construire un système de waves qui fait monter la difficulté Préparation (30 min avant la session) Les ZIP du starter prêts sur USB et sur le site : dojo-defender-s5-starter.fr.zip et dojo-defender-s5-solution.fr.zip. Lancer le starter une fois sur le portable de la salle dojo. Vérifie que enemy_zigzag.png et enemy_charger.png se trouvent dans le dossier images/ du starter. Explique la state machine au tableau : dessine trois blocs (MENU, PLAYING, GAME_OVER) avec des flèches entre eux. Répartition du temps (3 heures) Cette session fait partie intégrante de la session normale 5 (Breakout). Utilise le temps comme ceci :</description></item></channel></rss>