Bonjour/Bonsoir à tous,

Toujours sur mon code du jeu Mastermind, je me retrouve bloqué sur la ArrayList saisie par le joueur.
En effet, lors de la première tentative, tout va bien, les 4 couleurs sont bien enregistrées dans la ArrayList mais si le joueur ne trouve pas la combinaison du premier coup, lorsqu'il souhaite ressaisir des couleurs (méthode saisieJoueurClavier), ce sont celles de la première saisie présentent (quelque soit le nombre de tentatives).
Pourquoi la méthode ne veut-elle inscrire les nouvelles saisies par le joueur ?

Question bonus : Une couleur ne peut pas être présente plusieurs fois dans la combinaison du joueur. J'ai beau chercher, je n'arrive pas à trouver un algorithme qui me permette de vérifier si une couleur à déjà été inscrite par la joueur losr de la saisie des 4 couleurs.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import java.util.*;
 
class Mastermind {
 
    public static final ArrayList<String> couleurs = new ArrayList() {{
        add("Rouge");
        add("Jaune");
        add("Vert");
        add("Bleu");
        add("Orange");
        add("Blanc");
        add("Violet");
        add("Fuchsia");
    }};
 
    /**
     * Lancement du programme Mastermind
     *
     * @param args Non utilisé
     */
    public static void main(String[] args) {
        mastermind(12);
    }
 
    /**
     * Le programme génère une combinaison de nbElementsCombinaisonCouleur.
     * Le joueur cherche à la deviner et fait des propositions de combinaisons.
     * Le programme indique à chaque coup au joueur combien d'éléments
     * sont bien devinés.
     * Le jour a droit à maxTentativesJoueur tentatives.
     *
     * @param maxTentativesJeu Nombre de tentatives maximum au joueur pour trouver la bonne combinaison
     */
    public static void mastermind(int maxTentativesJeu) {
 
        int nombreTentativesJoueur = 0;
 
        messageDebutDuJeu();
        final ArrayList<String> listeCombinaisonCouleur = generationListeCombinaisonCouleur(4);
        final ArrayList<String> combinaisonJoueur = saisieJoueurClavier(4);
        boolean comparaisonJoueur;
 
        do{
            nombreTentativesJoueur++;
            saisieJoueurClavier(4);
            comparaisonJoueur = comparaisonJeuJoueur(listeCombinaisonCouleur, combinaisonJoueur, 4);
        }while(!comparaisonJoueur && (nombreTentativesJoueur < maxTentativesJeu));
 
        if(comparaisonJoueur) System.out.println("Bravo");
        else System.out.println("Dommage");
 
    }
 
    /**
     * Affiche le message de bienvenue et les explications pour jouer
     */
    public static void messageDebutDuJeu() {
        System.out.println("Vous devez trouver, en 12 coups maximum, une combinaison de\n4 couleurs choisie par ce programme");
        System.out.println();
        System.out.println("Vous devez deviner cette combinaison, c’est-à-dire les couleurs et leurs positions.");
        System.out.println();
    }
 
    /**
     * Génère une combinaison aléatoire de
     * nbElementsCombinaison couleur unique
     *
     * @param nbElementsCombinaisonCouleur Nombre d'éléments de la combinaison de couleurs
     */
    public static ArrayList<String> generationListeCombinaisonCouleur(int nbElementsCombinaisonCouleur) {
 
        // Création d'une copie de l'ArrayList couleur
        ArrayList<String> cloneListeCouleurs = (ArrayList<String>) couleurs.clone();
 
        // Mélange de l'ArrayList cloneListeCouleurs
        Collections.shuffle(cloneListeCouleurs);
 
        // Création d'une ArrayList avec les 4 couleurs aléatoire
        ArrayList<String> listeCombinaisonCouleur = new ArrayList<>();
        for (int i = 0; i < nbElementsCombinaisonCouleur; i++) listeCombinaisonCouleur.add(cloneListeCouleurs.get(i));
 
        return listeCombinaisonCouleur;
    }
 
