MasterMind

Introduction

Cet applet est une réécriture en Java du célèbre 'MasterMind'.

Description

Ce jeu est très simple (au niveau des règles) :

Votre adversaire, la machine en l'occurence, choisit des jetons de couleur dans un certain ordre, par exemple 4 pièces parmis 7 couleurs possibles. Vous savez combien de jetons on été choisis (par exemple 4) et combien de couleurs existent (par exemple 7). Votre but est de trouver ce qui a été choisi par votre adversaire (quelles couleurs et dans quel ordre).

Pour cela, vous effectuez des tentatives. Une tentative consiste à faire une proposition de disposition de jetons de couleurs. Après chaque tentative, votre adversaire vous indique si vos couleurs sont bonnes et si elles sont bien placées. Vous obtenez un pion noir par jeton de couleur ayant la bonne couleur et étant bien placé et un pion blanc par jeton de bonne couleur mais mal placé. Vous avez gagné lorsque vous obtenez toutes les marques noires.

Ce jeu existe en de multiples variantes en fonction du nombre de jetons choisis par l'adversaire, du nombre total de couleurs existantes et de la possibilité d'avoir plusieurs jetons de même couleur, des doubles (ou triples...), dans le choix de l'adversaire. Les deux exemples ci-dessous illustrent ces possibilités :

  • A gauche, 4 jetons parmi 7 couleurs et aucun double.
  • A droite, 5 jetons parmi 10 couleurs et doubles possibles.

Mode d'emploi

Vous faites un essai en prenant des jetons de couleur, dans la ligne du bas ou ailleurs à l'écran, et en les mettant dans les cases marquées d'un petit cercle plein. Vous demandez la réponse en cliquant sur 'Get result', ce bouton ne fonctionnant que si la proposition ets complète c'est-à-dire que si tous les petits cercles noirs sont remplits par une couleur. Lorsque vous avez gagné, la machine découvre la solution. Si vous arrivez sur la dernière ligne, la machine a pitié et découvre aussi la solution.

Si vous craquez, vous pouvez demander à la machine de trouver la solution à l'aide du bouton 'Solution'. Vous pouvez demander une aide de la machine à l'aide du bouton 'Hint' et enfin vous recommencez une partie à l'aide du bouton 'Play Again' qui remplace le bouton 'Solution' après affichage de celle-ci. La machine affiche en permanence un 'par' qui correspond à son temps moyen pour trouver la solution (une réglette affiche la progression de ses différentes tentatives).

Les aides de la machine sont calculées par un programme qui ne regarde pas la solution. Cette routine est assez efficace (le remplissage de la règlette correspond a un jeu complet de la machine). Si vous souhaitez écrire un programme Java de résolution du MasterMind, l'applet est capable de tester votre algorithme.

Bon jeu !

Ecriture d'un algorithme de résolution

Si vous le souhaitez, vous pouvez vous essayer à la programmation java en écrivant un 'brain' de résolution du MasterMind. Celui-ci doit être une classe java qui hérite de la classe abstraite ' BK.MasterMind.MasterMindMachine'. Les descendants de cette classe sont invoqués par l'applet 'MasterMindApplet' afin de résoudre le problème ('Hint') et lors de l'utilisation du paramètre 'TestLength' de l'applet. Le nom de la classe à utiliser est donné par le paramètre 'Brain' de l'applet, la classe 'BKMachine1' étant utilisée par défaut. Le paramètre 'TestLenght' peut prendre comme valeur -1 si on veut tester la résolution par la classe de toutes les possibilités de jeu et n>0 si on veut tester la résolution de n jeux au hasard.

Pour faire un 'brain', il faut implémenter les méthodes suivantes dans le 'brain' :

  • public void init(MasterMind game, int thought) : permet d'initialiser la classe et qui DOIT invoquer la méthode équivalente de son ancêtre. Le paramètre 'thought' provient directement du paramètre de même nom de l'applet et permet un paramétrage de l'algorithme.
  • public int[] getAutomaticPlay() : qui retourne un coup. Le tableau doit contenir autant de colonnes qu'il y a de couleurs à trouver (mGame.getPieces()) et doit contenir dans chaque colonne un numéro de couleur compris entre 0 et 'mGame.getMaxColors()-1'.

La variable d'instance 'mGame' de l'ancêtre peut être utilisée pour obtenir des informations sur les coups précédents :

  • int mGame.getLastLine() : retourne le n° de la dernière ligne jouée. Les coups joués vont donc de 0 à 'mGame.getLastLine()'.
  • int mGame.getMaxColors() : retourne le nombre maximum de couleurs disponibles.
  • int mGame.getPieces() : retourne le nombre de couleurs par coup.
  • boolean mGame.getDoubles() : retourne s'il peut y avoir des doublons dans la solution.
  • int mGame.getPlay(l, p) : retourne la 'p'ème couleur jouée sur la ligne 'l'.
  • int mGame.getPerfect(l) : retourne le nombre de 'noirs' pour le coup l.
  • int mGame.getGood(l) : retourne le nombre de 'blancs' pour le coup l.

Cette variable permet aussi d'accéder à des méthodes utilitaires :

  • void mGame.checkPlay(int[] history, int[] play, int[] result) : teste le coup 'play' par rapport à 'history' et retourne dans result[0] le nombre de 'noirs' et dans result[1] le nombre de 'blancs'. Les colonnes de play ayant une couleur à -1 ne sont pas testées, ce qui permet d'avoir de tester un résultat intermédiaire alors qu'on n'a pas encore un coup complet.

L'ancêtre 'MasterMindMachine' fournit aussi des méthodes utilitaires :

  • boolean checkForDoubles(int color, int[] play) : retourne si la couleur 'color' se trouve déjà dans 'play'.
  • int[] getAutomaticPlay() : retourne un jeu vide, c'est-à-dire avec toutes les couleurs à -1.
  • boolean checkPlay(int[] play, int checkType) : qui vérifie la cohérence d'un coup (play) par rapport aux coups déjà joués. 'checkType' est composé de trois valeurs additionnées : CHECK_PERFECT, CHECK_GOOD et CHECK_EXACT. CHECK_PERFECT demande de tester les 'noirs', ' CHECK_GOOD' demande de tester les 'blancs', CHECK_EXACT demande de tester l'égalité (sinon il suffit d'avoir <=).

Bien entendu, je suis à votre disposition pour toute information concernant l'écriture d'un 'brain'.