Faire jouer l'ordinateur au Mastermind |
Finder est à rendre par courier électronique à
Luc.Maranget@inria.fr avant le 9 janvier, 23h59.
Trop tard ! La solution.
Dans le TP noté c'est l'ordinateur qui choisi le secret et le joueur humain qui tente de le découvrir. Il s'agit maintenant de remplacer le joueur humain par un programme.
Comme dans l'examen, le jeu est simplifié. Étant donné un entier n, le secret est une suite ordonnée de n couleurs distinctes parmi 2n, notées comme les entiers 1, …, 2n.
Le joueur qui choisit le secret est, comme dans l'examen, représenté par
un objet de la classe MasterMind, crée par le constructeur
MasterMind(int n).
Le code de cette classe MasterMind
ainsi que des classes List et
Result sont donnés. Ces codes sont à peu près
conformes aux descriptions de l'énoncé.
Les objets de la classe MasterMind sont en outre équipés d'une méthode
toString qui permet l'affichage du secret.
Si l'entier n est raisonnablement petit, on peut avoir recours à l'approche suivante qui ne brille pas par sa subtilité.
| A(k+1, C) = |
| { (c ; X) | X ∈ A(k, C∖{c}) }, A(0, C) = { ∅ } |
MasterMind une des combinaisons possibles g,
en invoquant sa méthode processGuess. Le joueur répond par un objet r
de la classe Result.
winningResult
du joueur MasterMind) le jeu est fini.
Result r, et recommencer
en 2.
Le jeu est contrôlé par un arbitre Referee
dont voici la méthode main (un peu simplifiée).
C'est-à-dire que l'arbitre lance une partie pour n donné en argument (ou 5 par défault), contrôle la validité de la réponse du trouveur automatique et affiche le nombre d'essais utilisés.
Plus précisément votre trouveur est la classe Finder dont la
méthode static List find(MasterMind m) renvoie le secret
caché dans l'objet m (notez que la taille du secret n'est pas secrète, c'est m.length).
Bien évidemment, votre méthode
find ne doit pas faire appel à la méthode toString de m,
mais seulement aux méthodes processGuess et winningResult.
Finder peut se dispenser du dernier coup de vérification
de sa solution et laisser ce soin à l'arbitre. Implémenter cette astuce.
MasterMind tricheur
qui donne des réponses incohérentes. Identifier cette possibilité et dénoncer le tricheur en invoquant
la méthode cheaterSpotted() de la classe Referee.
Finder doit traiter
le cas n=6 sans difficulté.
Essayer de resoudre n=7 en un temps et surtout une consommation mémoire raisonnable.
Ce document a été traduit de LATEX par HEVEA