    /**
     * Permet de lire la combinaison proposée par le joueur.
     *
     * @param nbElementsCombinaisonCouleur Nombre d'éléments de la combinaison de couleurs
     */
    public static ArrayList<String> saisieJoueurClavier(int nbElementsCombinaisonCouleur) {
 
        ArrayList<String> combinaisonJoueur = new ArrayList<>();
        combinaisonJoueur.clear();
        Scanner sc = new Scanner(System.in);
 
        // Récupération des données du Joueur
        System.out.print("Entrez les ");
        System.out.print(nbElementsCombinaisonCouleur);
        System.out.println(" couleurs de votre proposition ");
        System.out.println("(terminez par un retour chariot) :");
 
        for (int i = 0; i < nbElementsCombinaisonCouleur; i++) {
            String saisieClavier = sc.nextLine();
 
            switch (saisieClavier) {
                case "Rouge", "Jaune", "Vert", "Bleu", "Orange", "Blanc", "Violet", "Fuchsia" -> {
                    System.out.println("Couleur enregistrée");
                    combinaisonJoueur.add(saisieClavier);
                }
                default -> {
                    System.out.println("Veuillez indiquer une couleur dans celles prosposées");
                    i--;
                }
            }
        }
 
        System.out.println("Combinaison enregistrée");
        System.out.println("");
 
        return combinaisonJoueur;
    }
 
    /**
     * Compare la combinaison du jeu de celle inscrite par le joueur
     *
     * @param listeCombinaisonCouleur      Tableau de couleurs généré par le programme
     * @param combinaisonJoueur            Tableau des couleurs saisies par le joueur
     * @param nbElementsCombinaisonCouleur Nombre d'éléments de la combinaison de couleurs
     * @return true si la combinaison du joueur est correcte, sinon false
     */
    public static boolean comparaisonJeuJoueur(ArrayList<String> listeCombinaisonCouleur,
                                               ArrayList<String> combinaisonJoueur,
                                               int nbElementsCombinaisonCouleur) {
 
        System.out.println("Système de vérification pour le codeur :");
        System.out.println(listeCombinaisonCouleur);
        System.out.println(combinaisonJoueur);
        System.out.println("");
 
        // Déclaration de variables
        boolean boolCombinaison = true;
        int couleurOK = 0;
        int couleurMalPlace = 0;
 
        /* Cette boucle sert à vérifier les éléments trouvés et bien placés
        Si une seule couleur est fausse, la combinason proposée par le joueur est erronée*/
        for (int i = 0; i < nbElementsCombinaisonCouleur; i++) {
            if (listeCombinaisonCouleur.get(i).equals(combinaisonJoueur.get(i))) {
                couleurOK++;
            } else {
                boolCombinaison = false;  // Si une seule couleur est fausse, la combinason proposée par le joueur est erronée
            }
        }
 
        // Affiche les nombre de couleurs trouvées et bien placées
        switch (couleurOK) {
            case 4 -> System.out.println("Félicitations, vous avez trouvé la combinaison !!");
            case 3 -> System.out.println("Vous avez 3 couleurs bien placées");
            case 2 -> System.out.println("Vous avez 2 couleurs bien placées");
            case 1 -> System.out.println("Vous avez 1 couleur bien placée");
            case 0 -> System.out.println("Vous n'avez aucune couleur bien placées");
        }
 
        // Cette boucle sert à vérifier les éléments trouvés mais mal placés
        for (int i = 0; i < nbElementsCombinaisonCouleur; i++) {
            if (!listeCombinaisonCouleur.get(i).equals(combinaisonJoueur.get(i))) {
                int j = 0;
                boolean trouveMalPlaces = false;
                while ((j < nbElementsCombinaisonCouleur) && !trouveMalPlaces) {
                    if (listeCombinaisonCouleur.get(i).equals(combinaisonJoueur.get(j))) {
                        couleurMalPlace++;
                        trouveMalPlaces = true;
                    }
                    j++;
                }
            }
        }
 
        //Affiche le nombre de couleurs mal placées
        switch (couleurMalPlace) {
            case 4 -> System.out.println("Vous avez 4 bonnes couleurs mais mal placées");
            case 3 -> System.out.println("Vous avez 3 bonnes couleurs mais mal placées");
            case 2 -> System.out.println("Vous avez 2 bonnes couleurs mais mal placées");
            case 1 -> System.out.println("Vous avez 1 bonne couleur mais mal placée");
        }
 
        return boolCombinaison;
    }
}