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)