Académique Documents
Professionnel Documents
Culture Documents
DÉPARTEMENT D’INFORMATIQUE
Présentation générale
Le projet en une phrase
L’objectif du projet est de réaliser une implémentation en Python 3 du jeu Slideways, une
variante des jeux OXO (tic-tac-toe) et Puissance 4.
Le jeu Slideways
Slideways est un jeu deux joueurs 1 inventé par Tricia McLaughlin, professeure d’arts plas-
tiques au SUNY College at Old Westbury, dans l’état de New York. Le jeu est commercialisé par
R&R Games depuis 2015.
1. Il y a également une variante trois joueurs mais celle-ci ne sera pas considérée dans ce projet
- 1 / 15 -
http://uv.ulb.ac.be → INFO-F-106
Info-F-106 : Projet d’Informatique
Un joueur peut changer la couleur d’une case pour y mettre sa couleur, par-exemple :
Une spécificité du plateau est qu’une rangée (ligne) peut être déplacée vers la gauche ou vers
la droite, d’un, deux, ou trois crans par rapport à sa position de départ :
Pour gagner, un joueur doit alligner quatre cases de sa couleur, horizontalement, verticale-
ment, ou en diagonale. Voici par exemple une situation gagnante pour le joueur rouge :
Les deux joueurs jouent tour à tour. Lors de son tour, un joueur doit effectuer une des deux
actions suivantes :
— choisir une case et changer la couleur de cette case dans sa propre couleur, ou
— déplacer une rangée d’un cran (vers la gauche ou vers la droite).
Quelques précisions : Le joueur peut choisir de changer la couleur de n’importe quelle case, du
moment qu’elle ne soit pas déjà de sa couleur, et que la case en question ne vient pas d’être
changée par le joueur adverse (on ne peut pas ‘annuler’ le coup qui vient d’être joué par le
joueur adverse). Le joueur peut déplacer n’importe quelle rangée d’un cran, du moment que le
mouvement soit possible pour la rangée en question (maximum 3 crans à gauche/droite de la
position de départ) et que cela n’annule pas le coup qui vient d’être joué par le joueur adverse.
Par exemple, si le joueur adverse vient de déplacer la deuxième rangée d’un cran vers la gauche,
on ne peut pas la redéplacer d’un cran vers la droite.
Les règles officielles du jeu (en anglais) sont disponibles au lien suivant : https://rnrgames.
com/Content/RRGames/files/952.pdf, les illustrations ci-dessus sont extraites de ces règles.
Organisation
Pour toute question portant sur ce projet, n’hésitez pas à rencontrer le titulaire du cours ou
la personne de contact de la partie concernée.
Consignes générales
— L’ensemble du projet est à réaliser en Python 3.
— Le projet est organisé autour de quatre grandes parties
— En plus de ces quatre parties à remettre, chaque étudiant devra remettre un rapport final
et préparer une présentation orale d’environ 6 minutes, ces présentations se dérouleront
fin avril.
— Chacune des quatre parties du projet compte pour 20 points. Le rapport et la présentation
comptent également pour 20 points en tout, ce qui fait un total de 100 points.
— Chacune des quatres grandes parties devra être remise sur GitHub Classroom.
— Après chacunes des trois premières parties, un correctif sera proposé. Vous serez libre de
continuer la partie suivante sur base de ce correctif mais nous vous conseillons de plutôt
continuer avec votre travail en tenant compte des remarques qui auront été faites.
— Les « Consignes de réalisation des projets » (cf. http://www.ulb.ac.be/di/consignes_
projets_INFO1.pdf) sont d’application pour ce projet individuel. (Exception : Ne tenez
pas compte des consignes de soumission des fichiers, des consignes précises pour la sou-
mission via GitHub Classroom seront données). Vous lirez ces consignes en considérant
chaque partie de ce projet d’année comme un projet à part entière. Relisez-les régulière-
ment !
— Si vous avez des questions relatives au projet (incompréhension sur un point de l’énoncé,
organisation, etc.), n’hésitez pas à contacter le titulaire du cours ou la personne de contact
de la partie concernée, et non votre assistant de TP.
— Il n’y aura pas de seconde session pour ce projet !
Soumission de fichiers
La soumission des fichiers se fait via un repository individuel par partie du projet sur la
plateforme GitHub Classroom. Le lien pour s’inscrire au projet sur GitHub Classroom ainsi
que des explications concernant l’utilisation de l’outil Git sont disponibles sur les slides de
présentation de Git / GitHub Classroom sur l’UV.
Une remarque concernant les retards : Contrairement à la remise de projets pour d’autres de
vos cours d’informatique, il n’est ici pas possible de remettre une de vos parties en retard. Le
système de versioning offert par Git vous permet de constamment mettre à jour la version de
votre code sur le serveur de GitHub Classroom. Vous êtes d’ailleurs fortement encouragé à
le faire régulièrement lorsque vous travaillez sur une partie. Cela vous permet à vous de garder
une copie de chaque version intermédiaire de votre travail, et cela nous permet à nous, en tant
qu’enseignants, d’avoir une idée de la régularité de votre travail. Pour l’evaluation d’une partie,
vous ne devez pas indiquer quelle est la version "finale" de votre code, nous prendrons simplement
la dernière version uploadée sur le repository avant la date et heure limite (toute version uploadée
après sera ignorée).
Objectifs pédagogiques
Ce projet transdisciplinaire permettra de solliciter vos compétences selon différents aspects.
— Des connaissances vues aux cours de programmation, langages, algorithmique ou mathé-
matiques seront mises à contribution, avec une vue à plus long terme que ce que l’on
retrouve dans les divers petits projets de ces cours. L’ampleur du projet requerra une
analyse plus stricte et poussée que celle nécessaire à l’écriture d’un projet d’une page,
ainsi qu’une utilisation rigoureuse des différents concepts vus aux cours.
— Des connaissances non vues aux cours seront nécessaires, et les étudiants seront invités à
les étudier par eux-mêmes, aiguillés par les tuyaux fournis par l’équipe encadrant le cours.
Il s’agit entre autres d’une connaissance de base des interfaces graphiques en Python 3.
— Des compétences de communication seront également nécessaires : à la fin de la partie 4, les
étudiants remettront un rapport expliquant leur analyse, les difficultés rencontrées et les
solutions proposées. Une utilisation correcte des outils de traitement de texte (utilisation
des styles, homogénéité de la présentation, mise en page, etc.) sera attendue de la part
des étudiants. Une orthographe correcte sera bien entendu exigée.
— En plus d’un rapport, les étudiants prépareront une présentation orale, avec transpa-
rents ou slides (produits par exemple avec LATEX, LibreOffice Impress, Microsoft
PowerPoint), ainsi qu’une démonstration du logiciel développé. À nouveau, on atten-
dra des étudiants une capacité à présenter et à vulgariser leur projet (c’est-à-dire rendre
compréhensible leur présentation pour des non informaticiens, ou en tout cas pour des étu-
diants ayant eu le cours de programmation mais n’ayant pas connaissance de ce projet-ci).
En résumé, on demande aux étudiants de montrer qu’ils sont capables d’appliquer des
concepts vus aux cours, de découvrir par eux-mêmes des nouvelles matières, et enfin de commu-
niquer de façon scientifique le résultat de leur travail.
Bon travail !
4 _ _ _ _
3 _ _ O _
2 _ X X O
1 _ _ _ _
A B C D
Les cases seront numérotées selon la convention des échecs, c’est-à-dire lettre de la colonne
suivie du numéro de la ligne. Par-exemple, la case A4 correspond à la case tout en haut à gauche
du plateau.
à l’écran. Une fois qu’un joueur a gagné, un message de victoire est indiqué à l’écran après
le dernier affichage du plateau et avant de quitter la fonction.
Pour rappel, les cases du plateau sont représentées par des chaînes de deux caractères : une
lettre indiquant la colonne suivie d’un chiffre indiquant la ligne, sans espace, convention
qu’il faudra strictement respecter. Par exemple, la case en haut à gauche du plateau est
notée ‘A4’, et non ‘A 4’, ‘ A4’, ‘A-4’, etc. Si un utilisateur encode une case invalide (format
invalide, case en dehors du plateau, case appartenant déjà au joueur, case qui vient d’être
jouée au coup précédent), le programme devra afficher un message d’erreur expliquant
la raison du refus du coup et redemander une case à l’utilisateur jusqu’à ce que celui-
ci en renseigne une valide. Aucune commande ne doit être prévue pour permettre aux
utilisateurs de quitter la partie prématurément.
— afficher(plateau) return None :
Cette fonction prend en paramètre le plateau de jeu et devra l’afficher à l’écran. Le plateau
affiché doit être clair et indiquer les numéro des lignes et des colonnes en face de chacune
de celles-ci comme expliqué ci-dessus.
Nous vous demandons également d’effacer le contenu du terminal avant chaque affichage.
La commande système permettant de faire cela dépend de l’OS : clear sur les machines
de type Unix (Linux, Mac OS X, Android), cls sous Windows.
Vous pouvez faire l’hypothèse que les correcteurs utiliseront une machine du premier type
et simplement utiliser la commande clear. Vous pouvez aussi décider de rendre votre
programme indépendant de l’OS (voir plus loin).
Afin d’appeler une commande système dans un programme python, vous devrez importer
la librairie os 2 dans votre programme et utiliser une de ses fonctions :
os.system(<commande>)
où <commande> doit être remplacé par la commande système que vous voulez appeler.
Si vous souhaitez rendre votre programme portable sur différents systèmes d’exploita-
tion, vous pouvez obtenir des informations sur l’OS que vous êtes en train d’utiliser via
l’instruction :
os.name
Cette fonction va par-exemple retourner "posix" si vous êtes sur Linux ou Mac OS X, et
"nt" dans le cas où vous utilisez Windows.
2. https://docs.python.org/3/library/os.html
4 _ _ _ _ 4 _ _ _ _ 4 _ _ _ _
3 _ _ _ _ 3 _ _ _ _ 3 _ _ _ _
2 _ _ _ _ 2 _ X _ _ 2 _ X _ _
1 _ _ _ _ 1 _ _ _ _ 1 _ _ O _
A B C D A B C D A B C D
joueur 1 > B 3
commande invalide
joueur 1 > E3
commande invalide
joueur 1 > B3
4 _ _ _ _ 4 _ _ _ _ 4 _ X _ _
3 _ X _ _ 3 _ X _ _ 3 _ X _ _
2 _ X _ _ 2 _ X _ _ 2 _ X _ _
1 _ _ O _ 1 _ O O _ 1 _ O O _
A B C D A B C D A B C D
joueur 1 > B4
4 _ X _ _ 4 _ X _ _
3 _ X _ _ 3 _ X _ _
2 _ X _ _ 2 _ X _ _
1 O O O _ 1 O X O _
A B C D A B C D
Remarques importantes :
— Il n’y a aucun retard possible, GitHub Classroom n’acceptera aucun commit passé cette
heure. La version de votre code qui sera évaluée sera la dernière version sur GitHub
Classroom.
— Si vous rencontrez des problèmes avec l’utilisation de git, nous vous invitons à relire les
slides d’introduction à git disponibles sur l’UV, et à poser vos éventuelles questions qui
subsisteraient aux guidances ou aux assistants. Dans tous les cas, posez vos questions bien
à l’avance, pas deux-trois jours avant l’échéance. Pour rappel, l’usage de git sera évalué,
et en particulier la régularité des commit et push.
— Chaque année, quelques étudiants attendent le dernier moment pour apprendre à utiliser
git, et rencontrent des problèmes avec git le weekend de la remise. Il est inutile d’envoyer
le projet par email et d’expliquer les problèmes rencontrés, seuls les projets remis via
GitHub Classroom seront évalués.
— Faites bien attention à utiliser le lien GitHub Classroom ci-dessus pour créer votre
repository, et à ne pas créer vous-même un repository GitHub standard de votre côté.
Ces derniers sont publics ( !) par défaut, vous partageriez donc votre code avec tous les
internautes, ce qui serait sanctionné d’une note nulle. Nous insistons sur ce dernier aspect
car quelques cas se sont présentés l’année passée lors de la partie 1.
Bon travail !
4 _ O X _
3 _ X X _
2 O _ _ _
1 X _ O _
A B C D
Les cases sont toujours numérotées selon la convention des échecs, c’est-à-dire lettre de la
colonne suivie du numéro de la ligne. Par-exemple, la case A4 correspond à la case tout en haut
à gauche du plateau. La numérotation des cases ne changent pas avec le décalage.
Pour pouvoir afficher le plateau en alignant les cases, nous vous demandons d’écrire les lignes
de la façon suivante : print(’{:>10}’.format(s)) où s est un string quelconque. Ce format
signifie que vous alignez sur la droite d’un string remplis d’espaces de taille 10 le string s. Par
exemple, avec : print(’{:>10}’.format(’test’)), vous obtiendriez "␣␣␣␣␣␣test", donc 6
espaces et votre string de taille 4 test.
Le décalage est encodé sous forme de liste où chaque élément correspond au décalage de
la ligne de l’indice correspondant. Cela veut donc dire que pour l’exemple d’affichage du point
précédent, le vecteur de décalage se présente sous la forme [0,1,-3,3], où la ligne 4 a un décalage
de +3, la ligne 3 de -3, la ligne 2 de +1 et la première ligne n’a aucun décalage. Il est important
de noter que le décalage sera une valeur entre -3 et 3 compris.
2.3 IA Minimax
Pour cette partie, nous allons implémenter une intelligence artificielle qui va suivre le principe
de l’algorithme Minimax, un algorithme récursif.
Selon l’état d’un plateau, on trouve le meilleur état en simulant tous les scénarios possibles
et en choisissant le meilleur scénario. Le meilleur scénario est celui avec la meilleure situation
finale en assumant que :
— on fait toujours le meilleur mouvement pour maximiser son score et
— l’adversaire fait toujours le mouvement qui est le meilleur pour eux (et donc le pire pour
nous), minimisant notre score.
Ce principe de maximisation et de minimisation est la raison pour laquelle l’algorithme
se nomme ainsi.
Vous devez également ajouter le coup de décalage, représenté par le numéro de la ligne
avec le signe ’+’ ou ’-’ pour représenter respectivement le décalage d’un cran vers la
droite ou vers la gauche. Le programme doit afficher un message d’erreur et demander
un nouveau coup si le joueur entre un coup qui annule le décalage. Par exemple, pour le
coup ’1+’ qui est de bouger la première ligne vers la droite, on interdit le coup opposé
lors du prochain tour qui est ’1-’. Le décalage aura pour effet de changer la valeur de
l’élément à l’indice de la ligne décalée dans la liste gardant en mémoire les décalages.
Il est important de noter qu’il est maintenant possible d’avoir une égalité entre les
deux joueurs (et donc match nul), si suite à un décalage les deux joueurs gagnent
simultanement. Vous allez donc devoir réfléchir à comment vérifier les diagonales, les
colonnes et les lignes en fonction des décalages.
étudier un coup de l’AI, suivant d’une simulation d’un coup humain, et renvoyer le coup
et le score attaché au plateau obtenu après ces deux coups. La fonction renvoie un tuple
contenant en premier le string du meilleur coup pour le joueur (ou None) et le score de
type entier rattaché à ce coup (ou au dernier coup joué). C’est un algorithme récursif, ce
qui signifie que la fonction s’appelle elle-même en modifiant ces paramètres.
Lorsqu’il y a plusieurs coups avec le même meilleur score, la fonction va renvoyer un des
tuples (coup,score) au hasard grâce à la librairie random.
Pour copier votre plateau et le vecteur de décalage, vous avez le droit d’utiliser la fonction
deepcopy de la librairie copy.
Remarques importantes :
— Il n’y a aucun retard possible, GitHub Classroom n’acceptera aucun commit passé cette
heure. La version de votre code qui sera évaluée sera la dernière version sur GitHub
Classroom.
— Si vous rencontrez des problèmes avec l’utilisation de git, nous vous invitons à relire les
slides d’introduction à git disponibles sur l’UV, et à poser vos éventuelles questions qui
subsisteraient aux guidances ou aux assistants. Dans tous les cas, posez vos questions bien
à l’avance, pas deux-trois jours avant l’échéance. Pour rappel, l’usage de git sera évalué,
et en particulier la régularité des commit et push.
— Chaque année, quelques étudiants attendent le dernier moment pour apprendre à utiliser
git, et rencontrent des problèmes avec git le weekend de la remise. Il est inutile d’envoyer
le projet par email et d’expliquer les problèmes rencontrés, seuls les projets remis via
GitHub Classroom seront évalués.
— Faites bien attention à utiliser le lien GitHub Classroom ci-dessus pour créer votre
repository, et à ne pas créer vous-même un repository GitHub standard de votre côté.
Ces derniers sont publics ( !) par défaut, vous partageriez donc votre code avec tous les
internautes, ce qui serait sanctionné d’une note nulle. Nous insistons sur ce dernier aspect
car quelques cas se sont présentés l’année passée lors de la partie 1.
Bon travail !