Fonction qui compare deux tableaux et stocke le résultat dans un troisième
Fermé
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
-
Modifié le 5 juin 2020 à 09:52
AmWin67_15 Messages postés 11 Date d'inscription jeudi 4 juin 2020 Statut Membre Dernière intervention 12 juin 2020 - 8 juin 2020 à 22:52
AmWin67_15 Messages postés 11 Date d'inscription jeudi 4 juin 2020 Statut Membre Dernière intervention 12 juin 2020 - 8 juin 2020 à 22:52
A voir également:
- Fonction qui compare deux tableaux et stocke le résultat dans un troisième
- Fonction si et - Guide
- Fusionner deux tableaux excel - Guide
- Comment faire un tableau - Guide
- Tableaux croisés dynamiques - Guide
- Comment faire deux colonnes indépendantes dans word - Guide
3 réponses
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
Modifié le 5 juin 2020 à 09:52
Modifié le 5 juin 2020 à 09:52
le code complet est içi :
import java.util.Scanner; public class Mastermind_ho { static Scanner sc = new Scanner(System.in); static String [] TAB_REF_COLORS = {"rouge","jaune","vert","bleu","orange","blanc","violet","fuchsia"}; static int NB_COLORS = 4; static int compteur=0; static String [] combination; static String [] tabJoueur; static String [] tabCorrect= {" "," "," "," "}; public static void main(String[] args) { String [] combinaisonSecrete = generateRandomCombination(); for(int i=0;i<4;i++) { System.out.print(combinaisonSecrete[i]+ "|"); } String [] combinaisonJoueur; System.out.println(); do { combinaisonJoueur = choixNumerote(); for(int i=0;i<4;i++) { System.out.print(combinaisonJoueur[i]+ "|"); } //?? }while (compteur<=12 && (12-compteur)>0); compareColor (tabJoueur, combination); for(int k=0;k<4;k++) { System.out.print(tabCorrect[k]+ "|"); } sc.close(); } // Generate random combination of 4 colors static String [] generateRandomCombination() { String [] combination = new String[NB_COLORS]; int currentPosition = 0; while(currentPosition!=NB_COLORS) { int indexRandom = (int)(Math.random()*TAB_REF_COLORS.length); String color = TAB_REF_COLORS[indexRandom]; if(!isIn(color, combination)) { combination[currentPosition] = color; currentPosition++; } } return combination; } static boolean isIn(String iStringToFind, String [] iTab) { int size = iTab.length; for(int i=0;i<size;i++) { if(iStringToFind.equalsIgnoreCase(iTab[i])) return true; } return false; } // fonction pour récupérer le tableau de l'utilisateur static String [] choixNumerote() { String [] tabJoueur = new String[NB_COLORS]; for(int i=0;i<NB_COLORS;i++) { System.out.println(); System.out.println("Choisissez une couleur :"); tabJoueur[i]=sc.nextLine(); } compteur++; System.out.println("Il te reste : " + (12-compteur) + " tentative(s)"); if (compteur==12) { System.out.println("La partie est finie. Tu as perdu !"); } return tabJoueur; } // fonction pour faire la comparaison entre les 2 tableaux et stocker les élément en communs static void compareColor (String [] tabPlayer, String [] tabOrdi) { int sizeTj = tabPlayer.length; int sizeTm = tabOrdi.length; int k=0; for (int i=0;i<sizeTj;i++) { for(int j=0; j<sizeTm; j++) { if (tabOrdi[j]==tabPlayer[i]) { System.out.print("Vous avez trouver une couleur"); tabCorrect[k]=tabOrdi[j]; k++; } else { continue; } } } } }
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
4 juin 2020 à 20:51
4 juin 2020 à 20:51
Bonjour,
Est-ce que tu as une question ? Un problème ?
Qu'est ce que tu veux savoir ?
Est-ce que tu as une question ? Un problème ?
Qu'est ce que tu veux savoir ?
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
Modifié le 5 juin 2020 à 09:53
Modifié le 5 juin 2020 à 09:53
Bonjour,
en fait j'aimerais bien savoir comment mettre les éléments identiques dans un troisième tableau. L'idée est là mais le code ne tourne pas. Ma dernière fonction (compareColor) ne donne pas le résultat demandé même si j'ai réussi à supprimer les erreurs de compilation. j'arrive pas à déceler le truc !!!
Mes 3 premières fonctions marchent nickel maisla 4ème ça bloque : même si je rentre une couleur correcte ça ne m'affiche pas le message demandé par exemple. Le problème doit être vraiment dans le code même de la fonction :
(apès quelques modifs)
en fait j'aimerais bien savoir comment mettre les éléments identiques dans un troisième tableau. L'idée est là mais le code ne tourne pas. Ma dernière fonction (compareColor) ne donne pas le résultat demandé même si j'ai réussi à supprimer les erreurs de compilation. j'arrive pas à déceler le truc !!!
Mes 3 premières fonctions marchent nickel maisla 4ème ça bloque : même si je rentre une couleur correcte ça ne m'affiche pas le message demandé par exemple. Le problème doit être vraiment dans le code même de la fonction :
(apès quelques modifs)
static String [] compareColor (String [] tabPlayer, String [] tabOrdi) { String [] tabPlayer1 = new String[NB_COLORS]; String [] tabOrdi1 = new String[NB_COLORS]; //String [] tabCorrect= {" "," "," "," "}; int sizeTj = tabPlayer1.length; int sizeTm = tabOrdi1.length; int k=0; for (int i=0;i<sizeTj;i++) { for(int j=0; j<sizeTm; j++) { if (tabOrdi1[j]==tabPlayer1[i]) { System.out.print("Vous avez trouver une couleur"); tabCorrect[k]=tabOrdi1[j]; k++; } else { continue; } } } return tabCorrect; }
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
>
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
5 juin 2020 à 09:55
5 juin 2020 à 09:55
Je ne sais pas si ça suffira à régler tout tes problèmes, mais
Il faut utiliser la méthode equals pour comparer deux objets :
if (tabOrdi1[j]==tabPlayer1[i])est faux.
Il faut utiliser la méthode equals pour comparer deux objets :
if (tabOrdi1[j].equals(tabPlayer1[i]))
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
>
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
5 juin 2020 à 20:00
5 juin 2020 à 20:00
Merci KX .. c'est déjà ça ... je suis vraiment débutant et je vais essayer d'améliorer le code petit à petit. Dans le programme de cette année nous n'avons fait qu'effleurer la notion d'objet et de string array.
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
>
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
6 juin 2020 à 16:21
6 juin 2020 à 16:21
Bonjour,
Une autre erreur que je vois en relisant ton code, c'est que tu compares des valeurs de tabOrdi1 et tabPlayer1 mais ce sont deux tableaux vides, créés au début de la méthode, alors qu'il faudrait utiliser les tableaux tabOrdi1 et tabPlayer1, passés en paramètre.
En revanche il serait mieux que le tableau tabCorrect que retourne la méthode soit créé dans la méthode, pas en dehors (avec on ne sait quelle taille ni contenu...)
Si tu as toujours besoin d'aide, donnes moi une version plus récente de ton code, j'ai plus de temps ce week-end pour tester.
Une autre erreur que je vois en relisant ton code, c'est que tu compares des valeurs de tabOrdi1 et tabPlayer1 mais ce sont deux tableaux vides, créés au début de la méthode, alors qu'il faudrait utiliser les tableaux tabOrdi1 et tabPlayer1, passés en paramètre.
En revanche il serait mieux que le tableau tabCorrect que retourne la méthode soit créé dans la méthode, pas en dehors (avec on ne sait quelle taille ni contenu...)
Si tu as toujours besoin d'aide, donnes moi une version plus récente de ton code, j'ai plus de temps ce week-end pour tester.
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
>
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
6 juin 2020 à 22:15
6 juin 2020 à 22:15
Bonjour,
bonjour,
en tenant compte de tes remarques KX j'ai apporté ces modifications qui ont nettement améliorer le code. Mais il ne tourne pas comme il se doit. Merci de votre aide.
bonjour,
en tenant compte de tes remarques KX j'ai apporté ces modifications qui ont nettement améliorer le code. Mais il ne tourne pas comme il se doit. Merci de votre aide.
import java.util.Scanner;
public class Mastermind_ho {
static Scanner sc = new Scanner(System.in);
static String [] TAB_REF_COLORS = {"rouge","jaune","vert","bleu","orange","blanc","violet","fuchsia"};
static int NB_COLORS = 4;
static int ColCor=0;
static int indexCor=0;
static String [] tabPlayer = {" "," "," "," "};
static String [] combination = new String[NB_COLORS];
static String [] tabJoueur = new String[NB_COLORS];
static int compteur=0;
public static void main(String[] args) {
// appel 1ère fonction pour générer des couleurs aléatoires :
String [] combinaisonSecrete = generateRandomCombination();
for(int i=0;i<4;i++) {
System.out.print(combinaisonSecrete[i]+ "|");
}
System.out.println();
// appel 2ème fonction pour récupérer la combinaison du joueur et la comparer avec celle de l'ordi :
choixNumerote();
compareColor (tabJoueur, combinaisonSecrete);
do {
System.out.println("Il te reste : " + (12-compteur) + " tentative(s)");
System.out.println();
compteur++;
if (compteur==12) {
System.out.println("La partie est finie. Tu as perdu !");
break;
}
}while (compteur<=12 && (12-compteur)>0);
System.out.println();
// Comparaison :
String [] tabResult = compareColor (tabJoueur, combinaisonSecrete);
for(int k=0;k<4;k++) {
System.out.print(tabResult[k]+ "|");
}
System.out.println();
System.out.println("Vous avez trouver "+ ColCor+ " couleur(s) correctes");
System.out.println("Vous avez trouver "+ indexCor+ " emplacement(s) correctes");
sc.close();
}
// Generate random combination of 4 colors
static String [] generateRandomCombination() {
String [] combination = new String[NB_COLORS];
int currentPosition = 0;
while(currentPosition!=NB_COLORS) {
int indexRandom = (int)(Math.random()*TAB_REF_COLORS.length);
String color = TAB_REF_COLORS[indexRandom];
if(!isIn(color, combination)) {
combination[currentPosition] = color;
currentPosition++;
}
}
return combination;
}
static boolean isIn(String iStringToFind, String [] iTab) {
int size = iTab.length;
for(int i=0;i<size;i++) {
if(iStringToFind.equalsIgnoreCase(iTab[i])) return true;
}
return false;
}
// Collect user combination of 4 colors
static String [] choixNumerote() {
// String [] tabJoueur = new String[NB_COLORS];
for(int i=0;i<NB_COLORS;i++) {
System.out.println();
System.out.println("Choisissez une "+(i+1)+" ère couleur :");
tabJoueur[i]=sc.nextLine();
System.out.print(tabJoueur[i]+ "|");
} return tabJoueur;
}
// fonction pour faire la comparaison entre les 2 tableaux et stocker les élément en communs
static String [] compareColor (String [] tabJ, String [] comb) {
String [] tabCorrect = new String[NB_COLORS];
int sizeTj = tabJ.length;
int sizeTm = comb.length;
int k=0;
do {
for (int i=0;i<sizeTj;i++) {
for(int j=0; j<sizeTm; j++) {
if (comb[j].equals(tabJ[i]) && j==i) {
ColCor++;
indexCor++;
tabCorrect[k]=comb[j];
k++;
break;
}
else if (comb[j].equals(tabJ[i]) && j!=i) {
ColCor++;
tabCorrect[k]=comb[j];
k++;
break;
}
else {
continue;
}
}
}
} while (k<4);
return tabCorrect;
}
}
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
Modifié le 7 juin 2020 à 02:41
Modifié le 7 juin 2020 à 02:41
Je m'approche de la solution. Qu'est que t'en pense KX ?
import java.util.Scanner; public class Mastermind_ho { static Scanner sc = new Scanner(System.in); static String [] TAB_REF_COLORS = {"rouge","jaune","vert","bleu","orange","blanc","violet","fuchsia"}; static int NB_COLORS = 4; static int ColCor=0; static int indexCor=0; static String [] tabPlayer = {" "," "," "," "}; static String [] combination = new String[NB_COLORS]; static String [] tabJoueur = new String[NB_COLORS]; static int compteur=0; static String [] tabCorrect = {" "," "," "," "}; public static void main(String[] args) { // appel 1ère fonction pour générer des couleurs aléatoires : String [] combinaisonSecrete = generateRandomCombination(); for(int i=0;i<4;i++) { System.out.print(combinaisonSecrete[i]+ "|"); } System.out.println(); // appel 2ème fonction pour récupérer la combinaison du joueur et la comparer avec celle de l'ordi : choixNumerote(); while (compteur<=12 && (12-compteur)>0) { compareColor (tabJoueur, combinaisonSecrete); for(int x=0;x<4;x++) { System.out.print(tabCorrect[x]+ "|"); } sc.close(); } } // Generate random combination of 4 colors static String [] generateRandomCombination() { String [] combination = new String[NB_COLORS]; int currentPosition = 0; while(currentPosition!=NB_COLORS) { int indexRandom = (int)(Math.random()*TAB_REF_COLORS.length); String color = TAB_REF_COLORS[indexRandom]; if(!isIn(color, combination)) { combination[currentPosition] = color; currentPosition++; } } return combination; } static boolean isIn(String iStringToFind, String [] iTab) { int size = iTab.length; for(int i=0;i<size;i++) { if(iStringToFind.equalsIgnoreCase(iTab[i])) return true; } return false; } // Collect user combination of 4 colors static String [] choixNumerote() { // String [] tabJoueur = new String[NB_COLORS]; for(int i=0;i<NB_COLORS;i++) { System.out.println(); System.out.println("Choisissez une couleur :"); tabJoueur[i]=sc.nextLine(); } for(int k=0; k<NB_COLORS;k++) { System.out.print(tabJoueur[k]+ "|"); } return tabJoueur; } // fonction pour faire la comparaison entre les 2 tableaux et stocker les élément en communs static String [] compareColor (String [] tabJ, String [] comb) { int sizeTj = tabJ.length; int sizeTm = comb.length; int k=0; for (int i=0;i<sizeTj;i++) { for(int j=0; j<sizeTm; j++) { if (comb[j].equals(tabJ[i]) && j==i) { ColCor++; indexCor++; tabCorrect[k]=tabJ[i]; k++; break; } else if (comb[j].equals(tabJ[i]) && j!=i) { ColCor++; tabCorrect[k]=tabJ[i]; k++; break; } else { continue; } } } System.out.println("Vous avez trouver "+ ColCor+ " couleur(s) correctes"); System.out.println("Vous avez trouver "+ indexCor+ " emplacement(s) correctes"); compteur++; return tabCorrect; } }
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
7 juin 2020 à 11:48
7 juin 2020 à 11:48
Bonjour,
Il faut faire attention à la portée des variables, il vaut mieux les mettre au plus proche du code et donc éviter au maximum les variables static, tu devrais au contraire avoir beaucoup plus de variables locales.
Pour bien représenter ton problème je pense que ton tabCorrect ne devrait pas contenir des couleurs, mais les indications de positions "couleur bien placée", "couleur mal placée" ou "couleur invalide" qui doivent être annoncés au joueur après sa proposition.
Voici un exemple qui se base sur ce principe :
NB. Il ne faut pas faire sc.close() quand cela concerne System.in car il sera impossible de le rouvrir.
Il faut faire attention à la portée des variables, il vaut mieux les mettre au plus proche du code et donc éviter au maximum les variables static, tu devrais au contraire avoir beaucoup plus de variables locales.
Pour bien représenter ton problème je pense que ton tabCorrect ne devrait pas contenir des couleurs, mais les indications de positions "couleur bien placée", "couleur mal placée" ou "couleur invalide" qui doivent être annoncés au joueur après sa proposition.
Voici un exemple qui se base sur ce principe :
static final String OUI = "couleur bien placée"; static final String PRESQUE = "couleur mal placée"; static final String NON = "couleur invalide"; static boolean compareColor(String[] tabJ, String[] comb) { System.out.println("Essai n°" + compteur); String[] tabCorrect = new String[NB_COLORS]; for (int i = 0; i < NB_COLORS; i++) { tabCorrect[i] = NON; } // Recherche des couleurs bien placées int nbOui = 0; for (int i = 0; i < NB_COLORS; i++) { if (tabJ[i].equals(comb[i])) { tabCorrect[i] = OUI; nbOui++; } } if (nbOui == NB_COLORS) { System.out.println("Vous avez gagné en " + compteur + " essais !"); return true; // gagné } // Recherche des couleurs mal placées int nbPresque = 0; for (int i = 0; i < NB_COLORS; i++) { if (tabCorrect[i].equals(NON)) { for (int j = 0; j < NB_COLORS; j++) { if (tabCorrect[j].equals(NON) && tabJ[i].equals(comb[j])) { tabCorrect[i] = PRESQUE; nbPresque++; break; } } } System.out.println(tabJ[i] + ": " + tabCorrect[i]); } System.out.println("Vous avez trouvé " + nbOui + " couleur(s) bien placée(s)"); System.out.println("Vous avez trouvé " + nbPresque + " couleur(s) mal placée(s)"); return false; // perdu }
NB. Il ne faut pas faire sc.close() quand cela concerne System.in car il sera impossible de le rouvrir.
AmWin67_15
Messages postés
11
Date d'inscription
jeudi 4 juin 2020
Statut
Membre
Dernière intervention
12 juin 2020
>
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
8 juin 2020 à 22:52
8 juin 2020 à 22:52
Super ! merci beaucoup KX. je vais voir ça ce soir ... je suis en plein période d'examen.
Ton code est plus léger et plus clair.
Ton code est plus léger et plus clair.