Licence CC BY-NC-ND, Thierry Parmentelat
inspiré d’un jeu télévisé; pour ceux qui ne connaissent pas les règles, on parle d’un jeu qui s’insipre un peu du mastermind, mais avec des mots; il s’agit de trouver un mot caché, on essaie un mot et en réponse on nous dit si chaque lettre est présente et/ou bien placée.
pour plus de détails sur ce jeu, voyez https://fr.wikipedia.org/wiki/Motus_(jeu_télévisé)
les règles¶
voici un exemple de session, le mot à deviner était CITRON

ici on a
d’abord essayé
CASTOR; la ‘correction’ nous a appris quele mot commence par un
C,qu’il contient un
Oen 5-ème position,qu’il contient un
Tmais pas en 4-éme position,et un
Rmais pas en dernière position,et pas de
Ani deS
on a ensuite essayé
CINEMAou a appris quela seconde lettre est
I,le mot contient un
Nmais pas en 3-ème position,etc...
les codes de couleur sont donc
rouge: lettre bien placée
jaune: lettre mal placée
bleu (ou blanc, selon les supports): lettre absente
petite subtilité¶
il faut préciser un peu ce qu’il se passe lorsque l’un des deux mots (le caché, ou la tentative) contient des lettres en double
la règle est que on commence par donner autant de rouges que possible, puis ces lettres-là sont enlevées du décompte; puis on donne ensuite autant de jaunes que possible, et à chaque fois les lettres sont enlevées du décompte;
c’est ainsi que par exemple, avec le mot caché addition on obtient la correction suivante (la dernière ligne est uniquement explicative)
vous remarquez que la réponse contient un d bleu, alors qu’il y a deux d dans le mot à deviner, mais comme ils ont déjà été ‘consommés’ pour les deux d rouges, le troisième d est considéré comme absent.
autre exemple, le mot caché est escarcelle
vous remarquez que la réponse contient
un
erouge en 1ème position,un
ejaune en 6-ième position qui correspond à la 7-ème position du mot caché,et aussi un
ebleu en 9-ème position, malgré le fait que le mot caché contient .. plein dee!
ce qui signifie entre autres qu’il ne suffit pas trouver une lettre en bleu dans la réponse pour en déduire qu’elle n’est pas présente dans le mot, comme ce contrexemple nous le montre bien
ce qui est fourni¶
dans le zip vous trouverez
un dictionnaire (dans
data/ods6.txt)un module
motus.pyqui contient des morceaux de logique
# FYI this data comes from this URL
from pathlib import Path
print(Path("data/ods6.url").open().read())http://www.3zsoftware.com/listes/ods6.zip
étape 1: l’ordi anime le jeu¶
dans un premier temps:
lisez le module
motus.pyutilisez le pour écrire un fichier
main.pyqui implémente un jeu dans lequel l’ordi se contente de vous faire jouer:il demande un nombre de lettres
il tire au sort un mot
il montre la première lettre, et les autres sont en gris
l’humain propose un mot, l’ordi donne la “correction”, etc.. jusqu’à ce que mot soit trouvé
on lance le jeu avec
python main.pyétape 2: on lui passe un paramètre¶
ça peut être utile, au moins pour le debug, de pouvoir choisir le mot caché, c’est-à-dire de pouvoir lancer
python motus.py citronça vous fera gagner du temps pour la suite
étape 3: debugging¶
en fait si vous rejouez les exemples ci-dessus, surtout avec les lettres multiples, vous allez voir que le code de motus.py est un peu buggé, votre mission est de le corriger
étape 4: de l’aide¶
en option, l’humain peut demander à l’ordi un indice; à vous de voir, on peut imaginer par exemple
si on tape
?help, le jeu affiche un readme qui résume .. les commandes de trichesi on tape
?howmany, le jeu affiche combien de mots conviennent dans le dictionnairessi on tape
?words, le jeu affiche les mots qui conviennentsi on tape
?letters, le jeu affiche, si on en trouve, les lettres que l’on peut déduire à ce stade de la recherche...
discussion: refactoring ?¶
on voudrait maintenant que l’ordi puisse indifféremment:
ou bien animer le jeu (comme on vient de le faire)
ou bien jouer avec un humain qui anime le jeu,
ou remplir les deux rôles et jouer contre lui-même...
est-ce que le code est bien adapté pour ça ?
sinon comment le restructurer pour ce type d’usages ?
une librairie utile: colorama¶
pour l’affichage j’ai utilisé ci-dessus la librairie colorama, voici quelques exemples, cherchez la documentation si vous avez besoin de plus de détails
# as you can see in the doc, windows users will probably need to do this
from colorama import just_fix_windows_console
just_fix_windows_console()from colorama import Back, Style# on peut l'utiliser comme ceci
print(f"{Back.RED} C I {Back.YELLOW} N {Back.BLUE} E M A {Style.RESET_ALL}") C I N E M A
# ou encore
from colorama import Back, Style
print(f"{Back.RED} C {Style.RESET_ALL} {Back.RED} I {Style.RESET_ALL} "
f"{Back.YELLOW} N {Style.RESET_ALL} {Back.BLUE} E {Style.RESET_ALL} "
f"{Back.YELLOW} M {Style.RESET_ALL} {Back.YELLOW} A {Style.RESET_ALL}") C I N E M A