<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Session 10 : Mon jeu :: CoderDojo Python &amp; Pygame</title><link>https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/index.html</link><description>Cette session est la tienne. Pas d’étapes fixes, pas de mécaniques obligatoires. C’est toi qui décides ce que tu construis, et aujourd’hui tu le fais.
Ton jeu, tes règles En neuf sessions, tu as appris :
Les variables, les fonctions et les boucles de jeu Le clavier et la souris Les sprites, la détection de collision et le score Le son et l’animation Les classes et l’héritage Les arrière-plans qui défilent, le spawn et la difficulté qui augmente Les barres de HP, les state machines et l’IA du boss Toutes ces briques sont prêtes. Aujourd’hui, tu les combines dans ton propre jeu.</description><generator>Hugo</generator><language>fr-BE</language><atom:link href="https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/index.xml" rel="self" type="application/rss+xml"/><item><title>Session 10 : Notes du coach</title><link>https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/mentor-notes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/mentor-notes/index.html</guid><description>Objectif de cette session C’est une session ouverte. Il n’y a pas de « checkpoint Basic » avec des objectifs fixes : le but est que chaque ninja construise quelque chose qu’il a imaginé lui-même et dont il est fier.
Critères de réussite par niveau :
Ninja débutant : a une fenêtre pygame qui fonctionne avec au moins un élément interactif (se déplacer, tirer, ou une collision). Ninja avancé : combine deux mécaniques ou plus des sessions précédentes dans un jeu cohérent. Ninja expert : a un jeu entièrement jouable avec un début, une fin et du feedback (score, vies, écran de victoire ou de défaite). Préparation (30 min avant la session) Relis rapidement les cheatsheets précédents : les ninjas poseront des questions sur les patrons des sessions 1 à 9. Le cheatsheet de la session 10 combine tout ; garde-le sous la main. Prépare du matériel d’inspiration : des impressions des options de genres ou une dia avec des captures d’écran de jeux simples aident les ninjas qui bloquent au moment de choisir un concept. Rappel : le jeu ne doit pas être terminé. Dis-le clairement à l’intro. Un ninja qui a construit une mécanique de déplacement qui marche a aussi bien réussi que quelqu’un qui a un jeu complet. Répartition du temps (3 heures) Temps Activité 0:00 à 0:15 Accueil, explication de la session libre, choisir un concept 0:15 à 0:30 Faire un plan (3 questions sur papier ou dans le code) 0:30 à 2:15 Construire : les coaches passent et aident individuellement 2:15 à 2:45 Finaliser + préparer le showcase 2:45 à 3:00 Showcase : chacun présente 1 à 2 minutes Le rôle du coach aujourd’hui Aujourd’hui, tu es moins instructeur et plus partenaire de sparring :</description></item><item><title>Session 10 : Cheatsheet (toutes les sessions)</title><link>https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/cheatsheet/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/cheatsheet/index.html</guid><description>Un aperçu de tous les patrons des sessions 1 à 9. Utilise-le comme référence quand tu construis ton propre jeu.
Game loop pygame (session 6+) import pygame pygame.init() WIDTH, HEIGHT = 800, 500 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Mon jeu") clock = pygame.time.Clock() font = pygame.font.SysFont(None, 36) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: pass # action sur ESPACE screen.fill((20, 20, 50)) # logique de mise à jour ici # logique de dessin ici pygame.display.flip() clock.tick(60) pygame.quit() Game loop pgzrun (sessions 1 à 5) import pgzrun WIDTH = 600 HEIGHT = 400 def draw(): screen.fill((20, 20, 50)) def update(): pass # remplace par ta propre logique pgzrun.go() Clavier # Style Pgzrun : if keyboard.left: speler.x -= 5 # Style Pygame : keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: speler_rect.x -= 5 if keys[pygame.K_RIGHT]: speler_rect.x += 5 if keys[pygame.K_UP]: speler_rect.y -= 5 if keys[pygame.K_DOWN]: speler_rect.y += 5 Souris # Position : mx, my = pygame.mouse.get_pos() # Clics (dans la boucle des événements) : if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: # bouton gauche de la souris pass Actor / Sprite (pgzrun) speler = Actor('speler') # charge images/speler.png speler.pos = (300, 380) def draw(): speler.draw() if speler.colliderect(ster): pass # collision ! Créer et dessiner un Rect (pygame) speler_rect = pygame.Rect(x, y, breedte, hoogte) pygame.draw.rect(screen, (0, 128, 255), speler_rect) # Cercle : pygame.draw.circle(screen, (255, 255, 0), (x, y), straal) # Ligne : pygame.draw.line(screen, (255, 0, 0), (x1, y1), (x2, y2), dikte) Détection de collision # Deux Rects : if rect_a.colliderect(rect_b): pass # Point dans un Rect : if rect.collidepoint(mx, my): pass # Pgzrun : if actor_a.colliderect(actor_b): pass Gravité et saut (session 6) GRAVITY = 0.5 vel_y = 0 on_ground = False # À chaque frame : vel_y += GRAVITY speler_rect.y += int(vel_y) for platform in platforms: if speler_rect.colliderect(platform) and vel_y > 0: speler_rect.bottom = platform.top vel_y = 0 on_ground = True # Sauter : if keys[pygame.K_SPACE] and on_ground: vel_y = -12 Classes (session 7) class Vijand: def __init__(self, x, y): self.x = x self.y = y self.alive = True def update(self): self.y += 2 def draw(self, screen): pygame.draw.circle(screen, (0, 200, 0), (int(self.x), int(self.y)), 15) # Utilisation : v = Vijand(200, 0) v.update() v.draw(screen) Héritage (session 7) class SlingerVijand(Vijand): def __init__(self, x, y): super().__init__(x, y) self.timer = 0 self.start_x = x def update(self): import math self.timer += 0.05 self.x = self.start_x + math.sin(self.timer) * 60 self.y += 1.5 Arrière-plan qui défile (session 8) scroll_x = 0 speed = 4 # À chaque frame : scroll_x -= speed if scroll_x &lt;= -WIDTH: scroll_x = 0 screen.blit(bg_image, (int(scroll_x), 0)) screen.blit(bg_image, (int(scroll_x) + WIDTH, 0)) Faire apparaître des objets (session 8) import random SPAWN_EVENT = pygame.USEREVENT + 1 pygame.time.set_timer(SPAWN_EVENT, 1500) for event in pygame.event.get(): if event.type == SPAWN_EVENT: objecten.append(pygame.Rect(WIDTH, random.randint(50, HEIGHT - 100), 30, 60)) # Déplacer et supprimer : for obj in objecten[:]: obj.x -= speed if obj.x &lt; -obj.width: objecten.remove(obj) Dessiner une barre de HP (session 9) MAX_HP = 100 # Fond : pygame.draw.rect(screen, (80, 0, 0), (10, 10, 300, 20)) # Partie remplie : breedte = max(0, int(300 * hp / MAX_HP)) pygame.draw.rect(screen, (220, 0, 0), (10, 10, breedte, 20)) State machine / phases (session 9) if hp > 50: fase = 1 snelheid = 3 elif hp > 25: fase = 2 snelheid = 5 else: fase = 3 snelheid = 7 Garder les projectiles dans une liste kogels = [] # Créer (sur appui de touche) : kogels.append(pygame.Rect(speler_rect.centerx - 3, speler_rect.top - 15, 6, 15)) # Déplacer et supprimer : for k in kogels[:]: k.y -= 8 if k.y &lt; 0: kogels.remove(k) continue pygame.draw.rect(screen, (255, 255, 0), k) # Collision avec un ennemi : if k.colliderect(vijand_rect): kogels.remove(k) vijand.alive = False score += 1 break Son (session 6) pygame.mixer.init() sprong_snd = pygame.mixer.Sound("sounds/sprong.wav") sprong_snd.play() # Musique de fond : pygame.mixer.music.load("sounds/muziek.mp3") pygame.mixer.music.play(-1) # -1 = répète à l'infini Dessiner du texte font = pygame.font.SysFont(None, 36) tekst = font.render(f"Score : {score}", True, (255, 255, 255)) screen.blit(tekst, (10, 10)) # Centré : screen.blit(tekst, (WIDTH // 2 - tekst.get_width() // 2, HEIGHT // 2)) Score et variables globales score = 0 # en dehors de toutes les fonctions # Dans update() de pgzrun : global score score += 1 # Dans pygame (le score est déjà global s'il est en dehors de la boucle) : score += 1 Nombres aléatoires import random x = random.randint(0, WIDTH) # entier entre 0 et WIDTH k = random.choice(['rood', 'blauw']) # élément au hasard dans une liste r = random.random() # nombre à virgule entre 0.0 et 1.0 Patron de timer (basé sur les frames) timer = 0 interval = 90 # toutes les 90 frames (= 1,5 sec à 60 FPS) # À chaque frame : timer += 1 if timer >= interval: timer = 0 # fais quelque chose Écran de victoire et de game over # Game over : screen.fill((0, 0, 0)) go = font.render("GAME OVER", True, (220, 0, 0)) screen.blit(go, (WIDTH // 2 - go.get_width() // 2, HEIGHT // 2)) pygame.display.flip() pygame.time.wait(3000) # Victoire : win = font.render("Gagné !", True, (255, 220, 0)) screen.blit(win, (WIDTH // 2 - win.get_width() // 2, HEIGHT // 2)) pygame.display.flip() pygame.time.wait(3000)</description></item><item><title>Session 10 : Enregistrement de la démo</title><link>https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/demo/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/sessions/python/10-my-game/demo/index.html</guid><description>La session 10 est une session libre : il n’y a pas de solution fixe, donc pas de GIF de démo pour la page de la session.
Alternative : photos du showcase Pendant le showcase, prends des photos des écrans des ninjas (avec leur accord). Tu peux en placer une sélection sur la page de la session comme galerie de ce que le groupe a construit.
Ajoute les photos dans static/sessions/10-my-game/ et fais-y référence via :</description></item></channel></rss>