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