Vérifier si un élément est présent dans un tableau [Résolu]

Signaler
Messages postés
11
Date d'inscription
samedi 10 avril 2021
Statut
Membre
Dernière intervention
9 mai 2021
-
Messages postés
11
Date d'inscription
samedi 10 avril 2021
Statut
Membre
Dernière intervention
9 mai 2021
-
Bonjour,
je suis débutant en java je dois créer un Master Mind
je demande à l'utilisateur de saisir 4 couleur, je les récupère dans un tableau.
je voudrais interdire de saisir deux fois la même couleur parmi les quatre en vérifiant si elles sont présentes dans le tableau, avec un message "couleur déjà saisie"
Ma condition ne marche pas, j'ai le message "couleur déjà saisie" à chaque passage dans la boucle même si la couleur n'est pas identique.
System.out.println("\nEssai n° " + (compteur+1) + "/" + maxEssais + " :");
for (int i = 0; i < combinaisonSecrete.length; i++) {
    System.out.print("Entrez la couleur N°" + (i + 1) + ": ");
    lesCouleurs = clavier.nextLine();
    combinaisonJoueur[i] = lesCouleurs;
    if (combinaisonJoueur[i].contains(lesCouleurs)) {
        System.out.println("couleur deja saisie");
    }
}

merci pour votre aide
Configuration: Windows / Chrome 90.0.4430.93

6 réponses

Messages postés
16360
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843
Bonjour,

Si tu fais
combinaisonJoueur[i] = lesCouleurs;
c'est normal que
if (combinaisonJoueur[i].contains(lesCouleurs))
soit toujours vrai puisque les deux valeurs sont identiques...

Mais je n'ai pas bien compris à quoi était censé correspondre cette condition dans le jeu du Mastermind pour t'aider à la corriger comme il faut.
Messages postés
11
Date d'inscription
samedi 10 avril 2021
Statut
Membre
Dernière intervention
9 mai 2021

Bonsoir
Oui en réfléchissant, je me suis rendu compte que c'est la même chose...
A chaque partie il y a une combinaison de 4 couleur aléatoire sur 8,
puis un joueur doit choisir aussi 4 couleurs parmi 8 couleurs et les positionner, donc j'ai créé cette boucle pour poser la question 4 fois "entrez la couleur n 1" puis la 2eme etc..
Les 4 couleurs vont dans le tableau combinaisonJoueur.
je voulais verrouiller le fait que le joueur ne puisse pas me donner une même couleur plusieurs fois parmi les quatre. Une fois qu'une couleur est saisie, je pensais mettre une condition pour qu'il y est une vérification dans ce tableau et que la couleur choisie par le joueur ne soit pas déjà le tableau.
merci
Messages postés
16360
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843
"je voulais verrouiller le fait que le joueur ne puisse pas me donner une même couleur plusieurs fois parmi les quatre"
En vrai dans le Mastermind tu peux très bien avoir plusieurs fois la même couleur dans la combinaison à deviner.

Mais techniquement tu pourrais faire comme ça :
System.out.println("\nEssai n° " + (compteur+1) + "/" + maxEssais + " :");
for (int i = 0; i < combinaisonSecrete.length; i++) {
    System.out.print("Entrez la couleur N°" + (i + 1) + ": ");
    combinaisonJoueur[i] = clavier.nextLine();
    for (int j = 0; j < i; j++) {
        if (combinaisonJoueur[i].equalsIgnoreCase(combinaisonJoueur[j])) {
            System.err.println("Le " + combinaisonJoueur[j] + " a déjà été choisi pour la couleur N°" + (j+1));
            i--; // avec le i++ du for ça s'annule pour recommencer avec la même valeur i
        }
    }
}
Messages postés
11
Date d'inscription
samedi 10 avril 2021
Statut
Membre
Dernière intervention
9 mai 2021

Bonjour
je vous remercie pour votre aide et de me consacrer un peu de temps. En fait c'est un TD qui impose cela :
● Une couleur ne peut pas être présente plusieurs fois dans la combinaison du joueur.
Etant débutant j'essaye de faire un code vraiment basique j'ai juste une dizaine de cours en java. Je n'ai pas de vrais enjeux, la formation est juste pour le plaisir à mon age....mais avec une envie de réussir et de comprendre le code.
Maintenant le plus dur reste à faire :) indiquer aux joueur juste le nombre de couleurs devinées bien placées et mal placées. Pour cela je vais essayer de faire deux nouvelles boucles for... et me creuser la tête:)
merci encore
Messages postés
11
Date d'inscription
samedi 10 avril 2021
Statut
Membre
Dernière intervention
9 mai 2021

