PYTHON : PROJETS 2026
Tous les projets proposés sur cette page mettent en oeuvre la réalisation d'une
application complète, qui inclut à la fois des entrées/sorties sur fichier (par
exemple pour stocker la configuration d'un jeu ou le tableau des meilleurs
scores) et une interface homme/machine pilotée au clavier et/ou à la souris.
Ces projets vont donc nécessairement avoir besoin d'un certain nombre de modules
de la bibliothèque standard fournie avec le langage Python.
Avant de commencer, il est donc très utile de bien étudier et comprendre
l'ensemble des codes sources fournis dans les exemples vus en cours, ainsi que
dans les solutions des exercices vus en TD, qui fournissent des points de
départ pour le code à réaliser. En particulier, l'utilisation des modules
ezCLI et ezTK est OBLIGATOIRE car cela va vous permettre
de gagner beaucoup de temps sur la réalisation et la finalisation du code.
L'utilisation d'autres bibliothèques (PyGame, TkInter, etc) entraînera automatiquement
un 0 pour la note du projet. Pour
chacun des sujets, sont indiqués les exemples et les exercices qui pourront
vous servir de point de départ.
A partir de la semaine 18 (27 avril), un créneau de 1h20 de TD chaque semaine sera
exclusivement consacrés au suivi du projet de programmation. Il est donc primordial
que les 2 membres du binôme soient présents simultanément. Les 2 membres du binôme
doivent OBLIGATOIREMENT appartenir au même groupe de TD. La présence à ces
séances de suivi est OBLIGATOIRE et toute absence non justifiée sera fortement
sanctionnée par une pénalité d'un tiers par absence sur la note finale du projet
(coefficient 0.66 pour une absence, 0.33 pour deux et 0 pour trois). L'avancée de votre
projet entre chaque créneau de suivi participera à votre notation. Un projet qui avance
peu durant les trois semaines de suivi partira avec un malus.
Projet 1 : Sequence
Ecrire un programme sequence qui implémente une
variante du jeu électronique Simon, dans laquelle le joueur doit
reproduire une séquence de données aléatoires, dont la longueur est incrémentée
à chaque tour de jeu. Dans le jeu original, la séquence était constituée de
couleurs choisies dans un ensemble de quatre couleurs (rouge, vert, bleu,
jaune). Une reproduction fidèle de cette version initiale peut être jouée en
ligne en cliquant sur
ce lien.
Dans la variante demandée pour ce projet, le jeu est nettement plus complexe.
L'objectif pour le joueur est de mémoriser et reproduire une séquence ordonnée
de cases choisies aléatoirement dans une grille rectangulaire. La taille de la
grille, ainsi que le nombre de symboles différents pour chaque case est
configurable par le joueur. A chaque tour de jeu, le programme visualise les
symboles sélectionnées dans l'ordre de la séquence, en modifiant l'icône
affichée sur chaque case de la séquence durant un temps limité. Le joueur doit
ensuite cliquer sur ces cases dans le même ordre, en utilisant à chaque fois,
la bonne combinaison entre les touches du clavier et les boutons de la souris.
En cas de succès, le programme allonge la séquence en y ajoutant une case et un
symbole aléatoire, et le processus continue tant que le joueur arriver à
reproduire la séquence sans erreur. L'image ci-dessous présente un exemple
d'une interface graphique possible pour le jeu :

