Défis supplémentaires

Tu as terminé les dix sessions. Ici, tu trouves des jeux classiques à reconstruire toi-même. Pas de guide pas à pas, juste quelques repères et un fichier de départ. Écris le code toi-même. Jusqu’où vas-tu ?

Défis

  • Snake : Session 5 et plus. Grandis le plus longtemps possible. Mange des fruits, évite les murs et toi-même.
  • Space Invaders : Session 7 et plus. Abats la formation d’aliens avant qu’ils atterrissent.
30 octobre 2026, 15:59

Sous-sections de Défis supplémentaires

Snake

Remarque

Requis : session 5 terminée.

Le serpent avance tout seul. Toi, tu le diriges avec les flèches. Mange un fruit : le serpent grandit d’une case. Touche le mur ou toi-même : game over.

Démarrage

Télécharge le code de départ et décompresse le ZIP. Ouvre main.py dans Thonny et clique sur Run. Tu vois une grille vide. Les commandes et le chronométrage sont déjà en place. C’est toi qui remplis les fonctions nieuw_fruit(), zet_stap() et teken().

Comment ça marche ?

Snake se joue sur une grille. Le serpent est une liste de coordonnées (kolom, rij). À chaque pas, tu ajoutes une nouvelle tête à l’avant de la liste et tu supprimes le dernier élément. Si le serpent mange un fruit, tu laisses le dernier élément en place : c’est comme ça qu’il grandit.

TILE = 20          # taille d'une case en pixels
COLS = WIDTH // TILE
ROWS = HEIGHT // TILE

slang = [(10, 10), (9, 10), (8, 10)]  # liste de (kolom, rij)
dx, dy = 1, 0                          # direction : 1 pas vers la droite

Charger et redimensionner des images

Les images de fruits font 64×64 pixels. C’est trop grand pour une case de 20×20. Tu les charges avec pygame.image.load() et tu les redimensionnes ensuite avec pygame.transform.scale(). Tout ça est déjà écrit dans le code de départ.

surf = pygame.image.load('images/apple.png').convert_alpha()
fruit_images['apple'] = pygame.transform.scale(surf, (TILE, TILE))

convert_alpha() fait en sorte que la transparence de l’image fonctionne correctement. pygame.transform.scale() renvoie une nouvelle Surface à la taille demandée. L’original ne change pas.

Pour afficher une image redimensionnée à l’écran, tu utilises screen.blit() :

screen.blit(fruit_surf, (fruit_pos[0] * TILE, fruit_pos[1] * TILE))

✅ Basic

  • Remplis nieuw_fruit() : choisis un fruit au hasard, cherche une case libre et enregistre la position et la Surface.
  • Remplis zet_stap() : calcule la nouvelle tête, ajoute-la à l’avant de la liste, supprime le dernier élément.
  • Remplis teken() : dessine la grille (pygame.draw.line), le fruit (screen.blit) et chaque anneau du serpent (pygame.draw.circle). Affiche le score avec font.render() et screen.blit().
  • Fais apparaître un fruit quand le serpent en mange un : saute slang.pop() et appelle nieuw_fruit().

⭐ Stretch

  • Game over si la tête sort de la grille.
  • Game over si la tête touche un de ses propres segments (nieuw_hoofd in slang[1:]).
  • Affiche un écran de game over avec le score. Appuie sur R pour recommencer.

🔥 Expert

  • Augmente la vitesse à mesure que le score monte : baisse STAP_MS selon le score (max(60, BASISINTERVAL - score * 10)).
  • Enregistre le meilleur score et affiche-le à côté du score actuel, même après un redémarrage.
  • Fais en sorte qu’un fruit ne puisse jamais apparaître sur une case déjà occupée par le serpent.

Téléchargements

  • Code de départ : main.py avec les commandes et le chronométrage prêts ; c’est toi qui remplis les fonctions.
  • Images de fruits : si tu commences sans le code de départ (déjà inclus dans le ZIP de départ).

Fruits : Kenney Food Kit, CC0 (domaine public). kenney.nl

30 octobre 2026, 15:59

Space Invaders

Remarque

Requis : session 7 terminée.

Les aliens sont en formation de 4×9. Ils vont et viennent, descendent d’un cran à chaque bord et tirent au hasard en retour. Toi, tu as un seul vaisseau et trois vies. Abats-les tous avant qu’ils n’atterrissent.

Démarrage

Télécharge le code de départ et décompresse le ZIP. Ouvre main.py dans Thonny et clique sur Run. Tu vois le vaisseau et la formation d’aliens. Les commandes et les images sont déjà en place. C’est toi qui remplis le déplacement, les tirs et les collisions.

