程序代写代做代考 chain html cache graph INF101 : Projet – Le Scrabble

INF101 : Projet – Le Scrabble
Ce projet a pour but de d ́evelopper un jeu de Scrabble. Les ́etapes sont plus ou moins guid ́ees. Les premi`eres sections conduisent `a un programme basique permettant `a des joueurs humains de s’affronter avec une interface textuelle. Les sections suivantes sugg`erent des am ́eliorations (interface graphique, aide de jeu, joueur informatis ́e…). Vous pouvez ajouter autant d’am ́eliorations que vous le souhaitez pour vous rapprocher des r`egles compl`etesa du jeu, dont seule une version simplifi ́ee est consid ́er ́ee ici. N’h ́esitez pas `a laisser libre cours `a votre imagination. L’originalit ́e de votre projet compte aussi dans la note.
Le projet se fait en binˆome du mˆeme groupe de TP, ou exceptionnellement en individuel. Il ne peut pas se faire `a plus de 2 ́etudiants. Vous rendrez votre code et un petit rapport expliquant son fonctionnement `a votre enseignant de TP avant la derni`ere s ́eance de TP de votre groupe. Vous ferez une d ́emonstration de votre projet lors du dernier TP.
a https://www.fisf.net/scrabble/decouverte- du- scrabble/regles- du- jeu.html
1 Le plateau de jeu
Le Scrabble se joue sur un plateau de 15×15 cases. On repr ́esente le plateau de jeu par des listes de listes (une liste de cellules pour chaque ligne du plateau):
• Une liste bonus (liste de listes de chaˆınes de caract`eres) contient les bonus des cases, tels qu’indiqu ́es sur l’image 1. La valeur ”MT” (cases rouges) indique un ”mot compte triple”, la valeur ”MD” (cases oranges, y compris la case centrale) un mot compte double (un mot passant par cette case compte pour respectivement le double ou le triple de sa valeur); la valeur ”LT” (cases bleu fonc ́e) une lettre compte triple, la valeur ”LD” (cases bleu clair) une lettre compte double (la lettre pos ́ee sur cette case compte pour respectivement 2 ou 3 fois sa valeur). Les cellules sans bonus (cases vertes) contiennent une chaˆıne vide.
• Une autre liste jetons (liste de listes de caract`eres) qui indique les positions des jetons lettres d ́ej`a jou ́es sur ce plateau. Chaque cellule contient le caract`ere du jeton pos ́e sur cette case, ou bien une chaˆıne vide si la case est vide.
Figure 1: Plateau de Scrabble avec cases bonus
1. E ́crire une fonction init bonus() qui initialise et renvoie une liste de listes de caract`eres, contenant les bonus des cases du plateau tels qu’indiqu ́es sur l’image. On pourra s’aider du fichier Python fourni qui donne les listes des cellules pour chaque bonus. Les cases ne contenant aucun bonus doivent contenir une chaˆıne vide.
1

2. 3.
4.
5. 6.
E ́crire une fonction init jetons() qui initialise et renvoie une liste de listes contenant uniquement des cases vides (chaˆıne vide dans chaque cellule). Attention chaque ligne doit ˆetre une liste ind ́ependante !
E ́crire une fonction affiche jetons(j) qui re ̧coit en param`etre les positions des jetons et affiche le plateau corre- spondant. On n’affichera pour l’instant pas les bonus, mais un espace pour les cases sans jetons. On utilisera des caract`eres pour s ́eparer les lignes et les colonnes `a l’affichage.
Am ́eliorer cette fonction d’affichage pour afficher aussi les bonus, en utilisant des symboles pour qu’ils soient visibles mˆeme sur les cases contenant un jeton. Par exemple afficher ’A’ pour une case sans bonus contenant la lettre ’A’, ou afficher ’A*’ pour une case avec bonus; on pourra choisir un symbole diff ́erent pour chacun des 4 bonus possibles.
Bonus si le reste fonctionne de mani`ere textuelle: autre fonction pour l’affichage graphique (librairie de votre choix) avec des couleurs pour les cases bonus. On rappelle que le jeu doit AUSSI fonctionner avec l’interface textuelle.
E ́crire un programme principal qui g ́en`ere et affiche le plateau.
La pioche
2
La pioche contient des jetons pour les lettres de l’alphabet, chaque lettre ́etant pr ́esente en un certain nombre d’exemplaires, et valant un certain nombre de points. On pourra se r ́ef ́erer `a https://www.regles-de-jeux.com/regle-du-scrabble/ pour les nombres de jetons et les valeurs de chaque lettre. Les jetons sont repr ́esent ́es ici par des lettres majuscules de l’alphabet. La pioche contient aussi 2 jokers, valant 0 point, qu’on repr ́esentera par le caract`ere ”?”.
1. E ́crire une fonction init dico() qui cr ́ee et renvoie un dictionnaire contenant pour chaque jeton (lettres et jokers) sa valeur et son nombre d’occurrences dans le sac. On utilisera les valeurs fournies dans les r`egles du Scrabble point ́ees ci-dessus. Le dictionnaire g ́en ́er ́e doit ˆetre au format ci-dessous.
{”A” : {”occ” : 9,”val” : 1},”B” : {”occ” : 2,”val” : 3},…,”Z” : {”occ” : 1,”val” : 10},”?” : {”occ” : 2,”val” : 0}}
2. E ́crire une fonction init pioche(dico) qui re ̧coit en argument un dictionnaire au format ci-dessus, et l’utilise pour initialiser la pioche, contenant exactement le bon nombre de jetons de chaque lettre, et les jokers. Cette fonction renvoie la liste ainsi construite. Par ex: [”A”, ”A”, ”A”, ”A”, ”A”, ”A”, ”A”, ”A”, ”A”, ”B”, ”B”, …, ”?”, ”?”]
A son tour, un joueur a le choix entre jouer un mot, ou ́echanger un certain nombre de lettres de sa main avec de nouvelles lettres du sac (cela n’est autoris ́e que tant qu’il reste au moins 7 jetons dans le sac). Chaque joueur doit toujours avoir 7 lettres, donc apr`es avoir jou ́e un mot, il doit en repiocher autant que n ́ecessaire pour compl ́eter sa main (tant que la pioche n’est pas vide).
3. E ́crire une fonction piocher(x, sac) qui re ̧coit en argument un entier x, pioche au hasard x jetons dans la liste sac, et renvoie la liste ainsi pioch ́ee. Cette fonction modifie le sac en supprimant les jetons pioch ́es. Par exemple pour x = 7, on pourrait renvoyer [”F”,”A”,”K”,”M”,”E”,”E”,”B”]
4. E ́crire une fonction completer main(main,sac) qui re ̧coit la main (liste de jetons d’un joueur) et le sac, qui utilise la fonction pioche pour compl ́eter la main afin qu’elle compte 7 jetons. Cette fonction modifie les 2 listes rec ̧ues, et ne renvoie rien. Attention au cas particulier ou` le sac ne contient plus assez de jetons, dans ce cas la fonction doit s’arrˆeter apr`es avoir pioch ́e tous les jetons restants, et la main r ́esultante comptera moins de 7 jetons.
5. E ́crire une fonction echanger(jetons, main, sac) qui permet d’ ́echanger les jetons list ́es de sa main avec des nouveaux jetons pris dans le sac. Il faut supprimer les jetons list ́es de la main du joueur, en piocher exactement autant dans le sac, remettre les jetons d ́efauss ́es dans le sac, et mettre les nouveaux jetons pioch ́es dans la main. Cette fonction modifie donc la main et le sac, qui gardent la mˆeme taille mais avec d’autres jetons. Cette fonction ne renvoie rien. Remarque: il faudra v ́erifier que les jetons `a ́echanger sont bien dans la main du joueur, et qu’il reste suffisamment de jetons dans le sac pour faire l’ ́echange, soit dans cette fonction, soit dans le programme appelant. Si on choisit de le faire dans cette fonction, on pourra lui faire renvoyer un bool ́een indiquant si l’ ́echange a r ́eussi ou ́echou ́e.
6. Compl ́eter le programme principal pour tester ces fonctions : cr ́eer des joueurs, leur donner `a chacun une main initiale de 7 lettres, etc.
2

3 Construction de mots
Les joueurs doivent construire des mots avec les lettres de leur main pour les poser sur le plateau. Ils ont le droit d’utiliser les lettres d ́ej`a pos ́ees (sans les d ́eplacer) pour construire leurs mots. Mais pour commencer simple, on va chercher des mots jouables uniquement avec les jetons de la main du joueur. Pour v ́erifier qu’un mot est autoris ́e, on se basera sur une liste exhaustive de tous les mots qu’on lira dans un fichier. Ces mots seront tous en lettres majuscules non accentu ́ees.
4
1.
2.
3.
4.
5. 6.
E ́crire une fonction generer dico(nf) qui re ̧coit un nom de fichier texte, l’ouvre, y lit les mots autoris ́es (ils sont ́ecrits un par ligne), cr ́ee une liste contenant tous ces mots, et la renvoie. (Test: avant de maˆıtriser les fichiers, vous pouvez ́ecrire une liste a` la main pour tester la suite du programme.)
Tester cette fonction sur le fichier fourni avec le sujet du projet. Attention, le fichier fourni contient ́enorm ́ement de mots. Vous pouvez d’abord en cr ́eer un autre plus court pour faire vos premiers tests. Une fois la liste compl`ete des mots du dictionnaire cr ́e ́ee, vous pouvez aussi v ́erifier en n’en affichant que quelques ́el ́ements `a la fois, par exemple uniquement les mots commen ̧cant par ”U”.
E ́crire une fonction mot jouable(mot, ll) qui re ̧coit un mot et une liste de lettres, et renvoie un bool ́een indiquant si ce mot peut s’ ́ecrire `a partir des lettres disponibles. Attention : cette fonction ne doit pas modifier la liste ll. Par exemple, mot possible(“COURIR”,[“C”,”O”,”R”,”U”,”I”,”Z”,”X”]) renvoie False (il manque un ”R”), alors que mot possible(“PIED”,[“P”,”A”,”I”,”D”,”E”,”W”,”K”]) renvoie True car toutes les lettres n ́ecessaires sont bien dans la liste.
E ́crire une fonction mots jouables(motsfr, ll) qui rec ̧oit une liste de mots fran ̧cais autoris ́es, une liste de lettres disponibles en main, et qui g ́en`ere et renvoie une nouvelle liste contenant la s ́election des mots parmi ceux de la liste motsfr qui sont jouables avec les lettres de la liste ll. On appellera la fonction mot jouable pour tester si chaque mot est jouable.
Par exemple avec la liste de mots [”COURIR”,”PIED”,”DEPIT”,”TAPIR”,”MARCHER”] et la liste de let- tres [”P”,”I”,”D”,”E”,”T”,”A”,”R”], cette fonction renvoie la liste [”PIED”,”DEPIT”,”TAPIR”], ces 3 mots ́etant jouables avec ces lettres.
Si ce n’est pas fait, consid ́erer le cas des jokers dans ces fonctions, un joker pouvant remplacer n’importe quelle lettre manquante pour ́ecrire un mot.
Am ́elioration : les mots peuvent ˆetre plac ́es en exploitant les jetons d ́ej`a pos ́es sur le plateau. Compl ́eter ces fonctions pour g ́en ́erer des listes de mots jouables avec les lettres de la main plus une lettre manquante, ou plus plusieurs lettres manquantes (on pourra passer ce nombre en param`etre).
Valeur d’un mot
On veut maintenant calculer la valeur des mots pos ́es. Chaque jeton a une valeur en points (entre 0 pour les jokers, et 10 pour les lettres les plus rares). Pour simplifier on commencera par calculer la valeur des mots ind ́ependamment de leur placement (donc des ́eventuelles cases bonus). On trouvera la valeur de chaque jeton dans un dictionnaire rec ̧u en argument, au format g ́en ́er ́e par la fonction init dico() d ́efinie en question 2.1 ci-dessus. Si un joueur place ses 7 lettres d’un coup, c’est un Scrabble, il rec ̧oit un bonus de 50 points en plus de la valeur du mot.
1. E ́crire une fonction valeur mot(mot, dico) qui re ̧coit en param`etres un mot (en lettres majuscules), et le diction- naire de jetons. Cette fonction calcule et renvoie la valeur de ce mot en points (la somme des valeurs de ses lettres. Par exemple le mot ”BEBE” vaut 2 + 1 + 2 + 1 = 6 points. Cette fonction doit consid ́erer le bonus de 50 points pour un Scrabble dans le total.
2. E ́crire une fonction meilleur mot(motsfr, ll, dico) qui calcule et renvoie le meilleur mot (de plus haute valeur telle que calcul ́ee avec valeur mot), parmi les mots autoris ́es de la liste motsfr, jouable avec les lettres de la liste ll (dont les valeurs sont donn ́ees dans dico). Si aucun mot n’est jouable, renvoyer une chaˆıne vide.
Par exemple, avec la mˆeme liste de mots que plus haut, et les valeurs officielles des lettres du Scrabble, le meilleur mot jouable est ”DEPIT” qui vaut 2+1+3+1+1=8 points, alors que ”PIED” et ”TAPIR” valent chacun 7 points.
3. Option : il peut y avoir plusieurs mots de mˆeme valeur maximale. E ́crire une fonction meilleurs mots qui renvoie la liste de tous les mots ayant la mˆeme valeur maximale. S’il n’y a qu’un seul meilleur mot, la fonction renvoie une liste d’un seul ́el ́ement. S’il n’y a aucun mot jouable, elle renvoie une liste vide.
3

5 Placement de mot
Les joueurs peuvent placer leurs mots sur la grille, horizontalement ou verticalement, au contact des mots d ́ej`a pos ́es. On s’int ́eresse ici `a la v ́erification du placement des mots sur le plateau de jeu.
1. E ́crire une fonction lire coords() qui demande au joueur des coordonn ́ees, les filtre jusqu’a` correspondre `a une case vide du plateau, et les renvoie.
2. E ́crire une fonction tester placement(plateau,i,j,dir,mot) qui rec ̧oit le plateau, les coordonn ́ees de la case de placement de la premi`ere lettre, une direction (horizontal ou vertical), et un mot, et qui v ́erifie si le mot est pla ̧cable `a cet endroit. Attention il peut y avoir d ́ej`a des lettres pos ́ees sur le plateau dont le mot fait usage. La fonction renvoie la liste des lettres n ́ecessaires pour placer ce mot `a cet endroit dans ce sens, ou bien une liste vide si c’est impossible (par ex le mot est trop long, ou incompatible avec les lettres d ́ej`a plac ́ees…).
3. E ́crire une fonction placer mot(plateau,lm,mot,i,j,dir) qui re ̧coit le plateau, la liste des lettres en main, un mot, les coordonn ́ees de d ́epart et la direction ; qui teste les contraintes (on utilisera tester placement, mais cela ne suffit pas); qui place le mot `a cet endroit du plateau (modifie donc le plateau), en utilisant les lettres de la main (modifie donc la main). Attention `a ne pas consommer les lettres de la main tant qu’on n’est pas suˆr de pouvoir placer le mot. Cette fonction renvoie un bool ́een pour indiquer le succ`es ou l’ ́echec du placement. En cas d’ ́echec, ni la main ni le plateau ne doivent ˆetre modifi ́es.
4. Modifier le calcul de la valeur d’un mot en fonction de sa position : il faut tenir compte des cases bonus (affectant une lettre ou tout le mot) sur lesquelles le mot est plac ́e. On peut supposer ici que toutes les cases bonus recouvertes par le mot sont comptabilis ́ees. Les r`egles officielles indiquent cependant que les cases bonus ne comptent que pour le premier mot pos ́e dessus, et sont ensuite d ́esactiv ́ees : on peut alors envisager de modifier le plateau pour ”supprimer” les bonus qui ont d ́ej`a ́et ́e utilis ́es et ne sont plus valables.
5. Bonus: on a pour l’instant suppos ́e qu’un joueur ne pouvait placer qu’un seul mot `a la fois. En r ́ealit ́e, en pla ̧cant un mot le joueur peut cr ́eer un (ou plusieurs) autres mots perpendiculaires en compl ́etant des lettres d ́ej`a plac ́ees (voir les images ci-dessous). Ajouter ces mots multiples au calcul du score d’un coup.
Figure 2: En pla ̧cant ”BOUGIEZ” le joueur compl`ete aussi ”CACHEZ” et marque donc les points de ces 2 mots.
Figure 3: En pla ̧cant ”GOURMET”, le joueur compl`ete aussi ”GO” et ”ON” et marque donc les points de ces 3 mots.
4

6 Boucle de jeu `a x joueurs
On va maintenant ́ecrire le programme principal de jeu `a plusieurs joueurs. Chaque joueur est identifi ́e par son nom, dispose d’une liste (sa ”main”) de 7 jetons, et d’un score. On pourra stocker toutes ces informations dans un dictionnaire. On pourra aussi stocker un num ́ero d’ordre de jeu.
Les joueurs jouent `a tour de rˆole : soit il passe; soit il ́echange un certain nombre de jetons; soit il place un mot, marque les points correspondants, et re-pioche les jetons manquants. Si un joueur doit piocher mais qu’il ne reste plus assez de jetons dans le sac, alors la partie se termine imm ́ediatement. Les autres joueurs perdent un nombre de points ́egal `a la somme des valeurs des jetons qu’ils ont encore en main.
1. E ́crire une fonction tour joueur qui g`ere le tour d’un joueur : affichage du plateau, demande du coup (passer, ́echanger, placer), et appel de la fonction correspondante.
2. E ́crire une fonction qui d ́etecte la fin de partie, c’est-`a-dire quand un joueur essaye de piocher mais qu’il n’y a plus assez de lettres dans le sac pour compl ́eter sa main.
3. E ́crire une fonction de d ́etection du prochain joueur, c’est-`a-dire le joueur suivant dans l’ordre.
E ́crire un programme principal qui g`ere la boucle de jeu `a x joueurs :
1. 2.
3.
Demande le nombre de joueurs et leurs noms. Cr ́ee le sac (la pioche). Cr ́ee et affiche le plateau vide. Cr ́ee le dictionnaire des joueurs avec leurs noms, scores initialement nuls, mains de 7 jetons pioch ́es dans le sac.
A chaque tour :
• Affiche le nom du joueur courant, lui demande son coup (le joueur doit pouvoir passer, ́echanger un certain nombre de lettres, ou placer un mot)
• Si le joueur passe ou ́echange, son tour se termine
• Si le joueur veut placer un mot, le programme doit le filtrer pour v ́erifier qu’il est correct, puis le placer, et
re-piocher les jetons manquants.
• Affiche le plateau de jeu avec le nouveau mot, affiche sa valeur, met `a jour les scores
D ́etecte et g`ere la fin de partie : calcule les malus (points n ́egatifs pour les lettres encore en main) ; affiche les scores de tous les joueurs ; affiche le nom du gagnant.
Bonus et am ́eliorations
7
7.1 Statistiques
Permettre aux joueurs de jouer plusieurs parties, enregistrer les scores dans des fichiers, et g ́en ́erer des statistiques : meilleur score, plus de parties gagn ́ees, score moyen, etc. On pourra aussi enregistrer des informations suppl ́ementaires comme le nombre de Scrabble r ́ealis ́es (par joueur, par partie).
7.2 Sauvegarde de partie
Permettre d’enregistrer une partie en cours dans un fichier, et de la recharger pour la reprendre ult ́erieurement au mˆeme point.
Suggestion: vous pourrez alors utiliser cette fonctionnalit ́e pour pr ́eparer une partie proche de la fin pour faire une d ́emonstration lors de la soutenance du projet.
7.3 Affichage graphique
Permettre de jouer en mode graphique, en cliquant sur le plateau et la main. Les cases bonus seront alors affich ́ees en couleur.
7.4 Aide de jeu
1. proposer une aide de jeu en sugg ́erant un placement pour un mot
2. proposer une aide de jeu en sugg ́erant des mots jouables avec les lettres en main
5

7.5 Intelligence Artificielle
1. Am ́eliorer le calcul du meilleur mot pour faire usage des lettres d ́ej`a pos ́ees sur le plateau 2. Cr ́eer un joueur automatis ́e `a int ́egrer dans la boucle de jeu
6