Dans la version la plus simple du jeu, la grille est limitée à 3 lignes, 6
colonnes et 1 seul symbole est utilisé. Dans la version la plus complexe, la
grille possède 6 lignes, 12 colonnes et 6 symboles différents sont utilisés
pour les éléments de la séquence. Pour différencier ces 6 symboles,
l'utilisateur devra cliquer sur les cases avec le bouton gauche ou le bouton
droit de la souris, en combinant éventuellement avec les touches CONTROL
ou SHIFT. Un aide-mémoire sera affiché sous la grille pour permettre au
joueur de savoir quelle combinaison de touches correspond à chaque
symbole (cf. copie d'écran ci-dessus).
Enfin, le programme devra également implémenter une sauvegarde sur fichier
des 10 meilleurs scores réalisés pour chacune des configurations de jeu
(même taille de grille et même nombre de symboles). Pour cela, l'idéal est
d'utiliser un fichier au format INI tel qu'on l'a vu en cours. Eventuellement
vous pouvez envisager de crypter ce fichier, afin qu'un joueur ne puisse pas
tricher en modifiant le fichier directement à l'aide d'un éditeur de texte.
Pour simplifier le développement du programme, on fournit une archive
sequence.zip qui contient les images
des smileys utilisés pour les différents symboles des cases. Les images sont
au format PNG, mais comme certaines versions de MacOS n'affichent pas
correctement les images PNG, j'ai également rajouté les mêmes images au format
GIF. L'archive contient également un fichier squelette sequenceZ.py qui
pourra servir de point de départ pour l'implémentation.
Exemples à relire avant de commencer le projet :
- Exemple C5C_win.py (pour l'alternance entre fenêtre de configuration et
fenêtre de jeu)
- Exemple C2C_toggle.py (pour le changement d'état automatique des case de la grille)
- Exemple C6B_event.py et Exercice C5A_leapfrog.py (pour la gestion
des boutons de la souris)
- Exemple B5A_inifile.py et B6_scores.py (pour la lecture/écriture des fichiers de scores)
Projet 3 : Sliding Rows
Ecrire un programme SlidingRows qui implémente une
variante du classique "Puissance 4" (ou "Connect 4", en anglais),
un jeu à 2 joueurs associant le mécanisme du morpion (chaque joueur doit
aligner une série de pions sur une même ligne horizontale, verticale ou
diagonale) avec les contraintes de la gravité. La version standard du jeu,
offrant une interface proche de celle demandée dans le cadre du projet, peut
être testée en ligne sur Web-Games-Online, en cliquant sur
l'image ci-dessous :

Le programme à réaliser doit implémenter une variante du jeu, appelée
Sliding Rows dont la complexité tactique est nettement plus élevée. Cette variante diffère de la version standard sur deux points spécifiques :
- Pour gagner la partie, un joueur doit arriver à construire deux
alignements de 4 pions sur la grille de jeu, et non pas un seul. Bien entendu, il n'est pas obligatoire d'obtenir ces deux alignements durant le même
tour de jeu. Il faut noter qu'un alignement de 5 pions est composé de 2 alignements adjacents de 4 pions et permet donc de gagner la partie directement.
- Chaque joueur dispose durant la partie d'un (et un seul) coup spécial, qui
consiste à "renverser" la grille de jeu (i.e. effectuer une symétrie verticale) APRES avoir inséré son pion sur une des colonnes. La gravité
s'applique évidemment lorsque la grille est renversée et les pions viennent donc se repositionner en bas de leur colonne respective. Il faut noter qu'un
alignement de 4 pions existant peut se retrouver détruit en jouant un tel coup
spécial, et ne sera donc plus comptabilisé au crédit du joueur concerné.
Du point de vue de l'implémentation, les deux difficultés algorithmiques
concernent d'une part, la détection des alignements de 4 pions, et d'autre
part, la mise en oeuvre du renversement de la grille. Si l'on représente
le pion du joueur A par la valeur 1, le pion du joueur B par la valeur -1,
et une case vide par la valeur 0, il est possible de détecter un alignement
simplement en faisant la somme des valeurs de 4 cases adjacentes, puisque
cette somme vaudra 4 pour un alignement du joueur A, et -4 pour un alignement
du joueur B. Sur une grille 7x6, le nombre d'alignements possibles est facile
à calculer: 24 alignements horizontaux, 21 alignements verticaux et 24
alignements diagonaux. On peut donc identifier une fois pour toute, la liste
des alignements impliqués pour chacune des 42 cases de la grille, et
créer un lien entre les deux, ce qui permettra une détection des alignements très efficace.
Pour obtenir un historique des
parties jouées, on implémentera une sauvegarde sur fichier des 10 meilleurs
scores réalisés (nombre de coups pour gagner) pour chacune des configurations de jeu (dépendant
de la taille de la grille).
Projet 3 : Visualisation de parties d'échecs
Le jeu d'échecs est très certainement le jeu de stratégie qui a été le plus
étudié parmi tous les jeux de société. Pour archiver les parties jouées ou
retranscrire les études théoriques sur les différentes positions, un standard
international pour le stockage informatique a été défini : le format PGN
(Portable Game Notation) qui est décrit en détail sur cette
page
Wikipedia. Le format PGN est un simple fichier texte décomposé en 2
parties: une entête qui donne des informations générales telles que les noms
des joueurs, la date et le lieu de la partie, et un corps qui donne la séquence
des coups joués, en incluant des commentaires sous une forme normalisée,
parfois accompagnés de l'étude d'une ou plusieurs variantes des coups possibles
pour certaines positions. La page Wikipedia cité ci-dessus donne deux exemples
du contenu habituel d'un fichier PGN. Il faut noter qu'un même fichier PGN peut
contenir plusieurs parties, simplement en les concaténant les unes derrière les
autres. Il existe sur le web de nombreux sites stockant parfois plusieurs
dizaines de milliers de parties d'échecs retranscrites au format PGN. Par
exemple, le site PGN
Mentor propose de nombreux fichiers contenant chacun plusieurs
centaines de parties, classés par joueur ou par tournoi.

L'objectif du projet est d'écrire un programme chess
qui permet de lire un fichier PGN, fourni par l'utilisateur, et de visualiser
la (ou les) partie(s) qu'il contient, soit coup par coup, soit sous la forme
d'une animation automatique. Le choix des options de visualisation, des
commandes d'interaction, ainsi que de l'organisation de la fenêtre graphique
est laissé totalement libre. Vous pouvez vous inspirer du mode "view"
disponible sur le site PGN Mentor mentionné ci-dessus, qui donne une bonne
illustration du type d'interface souhaitée pour le projet. Pour la
visualisation de l'échiquier, l'utilisation de la widget "Canvas" est
conseillée, car elle permet de simplifier l'animation du déplacement des pièces
entre la case de départ et la case d'arrivée. Enfin, pour la représentation
graphique des pièces d'échecs, il existe de nombreuses collections d'images sur
le web. On fournit une archive chess.zip
qui contient les images, au format PNG, des 12 pièces différentes nécessaires
(cf. image ci-dessus), mais vous pouvez évidemment en utiliser une autre, voire
permettre à l'utilisateur de choisir entre plusieurs thèmes pour le design des
pièces affichées.
Exemples à relire avant de commencer le projet :
- Exemple C7A_canvas.py (pour l'utilisation générale de la widget Canvas)
- Exemple B2A_txtfile.py (pour la lecture/écriture de fichiers texte)
- Exemple C4B_random.py (pour l'utilisation de la widget Entry)
- Exemple C5D_win.py (pour l'utilisation du sélecteur de fichier)
Projet 4 : Tracé de trochoïdes
Dans sa définition la plus générale, une "trochoïde" est une
courbe 2D qui représente le mouvement d'un point situé sur un cercle qui roule
(sans glissement) le long d'une autre forme géométrique. Parmi ces courbes, il
existe deux familles particulièrement intéressantes obtenues lorsque le cercle
roule à l'extérieur ou à l'intérieur d'un autre cercle (on parle respectivement
d'épitrochoïdes et d'hypotrochoïdes). Ces deux familles de
courbes ont été popularisées pour le grand public par le jeu Spirograph inventé au milieu des années 1960.
La page Wikipedia consacrée au
Spirograph fournit quelques informations sur les équations paramétriques
permettant de décrire la forme d'une trochoïde, mais le plus simple est d'aller
directement sur les pages Wikipedia concernant les
épitrochoïdes et les
hypotrochoïdes qui présentent les différentes formes de ces équations
paramétriques. De même, une application proche de celle qui est demandée dans
ce projet, peut être testée en ligne sur
ArtByLogic. Une version plus complexe, permettant de généraliser le
principe avec un nombre arbitraire de cercles, est accessible sur
SeedCode
Le but du projet est d'écrire un programme
Spiro, basé sur une widget Canvas,
permettant la création interactive de telles figures géométriques. Le mode
opératoire souhaité doit permettre à l'utilisateur de choisir les paramètres
de la trochoïde. Au minimum, il faut définir la taille et la position du
cercle fixe, la taille et la position initiale du cercle mobile (qui peut
être à l'intérieur ou à l'extérieur du cercle fixe) et enfin, la position du
point dont on veut tracer le mouvement. Une fois les paramètres spécifiés, le
programme n'a plus qu'à évaluer les équations paramétriques en faisant varier
le paramètre t pour obtenir un tracé de la courbe résultante. Pour
augmenter la complexité des courbes, au lieu d'utiliser des paramètres fixes,
on peut fournir pour chaque paramètres une borne supérieure et une borne
inférieure et faire varier (avec une vitesse à définir) la valeur de chaque
paramètre entre ces deux bornes au cours du tracé.
Le choix des options de visualisation, des commandes d'interaction, ainsi
que de l'organisation de la fenêtre graphique est laissé totalement libre.
Néanmoins, on peut énumérer un certain nombre de fonctionnalités qu'il serait
souhaitable d'y voir figurer :
- Définir la couleur du tracé, et éventuellement son
épaisseur ou son type (trait continu, tirets, pointillés, etc)
- Permettre de tracer plusieurs trochoïdes en superposition, en faisant
varier progressivement le point de départ entre deux positions-limites
définies par l'utilisateur
- Remplacer le cercle fixe par d'autres formes géométriques
- et bien sûr, n'hésitez pas à rajouter au programme toute fonctionnalité
qui vous semblerait intéressante...
Exemples et Exercices conseillés pour servir de point de départ :
- Exemple C4A_random.py (pour l'utilisation des widgets Scale)
- Exemple C4B_random.py (pour l'utilisation des widgets Entry)
- Exemple C7A_canvas.py (pour l'utilisation de la widget Canvas et
notamment la gestion du tracé de courves dans un Canvas)
Philippe Blasi