Vous êtes sur la page 1sur 15

FACULTÉ DES SCIENCES

DÉPARTEMENT D’INFORMATIQUE

Info-F-106 : Projet d’Informatique


Slideways
Jérôme De Boeck Gwenaël Joret Charlotte Nachtegael Robin Petit
Cédric Simar
version du 12 novembre 2019

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.

Les étapes de développement


La réalisation du projet est découpée en quatre parties, chacune s’étalant sur environ un mois.
Voici un résumé de ce qui sera développé dans chacune de celles-ci :
— Partie 1 : Jeu simplifié, affichage en terminal
— Partie 2 : Jeu complet + IA basique, affichage en terminal
— Partie 3 : Réalisation d’une interface graphique pour le jeu à l’aide de la librairie PyQt.
— Partie 4 : Différentes améliorations au choix de l’étudiant(e), créativité encouragée.

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

La mécanique du jeu est inspirée du tic-tac-toe (souvent appelé OXO en Belgique) et du


Puissance 4. Il y a un joueur rouge et un joueur jaune. Le plateau de jeu est un plateau 4 × 4,
chaque case pouvant être soit rouge, soit jaune, soit bleue. Initialement, toutes les cases sont
bleues :

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).

http://uv.ulb.ac.be → INFO-F-106 - 2 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique

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.

Titulaire. Gwenaël Joret – gjoret@ulb.ac.be – O8.111


Assistants.
Partie 1 : Jérôme De Boeck – jdeboeck@ulb.ac.be – N3.207
Partie 2 : Charlotte Nachtegael – charlotte.nachtegael@ulb.ac.be – N8.213
Partie 3 : Robin Petit – robpetit@ulb.ac.be – O8.210
Partie 4 : Cédric Simar – cedric.simar@ulb.ac.be – N8.212

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 !

http://uv.ulb.ac.be → INFO-F-106 - 3 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique

Veuillez noter également que le projet vaudra zéro sans exception si :


— le projet ne peut être exécuté correctement via les commandes décrites dans l’énoncé ;
— les noms de fonctions (et de vos scripts) sont différents de ceux décrits dans cet énoncé,
ou ont des paramètres différents ;
— à l’aide d’outils automatiques spécialisés, nous avons détecté un plagiat manifeste (entre
les projets de plusieurs étudiants, ou avec des éléments trouvés sur Internet). Insistons
sur ce dernier point car l’expérience montre que chaque année une poignée d’étudiants
pensent qu’un petit copier-coller d’une fonction, suivi d’une réorganisation du code et de
quelques renommages de variables passera inaperçu... Ceci sera sanctionné d’une note nulle
pour toutes les personnes impliquées, sans discussion possible. Afin d’évitez ce genre de
situations, veillez en particulier à ne pas partager de bouts de codes sur forums, Facebook,
etc.

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.

http://uv.ulb.ac.be → INFO-F-106 - 4 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique

— 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.

Conseil concernant la rédaction du rapport


— Il n’est pas obligatoire d’utiliser LATEX pour votre rapport et vos slides mais c’est encouragé
car c’est un outil que vous devrez maîtriser par la suite (au minimum pour écrire votre
mini-mémoire de bachelier et votre mémoire de master) et qui demande un certain temps
d’apprentissage.

Bon travail !

http://uv.ulb.ac.be → INFO-F-106 - 5 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique Partie 1 : Jeu simplifié

1 Partie 1 : Jeu simplifié


La première partie de ce projet permettra d’introduire une architecture de base pour le jeu
Slideways. Le but est de pouvoir jouer une partie à deux joueurs depuis un terminal, avec la
simplification suivante des règles : Pour cette partie 1, il ne sera pas possible de déplacer une
rangée.

1.1 Représentation graphique du plateau dans le terminal


Le plateau de jeu sera représenté graphiquement dans le terminal par une matrice 4 × 4
dans laquelle les cases appartenant au premier joueur sont représentées par la lettre X, celles
appartenant au second joueur par la lettre O, et les cases vides par le caractère _. Ceci correspond
donc aux cases rouges, jaunes, et bleues du jeu original. Les rangées (lignes) seront numérotées
1, 2, 3, 4 de bas en haut, et les colonnes A, B, C, D de gauche à droite, comme sur un échiquier.
Voici un exemple d’affichage à l’écran d’une partie en cours :

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.

