Projet : Casse-briques avec Pygame-ce
Le jeu
Le joueur déplace une raquette en bas de l'écran avec les flèches gauche et droite pour renvoyer une balle vers un mur de briques. Chaque brique touchée disparaît et rapporte des points. Si la balle tombe sous la raquette, le joueur perd une vie. La partie est gagnée quand toutes les briques sont détruites, et perdue quand il n'y a plus de vie.
Installation
pip install pygame-ce
pygame-ce s'importe comme Pygame (import pygame). Ne pas installer pygame et pygame-ce dans le même environnement.
Les idées clés
Le mouvement indépendant de l'ordinateur
Contrairement au Snake, tout bouge de façon continue. Pour qu'une balle ait la même vitesse sur tous les ordinateurs, on exprime les vitesses en pixels par seconde et on multiplie par le temps écoulé depuis la dernière image, noté dt :
dt = horloge.tick(60) / 1000 # secondes écoulées depuis l'image précédente
x += vx * dt
Des positions décimales
Un pygame.Rect ne contient que des entiers : une vitesse de 3,4 pixels par image serait arrondie et le mouvement serait faux. On conserve donc la position de la balle et de la raquette dans des attributs float, et on ne les arrondit qu'au moment de l'affichage ou du calcul des collisions.
Les rebonds
La balle a un vecteur vitesse (vx, vy). Un rebond consiste à inverser une composante :
- mur de gauche ou de droite :
vx = -vx; - plafond :
vy = -vy.
Ne pas inverser, mais imposer le signe
Écrire vx = abs(vx) contre le mur de gauche (et -abs(vx) contre celui de droite) plutôt que vx = -vx. Si la balle est restée plusieurs images dans le mur, une simple inversion la ferait osciller sans jamais en sortir.
Rebond sur la raquette
Si la balle rebondit toujours de la même façon, le joueur ne peut pas la diriger. On calcule donc l'angle de renvoi selon l'endroit touché : au centre, la balle repart tout droit ; sur les bords, elle repart en biais (jusqu'à 60°).
position = (balle.x - raquette.centerx) / (largeur_raquette / 2) # entre -1 et 1
angle = radians(position * 60)
vx = vitesse * sin(angle)
vy = -vitesse * cos(angle)
Rebond sur une brique
Quand la balle chevauche une brique, il faut décider si le choc est latéral (on inverse vx) ou vertical (on inverse vy). Une méthode simple : calculer de combien la balle est entrée dans la brique horizontalement (dx) et verticalement (dy) ; le rebond se fait sur l'axe où la pénétration est la plus faible.
La boucle de jeu
while en_cours :
dt = horloge.tick(FPS) / 1000
en_cours = gerer_evenements()
mettre_a_jour(dt)
afficher()
Pistes d'organisation du code
Constantes
Dimensions de la fenêtre, de la raquette, des briques, vitesses, nombre de lignes et de colonnes de briques, nombre de vies, couleurs.
Classe Raquette
| Élément | Rôle |
|---|---|
rect |
rectangle utilisé pour l'affichage et les collisions |
x |
position décimale |
deplacer(direction, dt) |
déplace la raquette (-1, 0 ou 1) en la gardant dans la fenêtre |
afficher(surface) |
dessine la raquette |
Classe Balle
| Élément | Rôle |
|---|---|
x, y, vx, vy |
position et vitesse |
collee |
True tant que la balle est posée sur la raquette |
lancer() |
donne sa vitesse à la balle |
deplacer(dt) |
fait avancer la balle |
rebondir_murs() |
rebonds sur les trois murs |
rebondir_raquette(raquette) |
rebond avec calcul de l'angle |
rebondir_brique(brique) |
rebond sur l'axe de moindre pénétration |
est_perdue() |
True si la balle est sortie par le bas |
Classe Brique
- un
rect, une couleur et une valeur en points ; afficher(surface).
Une fonction creer_briques() construit la grille de briques avec deux boucles imbriquées.
Classe Jeu
Elle possède la fenêtre, l'horloge, la raquette, la balle, la liste des briques, le score, les vies et un état ("jeu", "perdu" ou "gagne"). Ses méthodes : reinitialiser(), gerer_evenements(), mettre_a_jour(dt), gerer_briques(), afficher() et lancer().
Pour aller plus loin
- plusieurs niveaux avec des dispositions de briques différentes (un tableau de chaînes de caractères pour décrire chaque niveau) ;
- briques qui demandent plusieurs coups ;
- bonus qui tombent des briques (raquette plus large, balles multiples, vie supplémentaire) ;
- contrôle à la souris ;
- meilleur score sauvegardé, sons, images.