Article original : PyGame Tutorial – How to Build a Bouncing Ball Game
Dans ce tutoriel, vous apprendrez à créer un jeu simple mais amusant de balle rebondissante en utilisant la bibliothèque PyGame.
Que vous soyez un débutant cherchant à comprendre les bases du développement de jeux ou un passionné désireux d'explorer les capacités de PyGame, cet article est votre guide pour créer un jeu simple mais captivant.
Vous devez simplement décomposer les étapes, lire le code et profiter du voyage !
À la fin de ce tutoriel, votre jeu devrait ressembler à ceci :

Table des matières
Comment installer l'environnement de développement
Outils et logiciels
Avant de vous lancer dans l'aventure du codage, parlons des outils qui alimenteront votre créativité.
Python
Vous utiliserez Python, un langage de programmation polyvalent et adapté aux débutants. Sa syntaxe claire et son vaste support de bibliothèques en font un excellent choix pour le développement de jeux.
Si vous n'avez pas Python installé, rendez-vous sur python.org pour télécharger et installer la dernière version.
PyGame
Votre arme secrète pour ce projet. PyGame, un ensemble de modules Python, simplifie le développement de jeux en gérant des éléments multimédias comme les images et les sons. C'est le moteur qui alimentera votre jeu.
Pour installer PyGame, vous pouvez utiliser la commande suivante dans votre terminal ou invite de commandes :
pip install pygame
Éditeur de texte
Que ce soit VSCode, PyCharm ou Thonny, ces environnements offrent des fonctionnalités comme la coloration syntaxique et des outils de débogage. Choisissez celui avec lequel vous êtes le plus à l'aise, et préparons-nous à écrire du code !
J'utiliserai VSCode, mais n'hésitez pas à utiliser celui que vous préférez. Si vous vous sentez aventureux, vous pouvez essayer Thonny !
Maintenant que vous êtes armé des bons outils, plongeons dans le code et donnons vie à votre jeu.

