import java.util.*; public class MasterMind implements Jeu { private final int nCouleurs; private final int nCases; private final int nCoups; private int [] valeurs; private int nCoupsEffectues = 0; public MasterMind(int nCouleurs, int nCases, int nCoups) { this.nCouleurs = nCouleurs; this.nCases = nCases; this.nCoups = nCoups; Random rand = new Random(); valeurs = new int[nCases]; for (int i = 0; i < nCases; i++) { valeurs[i] = rand.nextInt(nCouleurs); } } public Reponse jouer(Coup coup) throws CoupInvalideException { int [] essai = ((CoupMasterMind) coup).valeurs; if (essai.length != nCases || ++nCoupsEffectues > nCoups) { throw new CoupInvalideException(nCoupsEffectues, coup); } for (int i = 0; i < nCases; i++) { if (essai[i] < 0 || essai[i] >= nCouleurs) { throw new CoupInvalideException(nCoupsEffectues, coup); } } int nPlacees = 0; int nDecalees = 0; // Il est nécessaire de ne pas compter plusieurs fois un même // emplacement dans les décalés ou à la fois comme correct, puis // décalé. Le tableau suivant sert à savoir si un emplacement est // déja compté. boolean [] marques = new boolean[nCases]; for (int i = 0; i < nCases; i++) { marques[i] = false; } for (int i = 0; i < nCases; i++) { for (int j = 0; j < nCases; j++) { if (essai[j] == valeurs[i]) { if (i == j) { nPlacees++; if (marques[i]) { nDecalees--; } else { marques[i] = true; } } else { if (! marques[i]) { nDecalees++; marques[i] = true; } } } } } return new ReponseMasterMind(nPlacees, nDecalees); } }