1.2 Encodage du plateau en Python


Dans votre code, le plateau de jeu sera encodé sous forme d’une matrice plateau, c’est-à-dire
une liste de listes. Nous utiliserons la convention suivante pour encoder les cases : Pour i entre
0 et 3, plateau[i] représente la ligne (rangée) numéro i + 1, sous forme d’une liste, et pour j
entre 0 et 3, plateau[i][j] représente la case à la (i + 1)-ème ligne et (j + 1)-ème colonne (en
comptant à partir de la gauche). Par-exemple, la case B3 correspond à l’entrée plateau[2][1]
de la matrice. Chaque case est représentée sous-forme d’un entier valant 0, 1 ou 2, selon que la
case est vide, appartienne au premier joueur, ou appartienne au second joueur.

1.3 Fonctions à implémenter


Nous vous demandons d’implémenter les deux fonctions suivantes :
— boucle_jeu() return None :
Cette fonction lance une partie et permet aux deux joueurs de jouer en alternance jusqu’à
ce que l’un d’eux ait gagné. Le premier joueur joue avec le caractère X, le second avec le
caractère O. À chaque fois qu’un joueur doit choisir une case pour y placer sa couleur (son
caractère), l’emplacement souhaité lui est demandé. Le plateau modifié est ensuite affiché

http://uv.ulb.ac.be → INFO-F-106 - 6 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 1.3 Fonctions à implémenter

à 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.

Vous êtes fortement encouragés à découper la fonction boucle_jeu() en d’autres fonctions


afin de rendre votre code propre et lisible. Si vous écrivez des fonctions qui ont pour but de mettre
à jour des objets dynamiques (comme des listes), évitez lorsque cela est possible d’effectuer des
return inutiles. Les bonnes pratiques de programmation du cours INFO-F101 sont d’application.

Ci-dessous un exemple d’exécution du jeu depuis un terminal :

2. https://docs.python.org/3/library/os.html

http://uv.ulb.ac.be → INFO-F-106 - 7 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 1.3 Fonctions à implémenter

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 > B2 joueur 2 > C1 joueur 1 > B2

cette case est déjà de votre couleur

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 2 > B1 joueur 1 > B1 joueur 2 > A1

ce coup vient d’être joué

joueur 1 > B4

http://uv.ulb.ac.be → INFO-F-106 - 8 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 1.4 Consignes de remise

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

joueur 1 > B1 joueur 1 gagnant

1.4 Consignes de remise


Tout d’abord, insistons sur l’importance de respecter toutes les consignes ci-dessus et ci-
dessous : tout manquement aux consignes sera sanctionné d’une note nulle.
Afin de créer votre repository pour votre partie 1 sur GitHub Classroom, vous devrez utiliser
le lien suivant : https://classroom.github.com/a/vPZaAZvl
L’entièreté de votre code doit se trouver dans un fichier partie1.py (avec une première
lettre minuscule). Votre nom, numéro de matricule et section doivent être indiqués en
commentaire au début du fichier partie1.py.
Le jeu doit commencer en lançant la commande python3 partie1.py depuis le dossier conte-
nant votre projet. Veillez à ce que votre fichier puisse être importé, mettez donc l’appel à la
fonction boucle_jeu() dans un test conditionnel if __name__ == ’__main__’:.
À travers l’entièreté de votre projet, veillez à respecter à la lettre la signature des fonc-
tions (nom + paramètres + type de la valeur retournée) ainsi que la casse des caractères (res-
pect des majuscules et minuscules). Un script de test nommé test_partie1.py vous est fourni
dans votre repository GitHub Classroom. Vous pouvez le lancer en tapant simplement python3
test_partie1.py. Ce script testera d’abord votre fonction d’affichage, et ensuite votre boucle de
jeu en faisant jouer la partie donnée en exemple ci-dessus. Vous pouvez donc comparer le résultat
à l’écran avec les screenshots de l’énoncé. Remarque : puisque la fonction afficher(plateau) ef-
face le terminal, pour que vous puissiez voir l’entièreté de l’éxecution du script, il vous faudra soit
rediriger la sortie vers un fichier texte (python3 test_partie1.py > out.txt) soit commenter
la ligne de code qui efface l’écran.
Uploadez régulièrement votre code sur le serveur ! Une bonne habitude est de le faire
systématiquement à la fin de chaque session de travail, par exemple :
git commit -am ’courte description des modifications’
git push

