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
Bonjour, je suis vraiment débutant en Java. Je dois faire un exo où une fonction compare deux tableaux String (un généré aléatoirement par l'ordi et l'autre choisi par l'utilisateur. Et chaque fois qu'elle trouve un élément identique, elle le case dans un troisième tableau lui aussi forcement String.

J'ai fait ça (je poste la main ainsi que la fonction en question, pour alléger je ne poste pas la fonction aléatoire sauf si nécessaire) :

--------------- la main
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();
    }

--------------- La fonction
    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;
                        }
                    }
            }
A voir également:

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
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;
                        }
                    }
            }
 
        }
}
0
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
Bonjour,

Est-ce que tu as une question ? Un problème ?
Qu'est ce que tu veux savoir ?
0
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
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)

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;
        }
0
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
Je ne sais pas si ça suffira à régler tout tes problèmes, mais
if (tabOrdi1[j]==tabPlayer1[i])
est faux.
Il faut utiliser la méthode equals pour comparer deux objets :
if (tabOrdi1[j].equals(tabPlayer1[i]))
0
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
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.
0
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
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.
0
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
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.


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;
}
}
0
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
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; 
    } 
}
0
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
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 :

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.
0
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
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.
0