Le tournoi PyRat
Durée2h30 + préparationObjectifs de la séance
Après l’examen final, un créneau horaire est dédié à un tournoi PyRat. Il se déroulera après les vacances, pour vous laisser un peu de temps si vous voulez peaufiner votre IA.
Pour ce tournoi, vous devrez concevoir un programme PyRat pour affronter un adversaire. Le joueur qui ramasse le plus de morceaux de fromage remporte la partie !
Cet événement est facultatif et non-évalué, conçu uniquement pour vous amuser.

Voici quelques vidéos réalisées depuis la création du cours PyRat ! Certaines sont plus « commerciales » que d’autres, mais elles offrent un aperçu de l’ambiance pendant le tournoi, ainsi que des versions plus anciennes du jeu !
Organisation du tournoi
Deux phases
Malheureusement, nous n’aurons pas le temps de faire concourir tout le monde dans le tournoi final. Par conséquent, nous procéderons sous forme de poules, dans lesquelles tous les programmes s’affronteront deux à deux, chaque rencontre se jouant en deux manches gagnantes (au plus 3 parties). Les points sont attribués comme suit :
- L’équipe qui gagne une rencontre marque l’écart entre les nombres de parties gagnées, plus 1 : 3 points pour une victoire 2 à 0, et 2 points pour une victoire 2 à 1. L’équipe qui perd ne marque rien.
- Si les deux équipes ont gagné autant de parties (par exemple, si des parties se terminent sur un match nul), la rencontre revient à celle dont le temps de calcul total est le plus faible, qui marque 1 point. En cas d’égalité parfaite (même temps de calcul), la rencontre est attribuée par tirage au sort.
Dans chaque poule, nous conserverons les deux meilleurs programmes, c’est-à-dire, ceux avec le plus grand nombre de points. En cas d’égalité de points, nous considérerons comme meilleur programme celui avec le temps de calcul total le plus faible sur les rencontres gagnées.
Une fois les vainqueurs des poules déterminés (soit 16 programmes ; s’il y a peu d’équipes inscrites, le nombre de poules est réduit), le tournoi lui-même aura lieu en amphithéâtre le 4 janvier 2027. Les matchs seront déterminés aléatoirement. Les poules étant jouées avant cette date, les programmes doivent être soumis au plus tard le 2 janvier 2027 au soir (voir comment participer).
Le/La gagnant(e) du tournoi remportera un trophée, et son IA servira de boss final pour les étudiant(e)s de l’année suivante !