Bonjour
je fais encore appel à votre aide hier j'ai fais plusieurs tentatives mais je dois mal me prendre
Une fois récupéré la combinaison du joueur avec le code que vous m'avez conseillé et qui marche très bien, j'ai crée une nouvelle boucle for pour récupérer dans une variable(correctPlace) le nombre de couleurs bien placées. Si les 4 couleurs sont exactes la partie est gagnée mon code marche. Si la combinaison n'est pas exacte je dois envoyer un message au joueur "vous avez n couleurs bien placées et n couleurs mal placées(sans donner plus de précisions).
Le problème est que si je n'ai pas la combinaison gagnante mais juste quelques couleur, à chaque tentative la variable qui stocke le nombre de couleurs bien placées s'additionne avec les couleurs bonnes de la tentative précédente. Du coup il renvoi le message en additionnant toutes les couleurs bonnes des autres tentatives. Voici mon code :

for (int i = 0; i < combinaisonSecrete.length; i++) {
if (combinaisonJoueur[i].equals(combinaisonSecrete[i])) {
correctPlace++;
}
}

System.out.println("\ncouleurs bien placées : " + correctPlace);
System.out.println();
if (correctPlace == 4) {
System.out.println("Vous avez gagné en " + compteur + " essais");
break;
} else if (compteur == 12) {
System.out.println("Vous avez perdu");
break;
}

J'ai mis tout mon code du programme dans une boucle while :
while (correctPlace != 4 || compteur < maxEssais) {

A la suite de la boucle for je vais en créer une autre pour le nombre de couleurs exactes mais mal placées. Y a t il une méthode pour comparer deux tableau et renvoyer juste le nombre de couleurs en communs même si ils ne sont pas au même indice?
Merci pour votre aide mais je coince un peu sur ces deux boucles.
bonne journée
Messages postés
16360
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843
Bonjour,

"à chaque tentative la variable qui stocke le nombre de couleurs bien placées s'additionne avec les couleurs bonnes de la tentative précédente"
Il faudrait remettre la valeur à zéro à chaque fois que tu commences la somme.

Quant aux couleurs mal placées tu peux imbriquer une autre boucle for pour ne pas regarder uniquement la combinaisonSecrete du même indice, mais toutes les valeurs (grâce à la propriété que toutes les couleurs sont différentes).

correctPlace = 0;
incorrectPlace = 0;
for (int i = 0; i < combinaisonJoueur.length; i++) {
    for (int j = 0; j < combinaisonSecrete.length; j++) {
        if (combinaisonJoueur[i].equalsIgnoreCase(combinaisonSecrete[j])) {
            if (i == j) {
                correctPlace++;
                System.out.println("Le " + combinaisonJoueur[i] + " est bien placé");
            } else {
                incorrectPlace++;
                System.out.println("Le " + combinaisonJoueur[i] + " existe, mais il est mal placé");
            }
        }
    }
}
Messages postés
11
Date d'inscription
samedi 10 avril 2021
Statut
Membre
Dernière intervention
9 mai 2021

Bonjour
j'avais essayé de mettre la variable à 0 mais je pense la mettre au mauvaise endroit
parce que quand je mettais la variable à 0 et j'avais les 4 couleurs bonnes, le programme ne s'arrêtais pas.
Pour un débutant l'imbrication des boucles n'est pas facile à comprendre je pense il faut pratiquer souvent....
Je suis impressionné par votre facilité.... J'ai testé votre code mais je pense j'ai du mal m'expliquer. Au joueur je dois juste lui envoyé un message à chaque tentative sans lui spécifier les couleurs.
Exemple : Nombre de couleurs correctes 1 , nombre de couleurs bien placées 2. Sans lui spécifier lesquelles.
J'ai un peu reflechi à votre code et j'ai mis en place des conditions et ca marche peut être ce n'est pas trop pro mais mon programme à l'air de marcher :
 correctPlace = 0;
correctCouleur = 0;
for (int i = 0; i < combinaisonJoueur.length; i++) {
for (int j = 0; j < combinaisonSecrete.length; j++) {
if (combinaisonJoueur[i].equalsIgnoreCase(combinaisonSecrete[j])) {
if (i == j) {
correctPlace++;
} else {
correctCouleur++;
}
}
}
}
if (correctPlace < 4){
System.out.println("Couleurs bien placées " + correctPlace + ", Couleurs correctes, " + correctCouleur );
System.out.println();
} else if(correctPlace == 4) {
System.out.println("Bravo! Vous avez gagné! ");
break;
} else if (compteur == 12) {
System.out.println("Vous avez perdu, la combinaison était: ");
break;
}

merci pour le temps que vous me consacrez.
Messages postés
16360
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843
Il suffit d'afficher correctPlace et incorrectPlace à la fin des boucles (et du coup enlever l'affichage des couleurs), mais ça ne change rien à l'imbrication de boucles ou aux conditions.
Messages postés
11
Date d'inscription
samedi 10 avril 2021
Statut
Membre
Dernière intervention
9 mai 2021

merci c'était fait.
bonne journée.