TP9 Un exemple de projet : le Mastermind
Transcription
TP9 Un exemple de projet : le Mastermind
IGI-3008 – ESIEE Paris – 2016-2017 Programmation avec Python TP9 Jean-Claude GEORGES Un projet complet : le Mastermind Ce TP donne un exemple d’étude et d’analyse d’un projet complet. Lisez tout de ’A’ à ’Z’. Notre fine équipe d’analystes a oublié de prévoir un nombre maximum de coups, qui, s’il est atteint, fera perdre la partie, et c’est l’équipe de programmation qui s’en rend compte alors que le produit doit être présenté en clientèle demain. Le programme déjà écrit est disponible ici : I www.esiee.fr/~georgesj/esiee/igi-3008/mm2.py . Ne vous y précipitez pas, lisez déjà ce document. Après l’avoir lu le dossier d’analyse, • testez le programme. Il se peut que certaines saisies fassent encore planter le programme ; • s’il subsiste des erreurs, essayez de modifier le programme pour qu’il ne plante jamais ; • si certains messages sont peu clairs ou ambigus, modifiez-les pour clarifier le programme ; • complétez le programme pour qu’il intègre un nombre maximal de tentatives autorisées et fasse perdre le joueur ou l’ordinateur quand ce nombre de tentatives est dépassé. CONTEXTE 2 Dossier d’analyse : le Mastermind Contexte Mastermind est un jeu de logique opposant deux joueurs : le codeur et le décodeur. Le codeur choisit une combinaison de 4 pions de couleurs (il y a 6 couleurs possibles). Le décodeur doit deviner, par déductions successives, les couleurs des choisis par le codeur. Il propose une combinaison et le codeur lui indique alors le nombre de pions bien placés et le nombre de pions mal placés. Le décodeur a droit à dix essais pour deviner la combinaison. Pour des raisons de facilité de programmation, on remplacera les couleurs par des chiffres de 0 à 5 et les combinaisons seront donc des suites de 4 chiffres. TP9 IGI-3008 (2016-2017) OBJECTIFS 3 Objectifs Le programme Le programme devra permettre à l’utilisateur de choisir le mode de partie : l’ordinateur devra tenter de deviner une combinaison choisie par le joueur (joueur codeur) , ou le joueur tentera de deviner une combinaison choisie par l’ordinateur (joueur décodeur). Il devra être possible à tout moment de quitter le jeu. Selon le choix : • joueur codeur : le programme demandera à l’utilisateur de choisir mentalement une combinaison, puis bouclera sur une série de coups, chaque coup étant constitué d’une proposition d’une combinaison à l’utilisateur, puis d’une demande du nombre de couleurs bien/mal placées. La partie s’arrêtera dans trois cas : – gain : le nombre de couleurs bien placées est égale au nombre de fiches – erreur : incompatibilité de l’ensemble des combinaisons déjà proposées et leurs réponses (l’utilisateur s’est trompé ou a triché dans une de ses réponses, par exemple 3 bien placés, 1 mal placé sur 4 fiches est incohérent) – abandon : l’utilisateur de quitter la partie • joueur décodeur : le programme choisira aléatoirement une combinaison, puis bouclera sur une série de coups, chaque coup étant constitué d’une demande de combinaison à l’utilisateur, puis du calcul et de l’affichage du nombre de couleurs bien/mal placées. La partie s’arrêtera dans deux cas (l’ordinateur ne se trompe pas dans ses réponses ;-) – gain : le nombre de couleurs bien placées est égale au nombre de fiches – abandon : l’utilisateur de quitter la partie TP9 IGI-3008 (2016-2017) OBJECTIFS 4 Interface proposée Le mastermind 1. L’ordinateur devine 2. Vous devinez 3. Fin Votre choix : < ?> Ouverture du programme Le mastermind : joueur codeur Choisissez mentalement une combinaison de <4> chiffres compris entre 0 et <5> <pause> Je propose <1 4 3 1> Entrez le nombre de bien placés/mal placés ("Q" pour quitter") < ? ?> Joueur codeur : premier coup Le mastermind : joueur codeur Historique 1 4 3 1 (2,1) 1 4 1 5 (1,1) Je propose <1 1 3 1> Entrez le nombre de bien placés/mal placés ("Q" pour quitter") < ? ?> Joueur codeur : ne coup TP9 IGI-3008 (2016-2017) OBJECTIFS Le mastermind 5 : joueur codeur Historique 1 4 3 1 (2,1) 1 4 1 5 (1,1) Je propose <1 2 3 4> Entrez le nombre de bien placés/mal placés ("Q" pour quitter") <4 0> J’ai gagné en <3> coups <pause, puis retour au menu> Joueur codeur : gain Le mastermind : joueur codeur Historique 1 4 3 1 (2,1) 1 4 1 5 (1,1) ..... Je propose <1 2 3 4> Entrez le nombre de bien placés/mal placés ("Q" pour quitter") <3 1> Tricheur ! Vos réponses sont incohérentes <pause, puis retour au menu> Joueur codeur : erreur TP9 IGI-3008 (2016-2017) OBJECTIFS Le mastermind 6 : joueur codeur Historique 1 4 3 1 (2,1) 1 4 1 5 (1,1) ..... Je propose <1 2 3 4> Entrez le nombre de bien placés/mal placés ("Q" pour quitter") <Q> Dommage, j’allais deviner... <pause, puis retour au menu> Joueur codeur : abandon Le mastermind : joueur décodeur J’ai choisi une combinaison de <4> chiffres compris entre 0 et <5> Entrez votre proposition ("Q" pour quitter) < ? ? ? ?> Joueur décodeur : premier coup Le mastermind : joueur décodeur Historique 1 4 3 1 (2,1) 1 4 1 5 (1,1) Entrez votre proposition ("Q" pour quitter) < ? ? ? ?> Joueur décodeur : ne coup TP9 IGI-3008 (2016-2017) OBJECTIFS 7 Le mastermind : joueur décodeur Historique 1 4 3 1 (2,1) 1 4 1 5 (1,1) 1 2 3 4 (4,0) Vous avez gagné en <3> coups <pause, puis retour au menu> Joueur décodeur : gain Le mastermind : joueur décodeur Historique 1 4 3 1 (2,1) 1 4 1 5 (1,1) Entrez votre proposition ("Q" pour quitter) <Q> Vous y étiez presque... <pause, puis retour au menu> Joueur décodeur : abandon Le mastermind 1. L’ordinateur devine 2. Vous devinez 3. Fin Votre choix : <F> Dommage, je m’amusais bien <pause>, puis fin du programme> Fermeture du programme TP9 IGI-3008 (2016-2017) ANALYSE 8 Analyse Le squelette du programme L’ensemble des fonctions du produits consistera en un enchaînement de menus, saisies de réponses et affichages de résultats. Un squelette (réutilisable) pourra être le suivant : Programme principal mastermind paramétrage du jeu (nb fiches, de couleurs) introduction boucle infinie saisie du choix de jeu selon le choix de jeu : choix 1 : joueur codeur choix 2 : joueur decodeur choix 3 : fin au revoir TP9 IGI-3008 (2016-2017) ANALYSE 9 Programme joueur codeur joueur codeur (une partie joueur codeur) introduction (explications...) boucle infinie : affichage de la partie (les coups déjà joués) calcul de la proposition (en fonction des coups précédents) si une proposition est possible affichage de la proposition saisie de la réponse (bien, mal placés) selon la réponse : trouvé (toutes les fiches bien placées) : afficher gagné fin normale : enregistrer la réponse continuer quitter afficher désolé fin si aucune proposition n’est possible afficher un message d’erreur fin TP9 IGI-3008 (2016-2017) ANALYSE 10 Programme joueur décodeur joueur décodeur introduction choix de la combinaison à faire deviner boucle infinie affichage de la partie saisie de la proposition calcul de la réponse affichage de la réponse selon la réponse : trouvé (toutes les fiches bien placées) afficher gagné fin normale enregistrer la réponse continuer quitter afficher désolé fin TP9 IGI-3008 (2016-2017) ANALYSE 11 Les données La représentation des données pourra être la suivante : Nombre de fiches int (par exemple, NB_FICHES=4). Nombre de couleurs int (NB_COULEURS=6) Couleur de fiche int dans [0..NB_COULEURS-1] Combinaison list de NB_FICHES couleurs (comb = [1,3,0,5]). Réponse list de deux nombres (rep = [1,2] #un bien placé, deux mal placés). Historique Liste de couples (combinaison, reponse) contenant les résultats des coups déjà joués. Par exemple : [ [[1, 4, 3, 1],[2,1]], [[1, 4, 1, 5],[1,1]]] ou [ {'comb' : [1,4,3,1],'rep' : [2,1]}, {'comb' :[1,4,1,5],'rep' :[1,1]}] D’autres données peuvent être envisagées, comme par exemple les retours de menus : - MM_CODEUR int – l’utilisateur a choisi le choix "codeur" - MM_DECODEUR int – l’utilisateur a choisi le choix "décodeur" - MM_AIDE int – l’utilisateur a choisi le choix "aide" - MM_QUITTER int – l’utilisateur a choisi le choix "quitter" - MM_NULL int – réponse invalide TP9 IGI-3008 (2016-2017) ANALYSE 12 Les fonctions à écrire Affichages/saisies réutilisables tels quels dans tout projet marge Déclaration Rôle Paramètres Retour Appelé par Appelle marge(nb_espaces) esapcement horizontal nb_espaces – le nombre d’espaces à sauter horizontalement aucun (None) aff_aide, aff_au_revoir, aff_codeur_gain, aff_codeur_impossible, aff_codeur_intro, aff_decodeur_gain, aff_decodeur_intro, aff_ligne_histo, confirmation, pause, saisie_bpmp aucune saute_lignes Déclaration Rôle Paramètres Retour Appelé par saute_lignes(nb_lignes) Appelle aucune saute des lignes (espacement vertical) nb_lignes – le nombre de lignes à sauter aucun (None) aff_au_revoir, aff_codeur_gain, aff_codeur_impossible, aff_codeur_intro, aff_decodeur_gain, aff_decodeur_intro, aff_historique, aff_ligne_histo, aff_proposition, confirmation, decodeur, menu_principal, pause, saisie_bpmp, saisie_comb aff_banniere Déclaration Rôle aff_banniere(titre, marge = 0, car ='#') affiche un texte en bannière sous la forme * * * * * * * * * Paramètres Retour Appelé par Appelle TP9 * * pour un M. Doit créer le dessin des lettres titre – le texte à afficher marge – les espaces à afficher avant le texte car – le caractère de dessin aucun (None) menu_principal aucune IGI-3008 (2016-2017) ANALYSE 13 pause Déclaration Rôle Paramètres Retour Appelé par Appelle def pause(msg="Tapez <Entrée> pour continuer... ", saut_avant=1, saut_apres=0, espace_horizontal=0) interrompt le programme, affiche un message d’information et attend une action (<Entrée> clavier) pour continuer msg – le message à afficher saut_avant – le nombre de lignes sautées avant le message saut_apres – le nombre de lignes sautées après le message espace_horizontal – le nombre d’espaces de marge avant le message aucun (None) aff_aide, aff_codeur_gain, aff_codeur_impossible, aff_codeur_intro, aff_decodeur_gain, aff_decodeur_intro marge, saute_lignes confirmation Déclaration Rôle Paramètres confirmation(msg='', saut_avant=1, saut_apres=0, espace_horizontal=0, masque_non=MM_NON, masque_oui=MM_OUI) demande de confirmation avec affichage d’un message msg – le message à afficher saut_avant – le nombre de lignes sautées avant le message saut_apres – le nombre de lignes sautées après le message espace_horizontal – le nombre d’espaces de marge avant le message masque_non – le masque autorisé pour les réponses "non" masque_oui – le masque autorisé pour les réponses "oui" Retour True si l’utilisateur confirme Appelé par Appelle False sinon menu_principal, saisie_bpmp, saisie_comb marge, saute_lignes TP9 IGI-3008 (2016-2017) ANALYSE 14 Affichages/saisies adaptables à d’autres projets aff_aide Déclaration Rôle Paramètres Retour Appelé par Appelle def aff_aide() affiche l’aide. On pourra peut-être aller chercher l’aide dans un fichier texte. aucun aucun (None) mastermind marge, pause aff_au_revoir Déclaration Rôle Paramètres Retour Appelé par Appelle aff_au_revoir() affiche un message de fin aucun aucun (None) mastermind marge, saute_lignes menu_principal Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 menu_principal() affiche le menu principal. Affiche 4 propositions : codeur, décodeur, aide, quitter Demande une saisie. aucun int Indicateur de choix (parmi les variables globales) : - MM_CODEUR – l’utilisateur a choisi le choix "codeur" - MM_DECODEUR – l’utilisateur a choisi le choix "décodeur" - MM_AIDE – l’utilisateur a choisi le choix "aide" - MM_QUITTER – l’utilisateur a choisi le choix "quitter" - MM_NULL – réponse invalide mastermind aff_banniere, confirmation, saute_lignes IGI-3008 (2016-2017) ANALYSE 15 Affichages/saisies propres au mastermind mastermind Déclaration Rôle Paramètres mastermind(nb_fiches, nb_couleurs) Retour Appelé par Appelle aucun (None) aucune aff_aide, aff_au_revoir, codeur, decodeur, menu_principal programme principal nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs codeur Déclaration Rôle Paramètres Retour Appelé par Appelle codeur(nb_fiches, nb_couleurs) une partie codeur nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs aucun (None) mastermind aff_codeur_gain, aff_codeur_impossible, aff_codeur_intro, aff_historique, aff_proposition, ajoute_historique, calcule_comb, saisie_bpmp aff_codeur_intro Déclaration Rôle Paramètres aff_codeur_intro(nb_fiches, nb_couleurs) Retour Appelé par Appelle aucun (None) affiche l’image-écran de présentation d’une partie codeur. Rappele les règles codeur. nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs codeur marge, pause, saute_lignes aff_codeur_gain Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 aff_codeur_gain(hist) affiche l’image-écran de fin d’une partie codeur quand l’ordinateur a gagné hist – l’historique de la partie aucun (None) codeur aff_historique, marge, pause, saute_lignes IGI-3008 (2016-2017) ANALYSE 16 aff_codeur_impossible Déclaration Rôle Paramètres Retour Appelé par Appelle aff_codeur_impossible(hist) affiche l’image-écran de fin d’une partie décodeur où le joueur a triché (réponses bp mp incompatibles) hist – l’historique de la partie aucun (None) codeur marge, pause, saute_lignes decodeur Déclaration Rôle Paramètres Retour Appelé par Appelle decodeur(nb_fiches, nb_couleurs) une partie décodeur. On prévoira un code de triche pour afficher la combinaison choisie par l’ordinateur. nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs aucun (None) mastermind aff_comb, aff_decodeur_gain, aff_decodeur_intro, aff_historique, ajoute_historique, calcule_bien_places, calcule_mal_places, comb_alea, saisie_comb, saute_lignes aff_decodeur_intro Déclaration Rôle Paramètres Retour Appelé par Appelle aff_decodeur_intro(nb_fiches, nb_couleurs) affiche l’image-écran de présentation d’une partie décodeur. Rappelle les règles nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs aucun (None) decodeur marge, pause, saute_lignes aff_decodeur_gain Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 aff_decodeur_gain(hist) affiche l’image-écran de fin d’une partie décodeur où le joueur a gagné hist – l’historique de la partie aucun (None) decodeur aff_historique, marge, pause, saute_lignes IGI-3008 (2016-2017) ANALYSE 17 saisie_comb Déclaration Rôle Paramètres saisie_comb(nb_fiches, nb_couleurs) saisie d’une combinaison nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs Retour MM_QUITTER – l’utilisateur a choisi de quitter MM_CHEATCODE – triche pour afficher la combinaison choisie par l’ordi list une liste de nb_fiches nombres compris entre 0 et nb_couleurs-1 Appelé par Appelle decodeur confirmation, convert_comb, saute_lignes, verif_comb aff_comb Déclaration Rôle Paramètres Retour Appelé par Appelle aff_comb(comb) affiche d’une combinaison : une combinaison est une liste de chiffres du type [1,3,5,2,7] comb – la combinaison à afficher aucun (None) aff_ligne_histo, aff_proposition, decodeur aucune saisie_bpmp Déclaration Rôle Paramètres Retour saisie_bpmp(nb_fiches) Appelé par Appelle codeur saisie du nombre de bien placés et de mal placés. nb_fiches – le nombre de fiches de la partie int - MM_QUITTER – l’utilisateur a choisi de quitter ou list une liste de deux nombres (bien placés et mal placés) confirmation, convert_comb, marge, saute_lignes aff_bpmp Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 aff_bpmp(bp, mp) affiche du nombre de bien placés et de mal placés bp – le nombre de bien placés mp – le nombre de mal placés aucun (None) aff_ligne_histo aucune IGI-3008 (2016-2017) ANALYSE 18 aff_historique Déclaration Rôle Paramètres Retour Appelé par Appelle aff_historique(hist) affiche l’historique de la partie hist – la liste des coups joués aucun (None) aff_codeur_gain, aff_decodeur_gain, codeur, decodeur aff_ligne_histo, saute_lignes aff_ligne_histo Déclaration Rôle Paramètres Retour Appelé par Appelle aff_ligne_histo(ligne_histo) affiche d’une ligne de l’historique : une ligne est une liste comprenant une combinaison et une liste de deux réponses [bp, mp] du type [[1, 3, 5, 2, 7], [2, 1]] ligne_histo – la ligne à afficher aucun (None) aff_historique aff_bpmp, aff_comb, marge, saute_lignes aff_proposition Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 aff_proposition(comb) affiche la proposition de l’ordinateur. comb – la combinaison à afficher aucun (None) codeur aff_comb, saute_lignes IGI-3008 (2016-2017) ANALYSE 19 Calculs propres au mastermind verif_comb Déclaration Rôle Paramètres verif_comb(comb, nb_fiches, nb_couleurs) vérifie qu’une combinaison comporte bien nb_fiches nombres dans l’intervalle [0..nb_couleurs[ Retour True – la combinaison est possible Appelé par Appelle comb – la combinaison à tester nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs False – la combinaison est impossible saisie_comb aucune calcule_bien_places Déclaration Rôle Paramètres Retour Appelé par Appelle calcule_bien_places(comb1, comb2) calcule le nombre d’éléments bien placés entre deux combinaisons comb1 – la première combinaison à tester comb2 – la deuxième combinaison à tester int – le nombre d’éléments communs aux deux combinaisons et à la même place calcule_comb, calcule_mal_places, decodeur aucune calcule_mal_places Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 calcule_mal_places(comb1, comb2) calcule le nombre d’éléments mal placés entre deux combinaisons. Principe : calcule le nombre total d’éléments communs et soustrait le nombre d’éléments bien placés. comb1 – la première combinaison à tester comb2 – la deuxième combinaison à tester int – le nombre d’éléments communs aux deux combinaisons, mais pas à la même place calcule_comb, decodeur calcule_bien_places IGI-3008 (2016-2017) ANALYSE 20 calcule_comb Déclaration Rôle Paramètres Retour Appelé par Appelle calcule_comb(hist, nb_fiches, nb_couleurs) calcule une combinaison possible en tenant compte de l’historique hist – l’historique de la partie nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs list une liste de nb_fiches nombres compris entre 0 et nb_couleurs-1 compatible avec l’historique si possible ou None – aucune combinaison n’est compatible avec l’historique codeur calcule_bien_places, calcule_mal_places, comb_alea, incremente_comb convert_comb Déclaration Rôle Paramètres Retour Appelé par Appelle convert_comb(chaine) conversion d’une chaîne de caractère en une liste de nombres. Tous les caractères ’non chiffres’ sont des séparateurs chaine – une chaîne de caractère list une liste de nombres (peut-être vide) présents dans la chaîne saisie_bpmp, saisie_comb aucune comb_alea Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 comb_alea(nb_fiches, nb_couleurs) génère une combinaison aléatoire de nb_fiches nombres dans l’intervalle [0..nb_couleurs[ nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs list une combinaison aléatoire de nb_fiches nombres dans l’intervalle [0..nb_couleurs[ calcule_comb, decodeur aucune IGI-3008 (2016-2017) ANALYSE 21 incremente_comb Déclaration Rôle incremente_comb(comb, nb_fiches, nb_couleurs) retourne la combinaison qui suit comb : par exemple pour nb_fiches = 4 et nb_couleurs = 6 [1,2,3,4] -> [1,2,3,5], [1,3,5,5] -> [1,4,0,0] Paramètres Retour Appelé par Appelle comb – la combinaison à incrémenter nb_fiches – le nombre de fiches à deviner nb_couleurs – le nombre de couleurs list une liste de nb_fiches nombres compris entre 0 et nb_couleurs-1 qui suit comb calcule_comb aucune ajoute_historique Déclaration Rôle Paramètres Retour Appelé par Appelle TP9 ajoute_historique(hist, comb, bpmp) ajoute une combinaison et une réponse à l’historique hist – l’historique de la partie à mettre à jour comb – la combinaison à ajouter bpmp – la liste [bp, mp] correspondant à la combinaison aucun (None) codeur, decodeur aucune IGI-3008 (2016-2017) GRAPHE DES DÉPENDANCES 22 Graphe des dépendances Les fonctions utilitaires d’affichage et de saisie non spécifiques ne sont pas représentées. TP9 IGI-3008 (2016-2017)