Paramètres de PyRat
Les options suivantes seront utilisées pour créer les parties PyRat :
maze_width: 25.maze_height: 20.cell_percentage: 80.0.wall_percentage: 60.0.mud_percentage: 20.0.mud_range: [4, 9].nb_cheese: 41.preprocessing_time: 3.0.turn_time: 0.1.game_mode:GameMode.MATCH(chaque joueur tourne dans son propre processus ; un joueur qui dépassepreprocessing_timeouturn_timesaute des tours jusqu’à la fin de son calcul).continue_on_error:True(si votre code lève une exception, la partie continue et votre joueur ne fait rien à ce tour).
Voici le script de jeu que nous utiliserons pour le tournoi.
Le script prépare lui-même chaque équipe à partir de son dépôt : il clone le dépôt au commit indiqué, crée son environnement avec uv sync (à partir de votre pyproject.toml et de votre uv.lock), puis fait jouer votre joueur dans cet environnement, depuis la racine de votre dépôt. Votre joueur peut donc importer les autres fichiers de votre dépôt (par exemple from utils.traversal.dijkstra_traversal import DijkstraTraversal), et utiliser les bibliothèques que vous avez ajoutées avec uv add. Seule la version de PyRat est imposée : c’est celle du tournoi, pour toutes les équipes.
Pour le tester chez vous :
-
Copiez
tournament.pydans le dossiergamesde votre workspace. -
Ajoutez la ligne
tournament_files/au fichier.gitignorede votre workspace : ce dossier contient les copies des dépôts et les résultats, qui ne doivent pas être envoyés sur GitLab. -
Créez le fichier
tournament_files/teams.csvà la racine de votre workspace, qui liste les équipes, par exemple :Chaque ligne donne le nom de l’équipe, l’adresse de son dépôt (ici
., c’est-à-dire votre propre workspace), le commit à utiliser (iciHEAD, le dernier commit), et le chemin du fichier du joueur dans le dépôt. Vous pouvez aussi faire jouer votre joueur contre une version plus ancienne de lui-même (en indiquant l’identifiant d’un ancien commit), ou contre le dépôt d’une autre équipe. -
Lancez
uv run games/tournament.pydepuis le workspace. Le script prépare d’abord les équipes, et signale tout problème (commit introuvable, fichier absent, joueur qui ne se charge pas) ;uv run games/tournament.py --prepare-onlys’arrête après cette étape. Les parties sont ensuite sauvegardées danstournament_files/results/, et ce qu’affiche chaque joueur (y compris ses erreurs) danstournament_files/logs/<équipe>.log.
Attention : le script utilise votre dépôt tel qu’il est dans le commit indiqué. Les modifications que vous n’avez pas commitées ne sont donc pas prises en compte, exactement comme lors du tournoi.
Important
Le fichier de votre joueur doit définir une seule sous-classe non abstraite de Player : c’est celle que le script instancie. Les autres classes dont il a besoin (une classe parente, des classes de utils…) peuvent être dans d’autres fichiers de votre dépôt, qu’il importe.
Votre joueur sera instancié avec pour seul argument le mot-clé skin (par exemple MonJoueur(skin=PlayerSkin.RAT)) : votre constructeur doit donc accepter *args et **kwargs et les transmettre à super().__init__(...), comme dans template_player.py. Ainsi, assurez-vous de définir des valeurs par défaut dans votre constructeur si vous utilisez des arguments supplémentaires.
Donnez aussi à votre joueur un nom personnalisé, propre à votre équipe : par défaut, son nom est celui de sa classe, et le script du tournoi refuse de démarrer si deux joueurs portent le même nom. Spécifiez-le comme suit :
Comment participer ?
La participation se fait comme pour les livrables du projet (voir la séance 3) : votre joueur doit se trouver sur le dépôt GitLab de votre équipe, et vous nous indiquez sur Moodle la version à utiliser. La date limite est fixée au 2 janvier 2027 au soir (l’heure précise est indiquée sur Moodle), et non au jour du tournoi : il nous faut ce délai pour jouer les poules avant le tournoi du 4 janvier.
Comment s’inscrire
-
Placez le joueur qui participera au tournoi dans le dossier
playersde votre dépôt. Il peut importer les autres fichiers de votre dépôt (utils, d’autres joueurs…), comme vos joueurs du projet : le tournoi utilise votre dépôt complet, au commit que vous indiquez. Le fichier du joueur ne doit définir qu’une seule sous-classe non abstraite dePlayer(voir plus haut). Si votre joueur a besoin de bibliothèques autres que PyRat, ajoutez-les avecuv add, et commitez les fichierspyproject.tomletuv.lock: c’est à partir d’eux que l’environnement de votre équipe est créé. -
Ajoutez un script de jeu dans le dossier
games(par exemplegames/visualize_tournament_player.py), qui lance une partie avec votre joueur et les paramètres du tournoi donnés plus haut. Inspirez-vous de vos scriptsvisualize_xxx.py. -
Ajoutez la section suivante au début du fichier
README.mdde votre projet (remplacez les éléments entre chevrons<...>(chevrons inclus) par ce qui est demandé) : -
Vérifiez bien que vous avez envoyé tous vos codes et le
README.mdsur le dépôt GitLab de votre équipe. -
Assurez-vous que votre enseignant(e) est bien membre de votre dépôt GitLab avec le rôle Maintainer, comme demandé lors de la séance 1.
-
Un(e) membre de l’équipe doit se connecter sur Moodle, et fournir :
- Votre campus.
- L’emplacement du fichier contenant votre joueur sur le dépôt.
- Le nom choisi pour votre équipe.
- L’URL HTTPS de clonage de votre dépôt GitLab :

- L’identifiant du commit à utiliser pour le tournoi :

Important
Veuillez vous assurer que votre programme fonctionne, en le testant avec le script tournament.py comme expliqué plus haut, à partir du commit que vous indiquerez sur Moodle : c’est la meilleure façon de vérifier que ce commit contient tous les fichiers nécessaires. Nous aurons de nombreux matchs à effectuer pour les poules, donc nous ne pouvons pas perdre trop de temps à demander des fichiers manquants.
Comme pour les livrables, ne mettez sur votre dépôt que ce qui est nécessaire : pas d’environnement virtuel, ni de fichiers temporaires, ni le dossier tournament_files.