La bonne utilisation de git fait partie de la note de ce projet.

Echéance pour la remise du fichier partie1.py sur GitHub Classroom : dimanche 10


novembre à 22h.

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.

http://uv.ulb.ac.be → INFO-F-106 - 9 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 1.4 Consignes de remise

— 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 !

Personne de contact : Jérôme De Boeck – jdeboeck@ulb.ac.be – N3.204

http://uv.ulb.ac.be → INFO-F-106 - 10 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique Partie 2 : Jeu complet

2 Partie 2 : Jeu complet


La seconde partie du projet consiste en rajouter la possibilité de bouger une rangée d’un cran
vers la gauche ou vers la droite comme mouvement, ainsi qu’une AI basique comme adversaire.

2.1 Représentation graphique du plateau dans le terminal


Comme nous devons pour cette partie représenter également les décalages des lignes, votre
plateau sera représenté ici graphiquement dans le terminal par une matrice 4 × 10 dans laquelle
les cases appartenant au premier joueur sont représentées par la lettre X, celles appartenant au
second joueur par la lettre O, et les cases vides par le caractère _. Ceci correspond donc aux
cases rouges, jaunes, et bleues du jeu original. Les rangées (lignes) seront numérotées 1, 2, 3, 4
de bas en haut, et les colonnes A, B, C, D de gauche à droite, comme sur un échiquier. Voici un
exemple d’affichage à l’écran d’une partie en cours 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 :

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.

2.2 Encodage du plateau et du décalage en Python


Le plateau est gardé sous la forme utilisée lors de la partie 1, donc une liste de listes avec
des entiers entre 0 et 2 compris comme éléments représentant l’occupation ou pas d’une case
par un joueur.

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.

http://uv.ulb.ac.be → INFO-F-106 - 11 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 2.3 IA Minimax

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.

On score l’état du plateau selon le point de vue de l’AI :


— 1 pour une victoire
— -1 pour une défaite
— 0 pour une égalité ou tant que le jeu n’est pas terminé
L’algorithme suit le pseudocode suivant :

function minimax(coup, plateau, profondeur, joueur)


if profondeur == 0 or coup est gagnant then
return (None, score du plateau)
end if
if joueur maximise then
meilleurscore = -1000
meilleurcoup = []
for coup dans les coups possibles do
Copie le plateau
Joue le coup sur le nouveau plateau
score = minimax(coup, nouveauplateau, profondeur - 1, FALSE)
if meilleurscore < score then
meilleurscore = score
meilleurcoup = [(coup,score)]
else if meilleurscore == score then
Ajoute le coup dans les meilleurs coups
end if
end for
else
meilleurscore = 1000
meilleurcoup = []
for coup dans les coups possibles do
Copie le plateau
Joue le coup sur le nouveau plateau
score = minimax(coup, nouveauplateau, profondeur - 1, TRUE)
if meilleurscore > score then
meilleurscore = score
meilleurcoup = [(coup,score)]
else if meilleurscore == score then

http://uv.ulb.ac.be → INFO-F-106 - 12 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 2.4 Fonctions à modifier

Ajoute le coup dans les meilleurs coups


end if
end for
end if
return Un des meilleurs mouvements pris au hasard
end function

2.4 Fonctions à modifier


Nous vous demandons de modifier les deux fonctions suivantes de la partie 1 :

— boucle_jeu() return None :