Ceci est Thonny
Définir le concept du jeu
Concept et mécaniques du jeu
Décomposons les concepts et mécaniques de base que vous allez implémenter.
Contrôle de la plateforme :
Objectif : Utiliser les touches fléchées pour déplacer la plateforme vers la gauche ou la droite.
Implémentation : Votre plateforme se déplace horizontalement en fonction des entrées clavier.
Limites : Assurez-vous que la plateforme reste dans les limites de l'écran.
Dynamique de la balle rebondissante :
Objectif : Guider la balle rebondissante à travers l'écran.
Implémentation : La balle se déplace indépendamment, rebondissant sur les murs et la plateforme.
Interaction : Marquez des points chaque fois que la balle rebondit avec succès sur la plateforme.
Système de score :
Objectif : Accumuler des points en fonction des rebonds réussis.
Implémentation : Votre codage détermine le système de score.
Défi : Optimisez le mécanisme de score pour des scores plus élevés.
Progression des niveaux :
Objectif : Avancer à travers les niveaux à mesure que votre score atteint des paliers.
Implémentation : À chaque 10 points, vous passez à un nouveau niveau.
Défi : Attendez-vous à une difficulté et une complexité accrues à chaque niveau.
Couleur dynamique de la plateforme :
Objectif : La couleur de la plateforme change à chaque niveau, ajoutant une dynamique visuelle.
Implémentation : Les couleurs sont générées aléatoirement lors de l'atteinte d'un nouveau niveau.
Touche esthétique : Ajoute de la variété et de l'excitation à l'expérience de jeu.
Vies et fin de jeu :
Objectif : Évitez de laisser la balle tomber hors de l'écran pour conserver vos vies.
Implémentation : Les vies diminuent avec les rebonds manqués. La fin de jeu survient lorsque les vies sont épuisées (vous n'avez que 3 vies).
Redémarrage : Après la fin de jeu, redémarrez avec trois vies et un score frais.
Comment coder le jeu
Initialisation de l'application
Dans cette section, vous définirez des constantes telles que les dimensions de l'écran, les propriétés de la balle et de la plateforme, et les couleurs.
Vous initialiserez également PyGame, configurerez l'écran d'affichage et créerez un objet horloge pour contrôler le taux de rafraîchissement.
Ensuite, vous initialiserez les variables pour le jeu, y compris la position de la balle, la vitesse, la position de la plateforme, la vitesse, le score, les vies et le niveau actuel.
Voici le code pour faire tout cela :
import pygame
import sys
import random
# Constantes
WIDTH, HEIGHT = 800, 600
BALL_RADIUS = 20
PLATFORM_WIDTH, PLATFORM_HEIGHT = 100, 10
FPS = 60
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)
LIGHT_BLUE = (173, 216, 230) # Couleur bleu clair pour l'indicateur de niveau
Décomposons le code étape par étape :
Importation des bibliothèques :
import pygame: Importe la bibliothèque Pygame, utilisée pour développer des jeux en Python.import sys: Importe le module sys, fournissant l'accès à certaines variables utilisées ou maintenues par l'interpréteur et à des fonctions qui interagissent avec l'interpréteur.
Constantes :
WIDTH, HEIGHT = 800, 600: Définit les dimensions de la fenêtre de jeu.BALL_RADIUS = 20: Spécifie le rayon de la balle rebondissante.PLATFORM_WIDTH, PLATFORM_HEIGHT = 100, 10: Définit les dimensions de la plateforme.FPS = 60: Définit les images par seconde, contrôlant la vitesse du jeu.Diverses constantes de couleur comme
BLACK,WHITE,RED,YELLOW,ORANGEetLIGHT_BLUEreprésentent les valeurs RVB des couleurs utilisées dans le jeu.
Comment créer une instance PyGame
Maintenant, vous allez créer la fenêtre PyGame et définir quelques variables globales que vous utiliserez pour chaque niveau du jeu :
# Initialiser Pygame
pygame.init()
# Créer l'écran
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Bouncing Ball Game")
font = pygame.font.Font(None, 36)
# Horloge pour contrôler le taux de rafraîchissement
clock = pygame.time.Clock()
# Initialiser les variables pour le jeu
ball_pos = [WIDTH // 2, HEIGHT // 2]
ball_speed = [random.uniform(2, 4), random.uniform(2, 4)] # Vitesse de départ plus rapide
platform_pos = [WIDTH // 2 - PLATFORM_WIDTH // 2, HEIGHT - PLATFORM_HEIGHT - 10]
platform_speed = 10
score = 0
lives = 3
current_level = 1
platform_color = ORANGE # Initialiser la couleur de la plateforme
Initialisation de Pygame :
pygame.init(): Initialise la bibliothèque Pygame.
Créer la fenêtre de jeu :
screen = pygame.display.set_mode((WIDTH, HEIGHT)): Crée la fenêtre de jeu avec les dimensions spécifiées.pygame.display.set_caption("Bouncing Ball Game"): Définit le titre de la fenêtre de jeu.font = pygame.font.Font(None, 36): Initialise un objet de police pour le rendu du texte.
Horloge pour le contrôle du taux de rafraîchissement :
clock = pygame.time.Clock(): Crée un objet horloge pour contrôler le taux de rafraîchissement.
Initialisation des variables de jeu :
ball_pos = [WIDTH // 2, HEIGHT // 2]: Initialise la position de départ de la balle au centre de l'écran.ball_speed = [random.uniform(2, 4), random.uniform(2, 4)]: Initialise la vitesse de départ de la balle avec des valeurs aléatoires.platform_pos = [WIDTH // 2 - PLATFORM_WIDTH // 2, HEIGHT - PLATFORM_HEIGHT - 10]: Initialise la position de départ de la plateforme.platform_speed = 10: Définit la vitesse à laquelle la plateforme se déplace.score = 0: Initialise le score du joueur.lives = 3: Initialise le nombre de vies du joueur.current_level = 1: Initialise le niveau actuel du jeu.platform_color = ORANGE: Initialise la couleur de la plateforme.
Comment créer les écrans du jeu
Vous allez créer au moins trois écrans, un pour démarrer le jeu, un pour gagner le jeu et un pour perdre le jeu. Vous pouvez utiliser le code suivant pour faire tout cela :
# Fonctions pour les écrans
def start_screen():
screen.fill(BLACK)
show_text_on_screen("Bouncing Ball Game", 50, HEIGHT // 4)
show_text_on_screen("Appuyez sur n'importe quelle touche pour commencer...", 30, HEIGHT // 3)
show_text_on_screen("Déplacez la plateforme avec les touches fléchées...", 30, HEIGHT // 2)
pygame.display.flip()
wait_for_key()
def game_over_screen():
screen.fill(BLACK)
show_text_on_screen("Game Over", 50, HEIGHT // 3)
show_text_on_screen(f"Votre score final : {score}", 30, HEIGHT // 2)
show_text_on_screen("Appuyez sur n'importe quelle touche pour redémarrer...", 20, HEIGHT * 2 // 3)
pygame.display.flip()
wait_for_key()
def victory_screen():
screen.fill(BLACK)
show_text_on_screen("Félicitations !", 50, HEIGHT // 3)
show_text_on_screen(f"Vous avez gagné avec un score de {score}", 30, HEIGHT // 2)
show_text_on_screen("Appuyez sur n'importe quelle touche pour quitter...", 20, HEIGHT * 2 // 3)
pygame.display.flip()
wait_for_key()
def wait_for_key():
waiting = True
while waiting:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
waiting = False
def show_text_on_screen(text, font_size, y_position):
font = pygame.font.Font(None, font_size)
text_render = font.render(text, True, WHITE)
text_rect = text_render.get_rect(center=(WIDTH // 2, y_position))
screen.blit(text_render, text_rect)
def change_platform_color():
return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
Passons en revue les fonctions :
Fonction start_screen() :
Efface l'écran avec un fond noir en utilisant
screen.fill(BLACK).Affiche le titre du jeu et les instructions en utilisant
show_text_on_screen.Met à jour l'affichage pour rendre les changements visibles avec
pygame.display.flip().Appelle
wait_for_key()pour attendre une pression de touche avant de continuer.

Fonction game_over_screen() :
Efface l'écran avec un fond noir.
Affiche le message de fin de jeu, le score final et les instructions pour redémarrer.
Met à jour l'affichage.
Appelle
wait_for_key()pour attendre une pression de touche.

Fonction victory_screen() :
Efface l'écran avec un fond noir.
Affiche un message de félicitations, le score final et les instructions pour quitter.
Met à jour l'affichage.
Appelle
wait_for_key()pour attendre une pression de touche.
Fonction wait_for_key() :
Attend soit un événement de sortie (fermeture de la fenêtre de jeu), soit un événement de pression de touche.
Si l'événement est une sortie, elle quitte le jeu en utilisant
pygame.quit()etsys.exit().Si l'événement est une pression de touche, elle sort de la boucle d'attente.
Fonction show_text_on_screen(text, font_size, y_position) :
Affiche du texte sur l'écran avec la taille de police et la position Y spécifiées.
Utilise la classe
pygame.font.Fontpour créer un objet de police.Affiche le texte sur une surface avec la couleur spécifiée (blanc dans ce cas).
Positionne le texte au centre de l'écran à la position Y spécifiée.
Dessine le texte sur l'écran de jeu.
Fonction change_platform_color() :
- Retourne une couleur RVB aléatoire pour changer la couleur de la plateforme.
Ces fonctions gèrent différents aspects des écrans de jeu, des interactions utilisateur et de l'affichage du texte. Elles contribuent à la structure globale et à l'expérience utilisateur du jeu.
Boucle principale du jeu
Et maintenant, vous allez coder la boucle principale du jeu avec ses mécaniques appliquées. Examinons d'abord le code, puis l'explication.
Il s'agit du plus long bloc de code de ce tutoriel, alors soyez patient – cela en vaut la peine.
# Boucle principale du jeu
start_screen()
game_running = True
while game_running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_running = False
keys = pygame.key.get_pressed()
# Déplacer la plateforme
platform_pos[0] += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * platform_speed
platform_pos[1] += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * platform_speed
# Assurer que la plateforme reste dans les limites de l'écran
platform_pos[0] = max(0, min(platform_pos[0], WIDTH - PLATFORM_WIDTH))
platform_pos[1] = max(0, min(platform_pos[1], HEIGHT - PLATFORM_HEIGHT))
# Déplacer la balle
ball_pos[0] += ball_speed[0]
ball_pos[1] += ball_speed[1]
# Rebondir sur les murs
if ball_pos[0] <= 0 or ball_pos[0] >= WIDTH:
ball_speed[0] = -ball_speed[0]
if ball_pos[1] <= 0:
ball_speed[1] = -ball_speed[1]
# Vérifier si la balle touche la plateforme
if (
platform_pos[0] <= ball_pos[0] <= platform_pos[0] + PLATFORM_WIDTH
and platform_pos[1] <= ball_pos[1] <= platform_pos[1] + PLATFORM_HEIGHT
):
ball_speed[1] = -ball_speed[1]
score += 1
# Vérifier si le joueur passe au niveau suivant
if score >= current_level * 10:
current_level += 1
ball_pos = [WIDTH // 2, HEIGHT // 2]
ball_speed = [random.uniform(2, 4), random.uniform(2, 4)] # Vitesse aléatoire de la balle
platform_color = change_platform_color()
# Vérifier si la balle tombe hors de l'écran
if ball_pos[1] >= HEIGHT:
# Diminuer les vies
lives -= 1
if lives == 0:
game_over_screen()
start_screen() # Redémarrer le jeu après la fin de partie
score = 0
lives = 3
current_level = 1
else:
# Réinitialiser la position de la balle
ball_pos = [WIDTH // 2, HEIGHT // 2]
# Vitesse aléatoire de la balle
ball_speed = [random.uniform(2, 4), random.uniform(2, 4)]
# Effacer l'écran
screen.fill(BLACK)
# Dessiner la balle
pygame.draw.circle(screen, WHITE, (int(ball_pos[0]), int(ball_pos[1])), BALL_RADIUS)
# Dessiner la plateforme
pygame.draw.rect(screen, platform_color, (int(platform_pos[0]), int(platform_pos[1]), PLATFORM_WIDTH, PLATFORM_HEIGHT))
# Afficher les informations
info_line_y = 10 # Ajuster la position verticale si nécessaire
info_spacing = 75 # Ajuster l'espacement si nécessaire
# Dessiner le score dans un rectangle orange en haut à gauche
score_text = font.render(f"Score : {score}", True, WHITE)
score_rect = score_text.get_rect(topleft=(10, info_line_y))
pygame.draw.rect(screen, ORANGE, score_rect.inflate(10, 5))
screen.blit(score_text, score_rect)
# Dessiner l'indicateur de niveau dans un rectangle bleu clair en haut à gauche (à côté du score)
level_text = font.render(f"Niveau : {current_level}", True, WHITE)
level_rect = level_text.get_rect(topleft=(score_rect.topright[0] + info_spacing, info_line_y))
pygame.draw.rect(screen, LIGHT_BLUE, level_rect.inflate(10, 5))
screen.blit(level_text, level_rect)
# Dessiner les vies dans un rectangle rouge en haut à gauche (à côté du niveau)
lives_text = font.render(f"Vies : {lives}", True, WHITE)
lives_rect = lives_text.get_rect(topleft=(level_rect.topright[0] + info_spacing, info_line_y))
pygame.draw.rect(screen, RED, lives_rect.inflate(10, 5))
screen.blit(lives_text, lives_rect)
# Mettre à jour l'affichage
pygame.display.flip()
# Contrôler le taux de rafraîchissement
clock.tick(FPS)
# Quitter Pygame
pygame.quit()
D'accord, c'était beaucoup – mais voici ce que nous avons fait dans le code ci-dessus :
Initialisation et écran de démarrage :
Appelle
start_screen()pour afficher l'écran initial avec les instructions.Définit
game_runningsurTruepour initier la boucle principale du jeu.
Boucle principale du jeu :
- Continue jusqu'à ce que
game_runningdevienneFalse(par exemple, lorsque l'utilisateur ferme la fenêtre de jeu).
Gestion des événements :
Vérifie les événements en utilisant
pygame.event.get().Si un événement de sortie (fermeture de la fenêtre de jeu) est détecté, définit
game_runningsurFalsepour quitter la boucle.
Mouvement de la plateforme :
Lit l'état des touches fléchées en utilisant
pygame.key.get_pressed().Ajuste la position de la plateforme en fonction des entrées des touches fléchées.
Assure que la plateforme reste dans les limites de l'écran.
Mouvement et rebond de la balle :
Met à jour la position de la balle en fonction de sa vitesse.
Implémente le rebond sur les murs en inversant la vitesse lorsque les bords de l'écran sont atteints.
Détection des collisions :
Vérifie si la balle touche la plateforme en comparant les positions.
Si une collision se produit, la vitesse verticale de la balle est inversée et le joueur marque un point.
Progression des niveaux :
Vérifie si le joueur a marqué suffisamment de points pour passer au niveau suivant.
Si c'est le cas, incrémente le niveau, réinitialise la position de la balle, randomise sa vitesse et change la couleur de la plateforme.
Vérification de la fin de jeu :
Surveille si la balle tombe hors de l'écran.
Diminue le nombre de vies si la balle est en dessous de l'écran.
Si les vies sont épuisées, affiche l'écran de fin de jeu, redémarre le jeu et réinitialise le score, les vies et le niveau.
Rendu de l'écran :
Efface l'écran avec un fond noir.
Dessine la balle et la plateforme sur l'écran.
Affiche les informations de score, de niveau et de vies dans des rectangles avec des couleurs spécifiques.
Mise à jour de l'affichage et contrôle du taux de rafraîchissement :
Met à jour l'affichage pour montrer les changements.
Contrôle le taux de rafraîchissement avec
clock.tick(FPS).
Terminaison du jeu :
- Quitte PyGame et termine le programme lorsque la boucle principale est quittée.
Cette structure assure un gameplay continu, la gestion des entrées utilisateur, la mise à jour de l'état du jeu et fournit un retour visuel au joueur.
Conclusion
Dans ce tutoriel, vous avez navigué à travers les intrications de plusieurs fonctions clés qui forment l'épine dorsale de votre jeu de balle rebondissante.
Récapitulons leurs rôles :
La fonction start_screen() efface l'écran avec un fond noir, affiche le titre du jeu et les instructions, met à jour l'affichage pour la visibilité et attend une pression de touche en utilisant wait_for_key().
La fonction game_over_screen() efface l'écran avec un fond noir, affiche le message de fin de jeu, le score final et les instructions de redémarrage, met à jour l'affichage et attend une pression de touche avec wait_for_key().
La fonction victory_screen() efface l'écran avec un fond noir, affiche un message de félicitations, le score final et les instructions de sortie, met à jour l'affichage et attend une pression de touche avec wait_for_key().
La fonction wait_for_key() attend soit un événement de sortie (fermeture de la fenêtre de jeu), soit un événement de pression de touche. Elle quitte le jeu en cas de sortie et sort de la boucle d'attente si une touche est pressée.
La fonction show_text_on_screen(text, font_size, y_position) affiche du texte sur l'écran avec les attributs spécifiés, utilise la classe pygame.font.Font pour créer un objet de police et positionne et dessine le texte au centre de l'écran.
Et la fonction change_platform_color() retourne une couleur RVB aléatoire pour changer la couleur de la plateforme.
En suivant ces fonctions, vous avez plongé dans la boucle principale du jeu, le cœur de notre jeu. Elle orchestrer les mécaniques du jeu, y compris la gestion des événements, le mouvement de la plateforme et de la balle, la détection des collisions, la progression des niveaux et la terminaison du jeu.
Vous avez vu comment cette boucle assure un gameplay continu, des interactions utilisateur réactives et des visuels dynamiques.
Maintenant que vous êtes équipé de la compréhension de ces fonctions et de la boucle principale, vous avez les connaissances pour expérimenter, ajuster et développer votre jeu. Vous vous sentez prêt à vous lancer dans votre voyage de développement de jeux, à explorer de nouvelles fonctionnalités et à créer des expériences de jeu uniques. Bon codage !
Si vous souhaitez télécharger le code ou jouer au jeu, vous pouvez le trouver ici :