Comment ça marche ?

Tous les aliens sont des objets pygame.Rect dans une seule liste. À chaque frame, tu les déplaces tous du même nombre de pixels. Si la formation touche un bord, tu inverses la direction et tu fais descendre chaque alien de ALIEN_VAL pixels.

for alien in aliens:
    alien.x += snelheid * alien_richting

rechts = max(a.right for a in aliens)
links  = min(a.left  for a in aliens)
if rechts >= BREEDTE or links <= 0:
    alien_richting *= -1
    for alien in aliens:
        alien.y += ALIEN_VAL

Les projectiles sont aussi des objets pygame.Rect. Les projectiles du joueur montent (k.y -= KOGEL_SNL), ceux des aliens descendent (k.y += ALIEN_SNL). Tu vérifies les collisions avec k.colliderect(alien).

✅ Basic

  • Dessine l’arrière-plan (utilise random.seed(42) pour des étoiles fixes), le vaisseau et tous les aliens.
  • Déplace le vaisseau à gauche et à droite avec les flèches.
  • Fais aller et venir la formation et descends d’un cran quand elle touche un bord.
  • Tire un projectile vers le haut quand le joueur appuie sur espace. Utilise COOLDOWN_MS pour éviter de tirer à toute vitesse.

⭐ Stretch

  • Le projectile du joueur touche un alien : supprime les deux, score += 10.
  • Chaque alien tire au hasard en retour : if random.random() < SCHIET_KANS.
  • Un projectile alien touche le joueur : levens -= 1, à 0 vie → game over.
  • Affiche le score et les vies en haut à gauche.

🔥 Expert

  • La formation accélère à mesure qu’il reste moins d’aliens : 1 + 3 * (1 - restant). De 1 pixel/frame au début à 4 pixels/frame avec le dernier alien.
  • Game over si un alien atteint le bas (alien.bottom >= HOOGTE - 50).
  • Game over (gagné) si la liste est vide.
  • Redémarrage avec R : réinitialise toutes les variables avec une fonction reset().

Téléchargements

  • Code de départ : main.py avec la fenêtre, les images et la grille d’aliens prêtes ; c’est toi qui remplis la logique.
  • Images : ship.png, enemy.png et laser.png si tu commences sans le code de départ.

Images : Kenney Space Shooter Redux, CC0 (domaine public). kenney.nl

30 octobre 2026, 15:59

Pac-Man

Remarque

Requis : session 9 terminée.

Un labyrinthe de murs bleus. Des points blancs partout. Quatre fantômes colorés qui viennent vers toi. Mange tous les points pour gagner. Touche un fantôme et c’est game over.

Démarrage

Télécharge le code de départ et décompresse le ZIP. Ouvre main.py dans Thonny et clique sur Run. Le labyrinthe apparaît et Pac-Man est prêt. C’est toi qui ajoutes le déplacement, les collisions et les fantômes.

Comment ça marche ?

Pac-Man se déplace en pixels, pas en cases. À chaque frame, il avance de snelheid × dt pixels dans sa direction. dt est le temps (en secondes) qu’a duré la frame précédente. Comme ça, le jeu avance à la même vitesse sur un ordinateur lent et sur un ordinateur rapide.

nieuw_x = self.rect.x + self.dx * PACMAN_SNL * dt

Tu vérifies la collision avec un mur en créant un rect de test à la nouvelle position et en regardant s’il chevauche un bloc de mur :

test = self.rect.copy()
test.x = nieuw_x
test.y = nieuw_y
botsing = any(test.colliderect(m.rect) for m in muren)

✅ Basic

  • Fais avancer Pac-Man dans sa direction actuelle (les flèches sont déjà prêtes).
  • Ajoute la collision avec les murs : arrête-toi si la nouvelle position touche un mur.
  • Fais fonctionner le changement de direction : ne passe à la nouvelle direction que si elle est libre.

⭐ Stretch

  • Mange les points blancs : si Pac-Man touche un point, supprime-le et compte 10 points.
  • Mange les points jaunes de power : supprime, compte 50 points et mets self.powered_up = True.
  • Gagne quand tous les points sont mangés : mets self.staat = GEWONNEN.

🔥 Expert

  • Fais bouger les fantômes : essaie des directions et choisis-en une libre (sans collision avec un mur).
  • Fais poursuivre Pac-Man par les fantômes : choisis la direction qui réduit la distance à Pac-Man.
  • Si un fantôme touche Pac-Man et que powered_up vaut False : game over.
  • Si un fantôme touche Pac-Man et que powered_up vaut True : mange le fantôme (+200 points).

