Ce jeu est une réplique du jeu d'arcade Pong utilisant la bibliothèque Pyxel.
- Installer Python (3.11+)
- Créer et activer un environnement virutel (recommendé)
# Créer l'environnement virtuel
python -m venv venv
# Activer l'environnement (Linux/MacOS)
source ./venv/bin/activate
# Activer l'environnement (Windows)
.\venv\Scripts\activate.bat- Installer les dépendances
python -m pip install -r requirements.txt- Lancer le jeu
python main.pyIl existe 2 types de partie : classique (2 joueurs) ou solo (1 joueur contre l'ordinateur)
- Chaque joueur contrôle une raquette avec le clavier (
AetQà gauche,PetMà droite). - Avant de démarrer une partie, on peut tester les contrôles, cependant la position des raquettes est réinitialisée au début de la partie.
- Appuyer sur
Entréelance la partie. - La balle part du milieu de la surface de jeu, à gauche ou à droite en alternant tous les 2 points (à chaque point à partir de 10-10).
- Elle rebondit sur les bords haut et bas de l'écran.
- Lorsqu'elle touche une raquette, elle rebondit et la direction dépend de son impact avec la raquette : si elle touche le haut de la raquette, elle part vers le haut et inversement.
- Lorsqu'elle manque la raquette, l'autre joueur marque un point et un nouvel échange commence immédiatement.
- Il y a une petite zone inaccessible en haut et en bas où l'on ne peut pas mettre la raquette, ainsi, si la balle y arrive le joueur ne peut pas la renvoyer et perd le point, le but est d'éviter des parties infinies.
- La vitesse de la balle augmente aléatoirement à chaque contact avec une raquette
- Le premier joueur à 11 points gagne, sauf s'il y a moins de 2 points d'écart, auquel cas la partie se poursuit jusqu'à ce qu'un joueur ait 2 points de plus que l'autre.
- Les règles sont les mêmes que pour une partie classique.
- La raquette gauche est contrôlée automatiquement par l'ordinateur.
- Au lancement du jeu, un menu permet au joueur de choisir la diffuculté.
Les niveaux de difficultés sont :
| Nom | Comportement |
|---|---|
| Nice | Prévoit la trajectoire de la balle et la renvoie sur la raquette du joueur si possible, le plus près possible sinon. |
| Easy | Essaie toujours d'avoir sa raquette en face de la balle. |
| Normal | Prévoit la trajectoire de la balle et se place de manière à la renvoyer, sans essayer de viser. |
| Hard | Comme le niveau précédent mais essaie de viser le plus loin possible de la raquette adverse. |
| Very Hard | Comme le niveau précédent mais, si possible, vise les zones inaccessibles en haut et en bas. |
- On peut naviguer dans les différents menus en utilisant les touches
HautetBas. - On peut sélectionner une option avec la touche
Entrée. - En jeu, on peut accéder au menu pause avec la touche
Entrée.
- Dans le menu pause, on peut enregistrer une partie en choisissant un emplacement (entre 1 et 5).
- Dans le menu principal, on peut charger une partie en choisissant son emplacement (entre 1 et 5).
- Les parties sont enregistrées au format JSON dans le dossier
saves/.
- Un menu de paramètre permet de configurer certains comportements du jeu.
- On peut naviguer entre les options grâce aux touches
GaucheetDroite. - On peut modifier la valeur de l'option actuelle avec les touches
HautetBas. - On peut réinitialiser la valeur de l'option actuelle avec la touche
R. - On peut enregistrer les changements et quitter avec la touche
Entrée. - Certaines options proposent de tester les modifications, les raquettes sont alors contrôlables avec les mêmes touches qu'en jeu.
Les options sont :
| Nom | Valeur par défaut | Unité | Description |
|---|---|---|---|
| Default ball speed | 3,5 |
pixels/frame | Vitesse de la balle lors de la mise en jeu. En réalité, la vitesse est générée aléatoirement à partir de cette valeur. |
| Ball spawn random direction range | 0,3 |
- | Lorsque la balle apparaît, sa direction est choisie aléatoirement dans cette plage de valeurs. |
| Paddle speed | 3 |
pixels/frame | Vitesse des raquttes |
| Paddle length (height) | 25 |
pixels | Taille (hauteur) de la raquette |
| Ball color | blanc | - | Couleur de la balle (blanc/orange) |
La configuration du jeu est enregistrée au format JSON dans le fichier config.json. À l'ouverture du jeu, si le fichier existe il est chargé, sinon il est créé.
L'organisation des modules est la suivante :
main.py: point d'entrée du programme et classeApp(voir plus loin)game/: classes qui représentent les parties et les éléments du jeugame.py: classeGameet sous-classesball.py: ballepaddle.py: raquetteai.py: IAs (pour le mode solo)
menu/: menus de l'applicationmenu.py: classeMenu(générique)main.py: menu principalpause.py: menu pausesave.py: menus d'enregistrement/chargement de partieai.py: menu permettant de choisir la difficulté de l'IA en mode solo
config.py: classeConfig, représentant la configuration du jeusettings.py: écran de paramètreconsts.py: constantes du jeuscreen.py: classe abstraiteScreenet classeMessageScreensave.py: classe abstraiteSavableet fonctions génériques pour le JSONutil.py: fonctions diversesvec.py: classeVec2, représentant un vecteur 2D (pour la physique de la balle)
Les classes les plus importantes sont :
App(définie dansmain.py)- Représente l'application, gère l'initalisation, le lancement et la fermeture de la fenêtre Pyxel.
- Un attribut (
screen) contient l'écran actuellement ouvert (ex : un menu ou une partie). - À chaque frame, l'écran actuel est mis à jour (méthode
update()) puis affiché (méthodedraw()). - Lorsqu'on démarre le programme, le menu principal est ouvert (c'est alors l'écran actuel de l'application). Celui-ci permet de lancer une partie ou d'ouvrir d'autres menus.
Screen(définie dansscreen.py)- Classe abstraite mère de tous les écrans.
Menu(définie dansmenu/menu.py)- Classe mère de tous les menus.
Game(définie dansgame/game.py)- Classe mère des classes représentant les parties :
MultiGame(partie classique) etSoloGame(partie solo).
- Classe mère des classes représentant les parties :
AI(définie dansgame/ai.py)- Classe mère de toutes les IAs, chaque niveau est représenté par une classe :
EasyAI,NormalAI,HardAI,VeryHardAIetNiceAI
- Classe mère de toutes les IAs, chaque niveau est représenté par une classe :


