Jeu du Mastermind - Camille Touron L3A

Présentation du jeu

Le Mastermind est un jeu de société pour deux joueurs : un des joueurs (le codemaker) invente une combinaison secrète composée de 4 pions de couleurs et son adversaire (le codebreaker) doit la trouver par déductions successives, i.e. déterminer la couleur et la position exacte de chaque pion du code en 12 coups maximum.

Il s'agit d'un jeu de réflexion et de déduction, inventé par Mordecai Meirowitz, expert en télécommunications israëlien, dans les années 1970. Le jeu se base sur un jeu plus ancien (bulls and cows) qui se jouait avec papier et crayon et des nombres au lieu de couleurs.

A l'origine, le codemaker disposait de 6 couleurs différentes (rouge, bleu, noir, jaune, vert, blanc et bleu) pour composer une combinaison de 4 pions. Cependant, des variantes au jeu existent permettant au codemaker d'utiliser jusqu'à 12 couleurs différentes pour composer des combinaisons de 8 pions.

Les règles du jeu

Le codemaker peut utiliser plusieurs fois la même couleur dans sa combinaison secrète, voire laisser certains emplacements vides (sans pion), ce qui permet de rendre le décodage plus compliqué. Le codebreaker propose à chaque tour une combinaison de pions, qu'il pense être la solution. Le codemaker est alors chargé de noter la combinaison proposée en fonction de la combinaison secrète de la façon suivante :

Des exemples pour mieux comprendre ...

On suppose que la combinaison secrète est **RR****V****B**.

Objectifs du projet

Fonctions principales

On crée une fonction choices permettant de renvoyer une combinaison de façon aléatoire à partir du choix de couleurs disponibles et du nombre de pions autorisés. Cette fonction sera utilisée par le codemaker.

On se place du côté du codemaker et on crée une fonction evaluation permettant de noter la combinaison proposée par le codebreaker. La fonction prend en argument l'essai du codebreaker et la combinaison secrète à trouver.

On crée ensuite une fonction donner_possibles qui prend en argument l'essai du codebreaker (sous forme d'une chaine de caractères) et l'évaluation de l'essai et affiche un set contenant toutes les combinaisons compatibles avec l'évaluation donnée par le codemaker. Si on note $S$ la solution et $P$ l'essai, on cherche en fait toutes les combinaisons $Q$ différentes de $P$ telles que $evaluation(P,Q) = evaluation(P,S)$.

On crée une fonction maj_possibles qui prend en argument le set des combinaisons possibles, l'essai sous forme d'une chaine de caractères, puis l'évaluation de l'essai. Cette fonction va modifier le set des possibles entré en argument en enlevant toutes les combinaisons incompatibles avec l'évaluation donnée. Nous en aurons besoin dans les programmes suivants.

Version 1.0 du Mastermind

On crée une première version du jeu simplifiée :

Codebreaker1 VS Codemaker1

On fait jouer codemaker1 contre codebreaker1

Statistiques

On pose :

Version 2.0 du Mastermind

Nous allons complexifier le jeu en modifiant légèrement les règles :

Cobreaker2 VS Codemaker2

Il est temps de faire jouer codemaker2 contre codebreaker2 !

Codebreaker2 VS Codemaker1

On peut aussi comparer les résultats en faisant jouer codemaker1 contre codebreaker2.

Statistiques

En comparant les jeux entre codebreaker2 et codemaker 1 ou 2, on obtient un histogramme semblable à celui-ci : on voit que codemaker2 complexifie la résolution du jeu !

image.png

Version 3.0 du Mastermind

Nous essayons de rendre le décodage de la combinaison secrète optimal, en utilisant l'algorithme de Knuth. David Knuth est à l'origine du Five Guess. Selon lui, il serait possible de décoder toute combinaison secrète en 5 essais maximum en suivant une méthode particulière. Dans son essai de 1977, il démontre sa proposition pour un jeu du Mastermind avec des combinaisons à 4 pions parmi 6 couleurs possibles. Voici l'algorithme. 1) on essaie une première combinaison et on obtient une évaluation. Le choix de la 1ere combinaison a son importance;

2) on met à jour le set des combinaisons compatibles avec cette évaluation, noté maj_possibles;

3) on parcourt l'ensemble des essais restants, càd les $6^4$ combinaisons moins celles déjà utilisées. Pour chaque essai restant, noté $P$, et pour chaque évaluation possible notée $E$ ((0,1), (0,2), (0,3) etc ...) on calcule le nombre de combinaisons de maj_possibles dont l'évaluation avec $P$ est exactement $E$. On choisit ensuite le maximum de ces scores intermédiaires. On répète cette opération pour l'ensemble des combinaisons restantes. Ce maximum sera le score de $P$.

4) on choisit la combinaison avec le score miminum : si plusieurs combinaisons ont le même score on peut garder la première combinaison rencontrée. Cette combinaison sera proposée comme essai au prochain tour. La combinaison choisie n'est pas forcément dans maj_possibles mais l'algorithme fonctionne quand même.

Codebreaker3 VS Codemaker1

On fait jouer codebreaker3 contre codemaker1.

Statistiques

L'algorithme devrait nous donner une moyenne inférieure à 5 essais par partie pour trouver la solution du codemaker. Comme cet algorithme cherche à minimiser le nombre d'essais de codebreaker3, il est assez long : codebreaker3 va parcourir plusieurs fois le set des possibles.

Version humain contre machine

Pour s'amuser on peut aussi faire jouer l'humain contre la machine : nous choisissons ici codemaker1 de façon à ce que la solution choisie au départ ne change pas au cours de la partie et donc que les évaluations successives permettent à l'humain de décoder la combinaison secrète.