Cette fonction vous permet de lancer la boucle du jeu. Vous allez devoir y intégrer l’AI
de telle façon à ce que l’AI joue le joueur 2 et l’humain le joueur 1. En alternance, vous
allez pouvoir jouer votre coup en tant qu’humain, afficher le plateau, puis avoir l’AI jouer
son coup en suivant l’algorithme minimax et afficher le plateau, et ainsi de suite jusqu’à
ce qu’il y ait un gagnant.

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.

— afficher(plateau, decalage) return None :


Vous devez adapter la fonction pour afficher le plateau avec les décalages. En particulier
la signature de la fonction change par rapport à la partie 1 : il faut ici également prendre
la liste decalage des décalages en paramètre.

2.5 Fonctions à implémenter


Nous vous demandons d’implémenter deux fonctions :

— coup_AI(plateau, decalage, joueur, coup) return None :


Cette fonction va modifier le plateau et le vecteur de décalage en fonction du coup et du
joueur reçus en paramètres. Le paramètre joueur est un entier représentant le joueur 1 ou
2 et coup est le string représentant le coup à effectuer. Elle va vous permettre de simuler
les coups lorsque l’AI doit prendre sa décision pour son coup.

— minimax(plateau, decalage, dernier_coup, profondeur=2, maxi=True) return


(coup,score) Cette fonction implémente l’algorithme de minimax décrit un peu plus
haut. On commence toujours par une profondeur valant 2, ce qui signifie que l’on va

http://uv.ulb.ac.be → INFO-F-106 - 13 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 2.6 Consignes de remise

é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.

2.6 Consignes de remise


Tout d’abord, insistons sur l’importance de respecter toutes les consignes ci-dessus et ci-
dessous : tout manquement aux consignes sera sanctionné d’une note nulle.
Afin de créer votre repository pour votre partie 2 sur GitHub Classroom, vous devrez utiliser
le lien suivant : https://classroom.github.com/a/_x8iEte5
L’entièreté de votre code doit se trouver dans un fichier partie2.py (avec une première
lettre minuscule). Votre nom, numéro de matricule et section doivent être indiqués en
commentaire au début du fichier partie2.py.
Le jeu doit commencer en lançant la commande python3 partie2.py depuis le dossier conte-
nant votre projet. Veillez à ce que votre fichier puisse être importé, mettez donc l’appel à la
fonction boucle_jeu() dans un test conditionnel if __name__ == ’__main__’:.
À travers l’entièreté de votre projet, veillez à respecter à la lettre la signature des fonc-
tions (nom + paramètres + type de la valeur retournée) ainsi que la casse des caractères (res-
pect des majuscules et minuscules). Un script de test nommé test_partie2.py vous est fourni
dans votre repository GitHub Classroom. Vous pouvez le lancer en tapant simplement python3
test_partie2.py. Ce script testera votre fonction pour simuler un coup lors des simulations de
l’AI et puis testera votre fonction d’affichage. Vous pouvez donc comparer le résultat à l’écran
avec les screenshots de l’énoncé. Remarque : puisque la fonction afficher(plateau) efface le
terminal, pour que vous puissiez voir l’entièreté de l’éxecution du script, il vous faudra soit redi-
riger la sortie vers un fichier texte (python3 test_partie2.py > out.txt) soit commenter la
ligne de code qui efface l’écran.
Uploadez régulièrement votre code sur le serveur ! Une bonne habitude est de le faire
systématiquement à la fin de chaque session de travail, par exemple :
git commit -am ’courte description des modifications’
git push
La bonne utilisation de git fait partie de la note de ce projet.

Echéance pour la remise du fichier partie2.py sur GitHub Classroom : dimanche 15


décembre à 22h.

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.

http://uv.ulb.ac.be → INFO-F-106 - 14 / 15 - 12 novembre 2019


Info-F-106 : Projet d’Informatique 2.6 Consignes de remise

— 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 !

Personne de contact : Charlotte Nachtegael – Charlotte.Nachtegael@ulb.ac.be –


N8.213

http://uv.ulb.ac.be → INFO-F-106 - 15 / 15 - 12 novembre 2019

Vous aimerez peut-être aussi