Téléchargements

  • Code de départ : main.py + les fichiers de sons ; c’est toi qui remplis le déplacement et les collisions.
30 octobre 2026, 15:59

Frogger

Remarque

Requis : session 5 (Breakout) terminée.

Une grenouille veut atteindre l’autre rive. Pour ça, elle doit traverser une route chargée et une rivière dangereuse. Les voitures roulent sur trois voies, des rondins flottent sur l’eau. Un faux pas et c’est fini.

Démarrage

Télécharge le code de départ et décompresse le ZIP. Ouvre main.py dans Thonny et clique sur Run. Tu vois le terrain de jeu mais la grenouille ne bouge pas encore. C’est toi qui remplis les fonctions.

Comment ça marche ?

L’écran est divisé en voies horizontales de 40 pixels :

  • En haut : 5 étangs où la grenouille doit arriver sans encombre
  • Rivière (3 voies) : des rondins passent en flottant. Sur un rondin, tu es en sécurité ; dans l’eau, tu te noies.
  • Berge en herbe : un coin tranquille au milieu
  • Route (3 voies) : les voitures roulent dans les deux sens. Être touché = mort.
  • En bas : position de départ de la grenouille
TEGEL = 40
KOLOMMEN, RIJEN = 13, 14

# Voies : (rij, richting, snelheid)
AUTO_BANEN = [
    (6,  1, 2),   # à droite, lent
    (7, -1, 4),   # à gauche, rapide
    (8,  1, 3),   # à droite, moyen
]

Les voitures et les rondins sont des objets pygame.Rect dans une liste. À chaque frame, tu les déplaces tous et tu les supprimes quand ils sortent de l’écran.

La grenouille se déplace par pas fixes de TEGEL pixels. Appuie sur une flèche et la grenouille saute d’une case dans cette direction.

Tu vérifies les collisions avec rect.colliderect(andere_rect).

✅ Basic

  • Déplacer la grenouille : intercepte les flèches dans KEYDOWN et adapte kikker.x et kikker.y avec TEGEL.
  • Faire apparaître les voitures : remplis spawn_auto(). Choisis une voie au hasard, crée un Rect juste en dehors de l’écran, ajoute-le à auto_lijst.
  • Bouger les voitures : dans update() : décale chaque voiture avec rect.x += richting * snelheid. Supprime les voitures sorties de l’écran. Garde au moins 6 voitures.
  • Faire apparaître les rondins : remplis spawn_hout(). Même principe, mais avec HOUT_BANEN et une largeur plus grande.
  • Bouger les rondins : dans update() : décale et supprime comme pour les voitures. Garde au moins 4 rondins.
  • Collision avec une voiture : si kikker.colliderect(auto) : appelle sterf().
  • Noyade : si la grenouille est dans la rivière (ligne 2, 3 ou 4) et pas sur un rondin : sterf().
  • Vérification des étangs : si la grenouille est près d’un étang vide : mets huizen_gevuld[i] = True, score += 10, réinitialise la grenouille. 5 étangs remplis = gagné.

C’est bon ? Tu as un Frogger qui fonctionne !

⭐ Stretch

  • Compteur de vies : le système de levens est déjà prêt. Fais en sorte que le jeu s’arrête si levens <= 0 et affiche « GAME OVER ».
  • Chronomètre : ajoute un chronomètre. Commence avec 30 secondes par niveau. Si le chronomètre arrive à zéro, tu perds une vie. Affiche le chronomètre dans le HUD. Chaque étang rempli te donne 5 secondes de plus.
  • Difficulté : augmente la vitesse des voitures et des rondins à mesure que le score monte (snelheid = basis + score // 50).

🔥 Expert

  • Mouche bonus : un insecte vert apparaît au hasard sur la carte et se déplace. Attrape-le pour 20 points bonus. Fais-le disparaître après 5 secondes.
  • High score : enregistre le meilleur score dans une variable high_score. Affiche-le à côté du score actuel. Mets-le à jour quand le joueur bat un nouveau record.
  • Véhicules différents : ajoute des camions (2 cases de large, plus lents) et des motos (1 case, plus rapides). Utilise une liste séparée ou un champ type.
  • Animation : fais clignoter la grenouille un instant quand elle meurt (dood_timer est déjà prêt). Dessine un petit plouf quand la grenouille se noie.

Téléchargements

  • Code de départ : main.py avec le terrain de jeu, la grenouille et tout le code de dessin prêts ; c’est toi qui remplis la logique.

Inspiré du classique Frogger (1981, Konami). Dessins avec pygame.draw.