IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Cartes à trier et mélanger qui ne fonctionne pas


Sujet :

Langage Java

  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut Cartes à trier et mélanger qui ne fonctionne pas
    Salut à tous
    Un petit coup de main serait le bienvenue.

    Dans mon programme, j'ai 52 cartes photos à afficher dans une grille aléatoirement.
    Ce sont toutes des paires (donc 26 X 2) qui ne doivent pas se répéter
    Je dois choisir les photos dans une liste de 100 photos.

    J'ai besoin d'une algorithme qui fonctionne mieux que la mienne (la mienne affiche 3 ou 4 photos pareilles dans les 52.. Affiche 2 photos pareilles dans les 26 premières ou 26 suivantes.) etc.

    La création et l'assignation de la liste se fait très bien. J'affiche 52 photos ... mais pas comme je le désire...

    Je dois choisir aléatoirement 26 photos dans une banque de 100 photos. Ensuite je les double et je dois remélanger les 52 cartes pour les afficher dans la grille.

    J'ai une méthode Initialise qui créé une liste de 100 cartes:

    J'ai une méthode AuHazard(0, max) qui me retourne un nombre aléatoire: Le problème est qu'il arrive qu'il me retourne encore une carte déjà choisie...

    J'ai une méthode qui MélangeLesCartes: Toute croche...

    J'ai une méthode qui les affiche... Affichage OK mais j'ai plus que des paires

    Je suis comme un peu perdu.
    Merci pour le coup de main.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    sans description précise de tes algorithmes ou de code, difficile de t'indiquer les corrections à y faire.

    Quelques pistes toutefois :

    - pour tirer 26 cartes dans une liste de 100, tu pourrais mettre tes 100 cartes dans une liste (java.util.ArrayList), utiliser java.util.Collections.shuffle(List) pour les mélanger, et prendre les 26 premières
    - autre solution, ranger tes 26 cartes tirées aléatoirement dans une Lis (ou un Set)t au fur et à mesure du tirage ; à chaque tirage aléatoire d'une carte, tu recommences le tirage tant que celle-ci est déjà dans cette List (ou Set).

    Maintenant tu as une liste de 26 cartes aléatoires parmi 100, uniques, dans un ordre quelconque. Donc 26 paires, de fait.

    Pour le placement des 26 paires dans ta grille, ta description est moins claire : est ce que tu cherches à faire un jeu du type jeu de mémoire ou le joueur voit des cartes retournées, clique sur une carte, et doit trouver l'autre carte identique pour éliminer la paire de cartes, et ainsi de suite ?
    En gros, comment tes cartes doivent être réparties dans la grille ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    Je ne connais pas encore les ArryList. Je ne suis pas encore rendu là dans Java.
    Oui, j'essai de faire un petit jeu en mettant les photos des employés qui travaillent dans mon centre.
    La grille affiche 52 cartes et ça les retourne si la 2e choisie n'est pas la même. Si elles sont pareilles, elles restent affichées.
    Voici mon code que j'ai fait pour les tris;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	private int auHasardEntre(int minimum, int maximum){
            	double t=Math.random();
            	int resultat = (int) ((maximum-minimum)*t + minimum);
            	return resultat;
    Cela est bien mais affiche régulièrement des doubles malheureusement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        private void initialiseCartes(){
             listeCartes = new Carte [nombreDePhotos];  //Assigne au complet toutes les photos
             // Répéter autant de fois qu'il y a de carte
             for (int i=0; i < nombreDePhotos; i++){
                 listeCartes[i] = new Carte("../Photos/carte"+i+".png", "../Photos/dos.png", i, "Prénom"+i, "Nom"+i, "Département"+i, "Fonction"+i);
             }
              melangerCartes();
        }
    Si je ne fais pas de tris, cela s'affiche très bien de 0 à NombreDePhotos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        private void melangerCartes(){
            int aleatoire;
            Carte temporaire;
            //Choisis 26 cartes parmis tous les contacts
            for(int i=0; i<nombreDeCartes/2; i++){  
              // Tirer un nombre au hasard entre 0 et le nombre de contacts
                aleatoire = auHasardEntre(0, listeCartes.length);   
                System.out.println(i+" Aléatoire "+aleatoire);
              // Echanger la carte d'indice i avec celle tirée au hasard
              temporaire = listeCartes[i];
              listeCartes[i] = listeCartes[aleatoire];
              listeCartes[aleatoire] = temporaire;
            }
    J'aimerais bien suivre ton cheminement

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Voici l'équivalent en List :

    Au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Carte[] listeCartes;
    tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private List<Carte> listeCartes;
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void initialiseCartes(){
        //Assigne au complet toutes les photos
        listeCartes = new ArrayList<Carte>();
        // Répéter autant de fois qu'il y a de carte
        for (int i=0; i < nombreDePhotos; i++){
            listeCartes.add( new Carte("../Photos/carte"+i+".png", "../Photos/dos.png", i, "Prénom"+i, "Nom"+i, "Département"+i, "Fonction"+i)); 
        }
        melangerCartes();
    }
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private void melangerCartes(){
        Collections.shuffle(listeCartes);
    }
    Pour prendre les 26 premières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isteCartes.subList(0,25);


    Avec un tirage aléatoire par Random, c'est que tu ne peux pas garantir de ne pas tirer 2 fois le même nombre, même dans un tirage limité (chaque valeur tirée n'est pas supprimée tant qu'on a pas tirée toutes les autres, il y a juste garantie d'équiprobabilité)

    Au sujet de ta méthode qui permutes :

    tu fais 26 fois
    - tirer 1 nombre de 0 et 99 (inclus)
    - permuter la carte correspond à l'index courant (un nombre de 0 à 25 inclus donc)
    avec une carte d'index aléatoire entre 0 et 99 (inclus), donc compris entre 0 et 25 (inclus) éventuellement, voire même avec de très faibles probabilités certes, l'index courant

    donc c'est très difficile de garantir un mélange homogène.

    avec la règle d'équiprobabilité tu as juste (un peu près) 3 fois moins de chances de tirer une cartes entre 0 et 25 et entre 26 et 99, mais tu peux en tirer, et même plusieurs fois la même, voire permuter les 2 mêmes 2 fois (genre 1 et 12, puis 12 et 1, ou bien 1 et 7, puis 7 et 12, puis 12 et 1, et du coup c'est pas mélangé) avec une très très (très très) faible probabilité..



    bien sûr avec ma méthode, il y a une probabilité non nulle que la liste ne soit
    pas triée, mais ce serait vraiment pas de bol

    La méthode shuffle fait pas loin de ce que tu fais : elle parcourt les items de la fin au début, et permute l'item courant avec un item aléatoire tiré entre le courant et le premier. un carte déjà sélectionnée donc ne sera pas repermutée.

    tu peux donc modifier ton algo si tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        private void melangerCartes(){
            int aleatoire;
            Carte temporaire;
            //Choisis 26 cartes parmis tous les contacts
            for(int i=0; i<listeCartes.length-1; i++){  
              // Tirer un nombre au hasard entre la suivante et le nombre de cartes
                aleatoire = auHasardEntre(i+1, listeCartes.length);   
                System.out.println(i+" Aléatoire "+aleatoire);
              // Echanger la carte d'indice i avec celle tirée au hasard
              temporaire = listeCartes[i];
              listeCartes[i] = listeCartes[aleatoire];
              listeCartes[aleatoire] = temporaire;
            }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    J'ai réécrit scrupuleusement le code et cela fonctionne.
    Il affiche 52 cartes différentes maintenant.

    Dans le reste de mon programme, j'ai du changer les listeCartes[i] par des List.get...
    J'avoue que j'y vais maintenant à l'aveuglette pour comprendre comment fonctionne les pointeurs pour ce ArryList...

    Mais il affiche bien toutes les 52 cartes différentes...
    Il me reste à les mettre en paires mélangées.

    J'ai ajouté un for dans la méthode initialiseCartes() pour voir ce qui est trié.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
              // Mélanger toutes les photos du dossier
              melangerCartes();
              //Devrait garder que les 26 premières déjà mélangées par melangeCartes()...
              listeCartes.subList(0,25);
                for (int i=0; i < nombreDePhotos; i++){
                    System.out.print(i+" "+listeCartes.get(i).getUrlFace()+" ");
                    System.out.print(listeCartes.get(i).getDepartement()+" ");
                    System.out.println(listeCartes.get(i).getFonction()+" ");
                }
    Mais que fait le code listeCartes.subList(0,25); exactement puisque si je met le compteur à nombreDeCartes (52...) bien il m'affiche les 52 cartes triées quand même. J'aurais cru que cette fonction garde les 26 premières cartes et efface les autres dans la liste mais non... Elles sont encore là !!!???

    J'imagine que de cette manière, je dois créer une autre liste, y ajouter 2 fois les 26 cartes et finalement remélanger le tout?

    Merci de ton aide

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Non, en effet,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes.subList(0,26);
    (j'ai fait une petit erreur, dans mon précédent post, avec l'index de fin qui est exclus alors que j'avais fait comme s'il était inclus )

    ne supprime pas les 74 autres cartes, c'est une méthode qui récupère une sous liste dans la liste d'origine (attention elle reste liée à la liste d'origine) : le résultat de l'appel est cette sous liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Carte> sousListe = listeCartes.subList(0,26);
    je ne connaissais pas la structure complète de ton programme et je ne savais pas que tu souhaitais conserver ta liste d'origine comme base pour remplir ta grille (je pensais que tu voulais conserver dans un coin ta liste de 100 photos, pour pouvoir la réutiliser à chaque nouvelle partie.

    si tu veux que ta variable listeCartes deviennent une liste de 26 paires.

    soit tu crées une nouvelle liste avec ces 26 cartes, soit tu enlèves les 74 autres.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes =  new ArrayList<Carte>(listeCartes.subList(0,26));
    ou pour supprimer les 74 autres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( listeCartes.size()>26 ) listeCartes.remove(26);
    soit tant qu'il reste plus de 26 cartes (de 0 à 25 donc), supprimer la carte d'index 26

    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes.subList(26,100).clear();
    soit enlever de la liste les cartes de 26 à 99... (ou plutôt sémantiquement, créer une sous-liste allant de 26 à 100 exclus, et retirer tous les éléments s'y trouvant)

    ensuite pour obtenir tes 26 paires il suffit d'ajouter à ta liste, les cartes qui s'y trouvent déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes.addAll(listeCartes);
    puis de la remélanger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.shuffle(listeCartes);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    Merci! Cela simplifie de beaucoup ma programmation.

    J'ai une question existentielle:
    Le constructeur d'une classe s'exécute-t'il à l'exécution de la classe ou après avoir exécuté sa partie main?
    Dans mon programme, c'est le constructeur qui appelle les autres méthodes du programme et ça fonctionne!

    Je ne vois pas la différence entre mettre mon code dans le constructeur ou dans la partie main... C'est assez mélangeant merci.
    Aussi, je ne vois pas trop l'utilité du constructeur à part de ne pas nommer cette méthode InitialisationJeuCEP qui ferait probablement le même travail...

    Dans mon programme actuel, la partie main ne fait qu'un
    public void run() {
    new JeuCEP().setVisible(true);


    et la partie constructeur fait le reste...

    Ma structure est-elle correcte ou bien je devrais obligatoirement appeler mes méthodes à la suite du main?

  8. #8
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    Quand tu dis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes.subList(0,26);
    (j'ai fait une petit erreur, dans mon précédent post, avec l'index de fin qui est exclus alors que j'avais fait comme s'il était inclus )[/I]

    Pour un tri de 26 cartes, J'affiche les résultats pour voir si le tri va bien et je ne vois pas de différence entre 25 ou 26 malheureusement. Il m'affiche un résultat de 0 à 25 (26 cartes) dans les deux cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                listeCartesTemp.subList(0, 26);
                for (int i=0; i < nombreDeCartes/2; i++){
                    listeCartes.add(i, listeCartesTemp.get(i)); //Transfère les temporaires dans la liste de travail
                   System.out.println(i+" "+listeCartesTemp.get(i).getUrlFace()+" ");
                } 
                System.out.println();
                for (int i=0; i < nombreDeCartes/2; i++){   //Ajoute le deuxième set
                    listeCartes.add((nombreDeCartes/2)+i, listeCartesTemp.get(i));
                    System.out.println(i+" "+listeCartesTemp.get(i).getUrlFace()+" ");
                }

    Mais si je comprend, je devrais écrire listeCartes.subList(0,26); au lieu de listeCartes.subList(0,25); pour avoir un résultat de 26 cartes.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Houla Quel beau mélange


    Citation Envoyé par Mario Cayer Voir le message
    Le constructeur d'une classe s'exécute-t'il à l'exécution de la classe ou après avoir exécuté sa partie main?
    C'est quoi la partie main ? Une méthode public void static main(String[] args) dans la classe ? une classe quelconque chargée de la partie principale de ton programme (à définir ce que pourrais signifier principale) ? La classe avec la méthode main(String[]) tout simplement ?

    Le constructeur d'une classe s'exécute lorsqu'on créer une instance de cette classe : quand on fait new ClasseTruc() si tu préfères.

    La méthode main(String[] args) est la possibilité syntaxique qu'offre java pour exécuter un programme java depuis la ligne de commande.

    Comme c'est une méthode statique, elle ne crée pas d'instance de la classe dans laquelle elle est déclarée, donc le constructeur ne s'exécute pas. Si tu crée une instance de cette classe dans la méthode main, il s'éxécutera, mais forcément "pendant" l'exécution de la méthode main, comme dans l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Truc {
      public void static main(String[] args) {
         new Truc();
      }
    }
    Citation Envoyé par Mario Cayer Voir le message
    Je ne vois pas la différence entre mettre mon code dans le constructeur ou dans la partie main... C'est assez mélangeant merci.
    Ca je dirais que c'est un problème d'architecture : la syntaxe permet de tout faire, voire n'importe comment. Ensuite selon la rigueur qu'on s'impose et de certains critères (maintenabilité, reusabilité, isolation, sémantique, modélisation, dépendance, etc...) les différents partie du code utile se trouveront à un endroit ou à un autre : c'est un vaste sujet, qu'on ne pourrait que difficilement aborder dans un forum

    Pour faire court : le constructeur d'une classe est fait pour initialiser. Donc à priori tout code qui n'est pas pour initialiser l'instance ne devrait pas y figurer : cela contraint la classe à être utilisée dans une manière particulière, et pas une autre (pour un constructeur particulier).

    Par exemple, regarde la classe JFileChooser de java, pour sélectionner un fichier : quand on fait new JFileChooser, ça n'affiche pas de dialogue directement, ce qui permet de décorer le dialogue avec un titre, un fichier par défaut, des filtres d'exstension de fichier, etc...au choix et non obligatoire... Si on affichait le dialogue du constructeur, il faudrait soit qu'il ait tout les paramètres possibles en argument, soit prévoir toutes les combinaisons possibles !

    Citation Envoyé par Mario Cayer Voir le message

    Dans mon programme actuel, la partie main ne fait qu'un
    public void run() {
    new JeuCEP().setVisible(true);


    Ma structure est-elle correcte ou bien je devrais obligatoirement appeler mes méthodes à la suite du main?
    sans savoir ce que tu appelles la partie main, et en avoir le code, difficile de répondre... c'est juste une classe qui instancie dans sa méthode main(String[]) une autre classe qui a la méthode run qui instancie JeuCEP qui est chargée de l'UI (une extension de JFrame())... ?

    Par exemple, ta classe avec méthode main(String[]) pourrait instancier la partie UI et la partie moteur du jeu séparément et donc avoir besoin d'un méthode intermédiaire (une méthode run() donc qui instancie les deux parties), mais si afficher ta fenêtre JeuCEP (par le setVisible(true)) permet de lancer tout le jeu, la méthode run ne sert pas à grand chose. Je veux dire que tu pourrais invoquer new JeuCEP().setVisible(true); directement dans la méthode main(String[] args) qui pourrait se trouvée dans la classe JeuCEP.

    En conclusion, je dirais que dans la mesure ou tu ne fais pas une application professionnelle/industrielle avec des contraintes de robustesse, scalabilité, maintenabilité, compatibilité, etc... ceci n'a pas grande importance, si ton programme fonctionne.
    Ensuite, si ça t'intéresse pour ta culture personnelle, très bien, mais il faudra plutôt consulter des documents (livres, cours en ligne,...) dédiés à l'architecture d'application.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mario Cayer Voir le message
    Quand tu dis:
    listeCartes.subList(0,26);
    (j'ai fait une petit erreur, dans mon précédent post, avec l'index de fin qui est exclus alors que j'avais fait comme s'il était inclus )


    Pour un tri de 26 cartes, J'affiche les résultats pour voir si le tri va bien et je ne vois pas de différence entre 25 ou 26 malheureusement. Il m'affiche un résultat de 0 à 25 (26 cartes) dans les deux cas.
    oui parce que, comme je te le disais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartesTemp.subList(0, 26);
    ne modifie pas listeCartesTemp, donc ça change rien en effet.

    si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Liste<Carte> cartes = listeCartesTemp.subList(0, 26);
    System.out.println( cartes.size());
    ça t'affichera 25

    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Liste<Carte> cartes = listeCartesTemp.subList(0, 25);
    System.out.println( cartes.size());
    ça t'affichera 24

    ton code devrait être comme ceci (en supposant que nombreDeCartes contient bien 52)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
             listeCartes.addAll(listeCartesTemp.subList(0, nombreDeCartes/2)); // on ajoute toutes les cartes de la sous-liste dans listeCartes
             listeCartes.addAll(listeCartesTemp.subList(0, nombreDeCartes/2)); // on le refait une deuxième fois
    ou plus juste sémantiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
             listeCartes.addAll(listeCartesTemp.subList(0, nombreDeCartes/2)); // on ajoute suffisament de cartes pour avoir le nombre de paires voulu dans listeCartes
             listeCartes.addAll(listeCartes); // on double toutes les cartes pour avoir des paires


    Attention :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes.add(i, listeCartesTemp.get(i)); //Transfère les
    insert la carte situé à l'index i dans listeCartesTemp, à l'index i dans listeCartes, insérer singifiant pousser ou décaler ce qui se trouvait à l'index i dans listeCartes avant. Sauf si i est égal à la taille de listeCartes (ce qui est probable dans ton cas d'exécution), ou ça ajoute à la fin, ce que tu peux faire directement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes.add(listeCartesTemp.get(i))
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mario Cayer Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                listeCartesTemp.subList(0, 26);
                for (int i=0; i < nombreDeCartes/2; i++){
                    listeCartes.add(i, listeCartesTemp.get(i)); //Transfère les temporaires dans la liste de travail
                   System.out.println(i+" "+listeCartesTemp.get(i).getUrlFace()+" ");
                } 
                System.out.println();
                for (int i=0; i < nombreDeCartes/2; i++){   //Ajoute le deuxième set
                    listeCartes.add((nombreDeCartes/2)+i, listeCartesTemp.get(i));
                    System.out.println(i+" "+listeCartesTemp.get(i).getUrlFace()+" ");
                }
    Maintenant, si tu tiens à tes deux boucles, le sublist ici ne sert à rien.
    Tu transferts les cartes que tu veux de listeCartesTemp dans listeCartes : : ça suffit pour qu'il y ait bien "nombreDeCartes" cartes dans listeCartes

    simplifie juste comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     for (int i=0; i < nombreDeCartes/2; i++){
                    listeCartes.add(listeCartesTemp.get(i)); //Transfère les temporaires dans la liste de travail
                   System.out.println(i+" "+listeCartesTemp.get(i).getUrlFace()+" ");
                } 
                System.out.println();
                for (int i=0; i < nombreDeCartes/2; i++){   //Ajoute le deuxième set
                    listeCartes.add(listeCartesTemp.get(i));
                    System.out.println(i+" "+listeCartesTemp.get(i).getUrlFace()+" ");
                }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    Merci pour tes réponses claires et précises.

    Voici mon nouveau code:

    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
    public class JeuCEP extends javax.swing.JFrame {
     
        // Constructeur
        public JeuCEP() {
            // Afficher la boite de bienvenue et explications
            new Bienvenue(this, true);
            setBounds(50,50,470,380);        // Positionner et donner une taille à la fenêtre
            initComponents();                // Placer et afficher les composants créés depuis le mode Design
            listeCartes = new ArrayList<Carte>();          // Créer un tableau d'objets de type Carte
            for (int i=0; i < nombreDePhotos; i++){        // Répéter autant de fois qu'il y a de carte: Créer une carte avec tous ses champs
                 listeCartes.add( new Carte("../Photos/carte"+i+".png", "../Photos/dos.png", i, "Prénom"+i, "Nom"+i, "Département"+i, "Fonction"+i));
            }
            Collections.shuffle(listeCartes);          // Mélanger toutes les photos du dossier de photos        
            listeCartes.subList(0, nombreDeCartes/2);  //Prends que les 26 premières de la liste  
               System.out.println(listeCartes.size());
            listeCartes.subList((nombreDeCartes/2), listeCartes.size()).clear();  //Supprime le reste des 74 cartes de la liste
               System.out.println(listeCartes.size());
            listeCartes.addAll(listeCartes); //Double les mêmes cartes à la liste pour avoir des paires (52 cartes)   
               System.out.println(listeCartes.size());
            Collections.shuffle(listeCartes);   //Remélange toutes les cartes
               System.out.println(listeCartes.size());
               System.out.println();
            for (int i=0; i < nombreDeCartes; i++){
               System.out.print(i+" "+listeCartes.get(i).getUrlFace()+" ");
               System.out.print(listeCartes.get(i).getDepartement()+" ");
               System.out.println(listeCartes.get(i).getFonction()+" ");
            }
     
            // Afficher les cartes 
            afficherLesCartesAvecEvt();
         }       
     
        // Affiche tout le jeu de cartes en y ajoutant un écouteur d'événement
        private void afficherLesCartesAvecEvt(){
             for (int i=0; i  < nombreDeCartes; i++) {
                 // Placer les cartes dans le Panneau grilleDeCartes
                  grilleDeCartes.add(listeCartes.get(i));
                  // Ajouter un écouteur d'événements sur chaque carte de la liste
                  listeCartes.get(i).addMouseListener(new java.awt.event.MouseAdapter() {
                        @Override
                        // Lorsque la carte reçoit l'événement mousReleased
                         public void mouseReleased(java.awt.event.MouseEvent evt) {
                            // exécuter la méthode :
                            carteMouseReleased(evt);
                         }
                   });
             }
        }
    Dans ma console on voit très bien que les tris s'effectuent bien:
    [IMG]C:\Users\Mario\Desktop\Capture2.JPG[/IMG]
    100 indique les 100 cartes triées
    26 la capture des 26 premières cartes mélangées
    52 la copie (ajout) des 26 cartes à la suite de la liste
    52 Les 52 cartes finalement remélangées...
    J'ai ensuite la liste complète des 26 paires mélangées sans doublons.

    Je me retrouve maintenant avec un petit problème que je n'avais pas avant.
    C'est au niveau de l'affichage de mes cartes qui fonctionnait bien : Si je mets les 3 nouvelles lignes de code en commentaire, ça continue de bien afficher mes cartes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //       listeCartes.subList((nombreDeCartes/2), listeCartes.size()).clear();  //Supprime le reste des 74 cartes de la liste
               System.out.println(listeCartes.size());
     //       listeCartes.addAll(listeCartes); //Double les mêmes cartes à la liste pour avoir des paires (52 cartes)
    Toutes mes cartes s'affichent comme prévu:
    [IMG]C:\Users\Mario\Desktop\Capture1.JPG[/IMG]
    On y voit les 52 cartes affichées en 13 colonnes et de 4 lignes (mais 52 cartes différentes)

    Lorsque je remet les lignes de code actives (plus en commentaires...) je me retrouve avec un affichage où seulement 26 cartes sont affichées avec un espace entre chacune.
    [IMG]C:\Users\Mario\Desktop\Capture3.JPG[/IMG]

    J'ai beau jouer avec les index mais rien ne change.
    Je ne crois pas qu'il y ait une erreur dans la définition des index.
    Pourtant, tout le programme se compile sans erreur...

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    déjà enlève la ligne 14 (listeCartes.subList(0, nombreDeCartes/2)) elle ne sert à rien

    ensuite, le chemin sur la capture va pas me permettre de constater quoi que ce soit, n'ayant pas accès à ton disque

    bon, en exécutant le code de construction de listeCartes, on a bien à la fin 26 paires de cartes mélangées...

    donc le problème vient de ton affichage.

    c'est le code de la classe de grilleDeCartes qu'il me faudrait, et le code de Carte.

    je soupçonne que ta classe Carte est un composant graphique, et donc tu mets 26 fois 2 fois le même composant graphique dans un layout de type grille : un composant ne pouvant être affiché qu'à un seul endroit à la fois, chaque carte n'est affichée qu'une seule fois.

    Il faut que tu distingues la notion de Carte (qui contient les informations qui representent une photo) et la notion de composant pour afficher une Carte (2 composants différents par carte)

    du coups, lorsque tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grilleDeCartes.add(listeCartes.get(i));
    tu devrais plutôt avoir quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    component =  createComponent(listeCartes.get(i));
    grilleDeCartes.add(component);
    component.addMouseListener(new java.awt.event.MouseAdapter() {
                        @Override
                        // Lorsque la carte reçoit l'événement mousReleased
                         public void mouseReleased(java.awt.event.MouseEvent evt) {
                            // exécuter la méthode :
                            carteMouseReleased(evt);
                         }
    En faisant que Carte soit une classe qui ne contient que les informations d'une carte et une classe CartePanel par exemple qui sert à afficher une instance de classe Carte

    donc createComponent(Carte carte) pourrrait être comme ça par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private CartePanel createComponenet(Carte carte) {
        return new CartePanel(carte);
    }
    En général, il faut toujours séparer la partie donnée (modèle) de la partie vue (ici je suppose un JPanel) pour avoir justement la souplesse d'avoir plusieurs composants graphiques différents qui affichent les mêmes données.

    Ou alors il te faudra faire 2 composants (donc 2 instances différente de Carte) pour chacune des des paires.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    Pour afficher les captures de l'écran, (image) sur votre forum, il me demandait un URL.
    J'ai tenté de mettre l'adresse sur mon disque croyant que l'image serait transférée en cliquant sur Envoyer la réponse mais non...
    Je vais tenter de les passer par URL de mon compte GMail Drive qui devrait faire l'affaire... (I hope...)

    (Capture de la fenêtre où toutes les cartes s'affichaient comme prévu avant le code .clear). Si je ne met pas cette ligne de code, tout est correct à l'affichage.
    https://docs.google.com/file/d/0Bwk_...it?usp=sharing

    (Capture d'écran de mes résultats sur la console). Comme on peut le voir, les tris fonctionnent bien.
    https://docs.google.com/file/d/0Bwk_...it?usp=sharing

    (Capture de la fenêtre (avec tout le code) qui donne les 26 cartes manquantes)
    https://docs.google.com/file/d/0Bwk_...it?usp=sharing

    Ce n'est que depuis que j'ai inséré le nouveau code des ListArray que j'ai ce petit problème d'affichage.
    Avant, avec le code des randoms et tabeaux je n'avais pas ce problème. À chaque fois les cartes étaient affichées correctement. Il y avait des doubles et des triples paires dans le tri mais l'affichage était correct et je pouvais retourner mes cartes comme voulu.

    La classe Carte a aussi une section Desing de NEtBeans (pour construire les grandeurs de la carte etc.) et aussi son coté source. Mais comme je te le disais, cela fonctionnait très bien avec l'ancien code.

    Chacune des carte avait une détection d’événement qui fonctionnait très bien. Si il y avait 2 cartes différentes de retournées, elles se retournaient sur le dos et je continuais à en sélectionner d'autres.

    Les paires restaient retournées et les événements sur ces 2 cartes devenaient inactives (ne se retournaient plus). Les cartes étaient vraiment distinctes comme tu pourras le constater.
    C'est pourquoi j'ai plus un penchant vers le nouveau code pour trouver l'erreur puisque tout fonctionnait avant de ce côté. (Mais je peux être dans l'erreur )

  15. #15
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut La classe Carte
    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
    import javax.swing.ImageIcon;
    // La classe Carte hérite des compoortements du composant JPanel
    public class Carte extends javax.swing.JPanel {
     
        // Définition des variables
        private int id;                //Numéro d'identification du contact
        private String urlDos;         //Adresse de la photo de dos de la carte
        private String urlFace;        //Adresse de la photo de face du contact
        private String prenom;         //Prénom du contact
        private String nom;            //Nom du contact
        private String departement;    //Département ou travaille le contact
        private String fonction;       //Emploi du contact dans le CEP
     
        // Définition du constructeur
        public Carte(String urlDeFace, String urlDeDos, int numeroID, String lePrenom,String leNom, String leDepartement, String laFonction) {
             // Affichage des composants créés en mode Design
             initComponents();
             // Initialisation des propriétés par les méthodes set
             setUrlDos(urlDeDos);
             setUrlFace(urlDeFace);
             setId(numeroID);
             setPrenom(lePrenom);
             setNom(leNom);
             setDepartement(leDepartement);
             setFonction(laFonction);
             // Par défaut une carte affiche la vue de dos
             tournerVersDos();
        }
     
        // Initialisation de la photo associée au dos de la carte
            public void setUrlDos(String temporaire){
                urlDos = temporaire;
            }    
        // Initialisation de la photo associée à la vue de face de la carte
            public void setUrlFace(String temporaire){
                urlFace = temporaire;
            }    
         // Initialisation de l'id de la carte
            public void setId(int temporaire){
               id=temporaire;
            }   
         // Initialisation de l'id de la carte
            public void setPrenom(String temporaire){
                prenom=temporaire;
            }        
         // Initialisation de l'id de la carte
            public void setNom(String temporaire){
                nom=temporaire;
            }        
         // Initialisation de l'id de la carte
            public void setDepartement(String temporaire){
                departement=temporaire;
            }              
         // Initialisation de l'id de la carte
            public void setFonction(String temporaire){
                fonction=temporaire;
            }  
        // Pour récupérer l'id de la carte
            public int getId() {
                return id;
            }  
        // Pour récupérer l'adresse de la carte de dos
            public String getUrlDos() {
                return urlDos;
            }       
        // Pour récupérer l'adresse de la carte de face
            public String getUrlFace() {
                return urlFace;
            }   
        // Pour récupérer le prénom du contact
            public String getPrenom() {
                return prenom;
            }
        // Pour récupérer le nom du contact
            public String getNom() {
                return nom;
            }
        // Pour récupérer le département où le contact travaille
            public String getDepartement() {
                return departement;
            }
        // Pour récupérer la fonction du contact
            public String getFonction() {
                return fonction;
            }
     
        // Méthode métier qui affiche la photo associée à l'url passée paramètre
         public void affichePhoto(String temporaire){
             ImageIcon icon = new ImageIcon(temporaire);
             photoLbl.setIcon(icon);
         }
     
         // Affiche la carte vue de face
         public void tournerVersFace(){
             affichePhoto(urlFace);
         }
     
         // Affiche la carte vue de dos
         public void tournerVersDos(){
             affichePhoto(urlDos);
         }
     
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
     
            photoLbl = new javax.swing.JLabel();
     
            setMaximumSize(new java.awt.Dimension(57, 91));
            setPreferredSize(new java.awt.Dimension(57, 91));
     
            photoLbl.setVerticalAlignment(javax.swing.SwingConstants.TOP);
            photoLbl.setMaximumSize(new java.awt.Dimension(57, 91));
            photoLbl.setMinimumSize(new java.awt.Dimension(57, 91));
     
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
            this.setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(photoLbl, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 57, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(photoLbl, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 91, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            );
        }// </editor-fold>                        
     
        // Déclaration de variables créées par NetBeans par l'intermédiaire du mode Design
        // Variables declaration - do not modify                     
        private javax.swing.JLabel photoLbl;
        // End of variables declaration                   
     
    }

  16. #16
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut La suite de la classe JeuCarte avec la partie grilleDeCartes
    La section grilleDeCartes est faite automatiquement par NetBeans en mode Graphique. C'est une section codée que je n'ai pas modifiée... Tout comme la section graphique de la classe Cartes.


    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
    //import java.awt.List;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
     
     
    public class JeuCEP extends javax.swing.JFrame {
     
        // Constructeur
        public JeuCEP() {
            // Afficher la boite de bienvenue et explications
            new Bienvenue(this, true);
            setBounds(50,50,470,380);        // Positionner et donner une taille à la fenêtre
            initComponents();                // Placer et afficher les composants créés depuis le mode Design
            listeCartes = new ArrayList<Carte>();          // Créer un tableau d'objets de type Carte
            for (int i=0; i < nombreDePhotos; i++){        // Répéter autant de fois qu'il y a de carte: Créer une carte avec tous ses champs
                 listeCartes.add( new Carte("../Photos/carte"+i+".png", "../Photos/dos.png", i, "Prénom"+i, "Nom"+i, "Département"+i, "Fonction"+i));
            }
            Collections.shuffle(listeCartes);          // Mélanger toutes les photos du dossier de photos          
               System.out.println(listeCartes.size());
            listeCartes.subList((nombreDeCartes/2), listeCartes.size()).clear();  //Prends que les 26 premières et supprime le reste des 74 cartes de la liste
               System.out.println(listeCartes.size());
            listeCartes.addAll(listeCartes); //Double les mêmes cartes à la liste pour avoir des paires (52 cartes)   
               System.out.println(listeCartes.size());
            Collections.shuffle(listeCartes);   //Remélange toutes les cartes
               System.out.println(listeCartes.size());
               System.out.println();
            for (int i=0; i < nombreDeCartes; i++){
               System.out.print(i+" "+listeCartes.get(i).getUrlFace()+" ");
               System.out.print(listeCartes.get(i).getDepartement()+" ");
               System.out.println(listeCartes.get(i).getFonction()+" ");
            }
     
            // Afficher les cartes 
            afficherLesCartesAvecEvt();
         }       
     
        // Affiche tout le jeu de cartes en y ajoutant un écouteur d'événement
        private void afficherLesCartesAvecEvt(){
             for (int i=0; i  < nombreDeCartes; i++) {
                 // Placer les cartes dans le Panneau grilleDeCartes
                  grilleDeCartes.add(listeCartes.get(i));
                  // Ajouter un écouteur d'événements sur chaque carte de la liste
                  listeCartes.get(i).addMouseListener(new java.awt.event.MouseAdapter() {
                        @Override
                        // Lorsque la carte reçoit l'événement mousReleased
                         public void mouseReleased(java.awt.event.MouseEvent evt) {
                            // exécuter la méthode :
                            carteMouseReleased(evt);
                         }
                   });
             }
        }
     
        // Actions à mener à l'écoute de l'événement mousReleased
        private void carteMouseReleased(java.awt.event.MouseEvent evt) {
             // Mémoriser la carte cliquée
             carteCliquee = (Carte) evt.getSource();
             // Si le drapeau aRetourner est vrai, c'est le 3ieme clic
             // les cartes doivent être retournées, si elles sont différentes
             if(aRetourner){
                   premiereCarte.tournerVersDos();
                   secondeCarte.tournerVersDos();
                   aRetourner = false;
             }
             // Si c'est le premier clic
             if(nombreDeClick ==0){
                 nombreDeClick = 1;
                 // Mémoriser la premiereCarte carte et la tourner
                 premiereCarte = carteCliquee;
                 premiereCarte.tournerVersFace();
                 // Supprimer l'écouteur d'evt pour qu'elle ne puisse plus être retournée
                 premiereCarte.removeMouseListener(premiereCarte.getMouseListeners()[0]);
             } else {
                 // Si c'est le second clic
                 if (nombreDeClick == 1){
                     nombreDeClick =0;
                     // Mémoriser la secondeCarte carte et la tourner
                     secondeCarte = carteCliquee;
                     secondeCarte.tournerVersFace();
                     // Si les cartes sont différentes
                     if( secondeCarte.getId() != premiereCarte.getId()){
                          // Mettre le drapeau aRetourner à vrai pour retourner les cartes au prochain clic
                         aRetourner = true;
                         // Remettre un écouteur sur la premier carte, pour que l'on puisse cliquer à nouveau dessus
                         premiereCarte.addMouseListener(new java.awt.event.MouseAdapter() {
                            @Override
                            public void mouseReleased(java.awt.event.MouseEvent evt) {
                                carteMouseReleased(evt);
                            }
                         });
                      }
                      else { // Si les cartes sont identiques
                           // Supprimer l'écouteur d'evt de la secondeCarte carte  pour qu'elle ne puisse plus être retournée
                           secondeCarte.removeMouseListener(secondeCarte.getMouseListeners()[0]);
                           // Compter le nombre de paires trouvées
                           nombreDePaires+=2;
                           // Si le nombre de paires trouvées vaut le nombre de cartes, la partie est finie
    //                       if (nombreDePaires == 4){
                           if (nombreDePaires == nombreDeCartes){
                              // Afficher la boite de dialogue pour proposer une nouvelle partie
                              new Message(this, true);
     
                           }
                      }
                 }
             }
     
     
     }
     
        // Retourner toutes les cartes
        private void retournerToutesLesCartes(){
           // Parcourir la liste des cartes et les tourner vers le dos
           for (int i=0; i  < nombreDeCartes; i++) {
                  listeCartes.get(i).tournerVersDos();
            }
        }
     
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
     
            grilleDeCartes = new javax.swing.JPanel();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     
            grilleDeCartes.setBorder(javax.swing.BorderFactory.createTitledBorder("   Cherchez les paires de cartes identiques"));
            grilleDeCartes.setMinimumSize(new java.awt.Dimension(470, 364));
            grilleDeCartes.setPreferredSize(new java.awt.Dimension(470, 364));
            grilleDeCartes.setLayout(new java.awt.GridLayout(4, 13));
     
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(grilleDeCartes, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 800, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(grilleDeCartes, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 400, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
     
            pack();
        }// </editor-fold>                        
     
        /**
          * Fonction main appelée au lancement de l'application
          * Rend visible la fenêtre au sein de laquelle sont placés les composants créés en mode Design
         * @param args
        */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new JeuCEP().setVisible(true);
                }          
            });      
        }
     
        // Variables globales utilisées par l'application
        private List<Carte> listeCartesTemp, listeCartes;
        private static final int nombreDeCartes = 52, nombreDePhotos = 100;
        Carte carteCliquee, premiereCarte, secondeCarte;
        boolean coteFace = false, aRetourner = false;
        int nombreDeClick=0;
        int nombreDePaires = 0;
     
     
        // Déclaration de variables créées par NetBeans par l'intermédiaire du mode Design
        // Variables declaration - do not modify                     
        private javax.swing.JPanel grilleDeCartes;
        // End of variables declaration                   
     
    }

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mario Cayer Voir le message
    Pour afficher les captures de l'écran, (image) sur votre forum, il me demandait un URL.
    il suffit que tu mettes ton image en pièce jointe et que tu copies le lien de ta pièce jointe dans la balise IMG.

    Citation Envoyé par Mario Cayer Voir le message
    (Capture de la fenêtre (avec tout le code) qui donne les 26 cartes manquantes)
    https://docs.google.com/file/d/0Bwk_...it?usp=sharing
    je me doutais un peu de ce résultat

    Citation Envoyé par Mario Cayer Voir le message
    Ce n'est que depuis que j'ai inséré le nouveau code des ListArray que j'ai ce petit problème d'affichage.
    Avant, avec le code des randoms et tabeaux je n'avais pas ce problème. À chaque fois les cartes étaient affichées correctement. Il y avait des doubles et des triples paires dans le tri mais l'affichage était correct et je pouvais retourner mes cartes comme voulu.
    je vois pas comment la même instance de composant Cartes pouvaient s'afficher à 2 endroits différents...tableau ou pas tableau... random ou pas random...un composant swing ne s'affiche qu'à un seul endroit à la fois... si tu pouvais afficher des paires, c'est que tu créais plusieurs instances de la même cartes... or dans ton premier code, tu génères 100 cartes; donc bien 100 composants différents que tu mélanges, plus ou moins...

    Citation Envoyé par Mario Cayer Voir le message
    La classe Carte a aussi une section Desing de NEtBeans (pour construire les grandeurs de la carte etc.) et aussi son coté source. Mais comme je te le disais, cela fonctionnait très bien avec l'ancien code.
    je n'utilise pas NetBeans, mais j'imagine que c'est un composant swing créé par un plugin interactif. ça change rien donc.

    question bête : tes 100 photos ? ce sont bien 100 photos de personnes différentes ? ou y'a des doubles ?

    Citation Envoyé par Mario Cayer Voir le message
    Les paires restaient retournées et les événements sur ces 2 cartes devenaient inactives (ne se retournaient plus). Les cartes étaient vraiment distinctes comme tu pourras le constater.
    C'est pourquoi j'ai plus un penchant vers le nouveau code pour trouver l'erreur puisque tout fonctionnait avant de ce côté.
    enfin c'est un peu normal quand on change une partie du code que ça "marche plus comme avant", ça peut venir du nouveau code, comme ça peut venir de l'ancien qui n'est pas adapté

    donc la on créé 26 cartes, qui sont des composants graphiques swing, et on les remets une second fois dans la liste qui les contient : on se retrouve donc avec une liste de 2 x 26 composants : et chacun d'eux ne peut s'afficher qu'à un seul endroit à la fois : dès que tu ajoutes un composant à un endroit (dans un JPanel par exemple), il s'enlève de celui dans lequel il se trouvait... c'est un fait.

    le fait que le comportement (je parle du retournement) par paires fonctionnaient que tu testes l'égalité de 2 cartes de la même paire sur l'id, donc oui ça marche,

    j'ai comme l'impression que dans ton code d'origine tu générais plusieurs fois les mêmes photos, non ? sinon je ne vois pas comment avec ton code d'origine tu pouvais avoir des cartes affichées 2, 3 ou 4 fois !


    enfin bref, ce qu'il faut c'est dupliquer chaque composant graphique : on pas s’embêter avec 2 classes, une pour les données, une pour l'UI : on va duppliqer les composants cartes :

    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCartes.addAll(listeCartes); //Double les mêmes cartes à la liste pour avoir des paires (52 cartes)
    ligne 23 dans ton dernier post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int size=listeCartes.size(); 
    for(int i=0; i<size; i++) {
       Carte carte = listeCartes.get(i);
       listeCartes.add(new Carte(carte.getUrlFace(),
        carte.getUrlDos(),
        carte.getId(),
        carte.getPrenom(),
        carte.getNom(),
        carte.getDepartement(),
        carte.getFonction()
       )); // on créé un double du composant graphique avec les mêmes informations (ici ce serait plus simple d'avoir à passer que l'id...)
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    C'est quel bouton pour les Citations donc?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    question bête : tes 100 photos ? ce sont bien 100 photos de personnes différentes ? ou y'a des doubles ?
    Oui.j'ai 100 fichiers différents que j'assigne en tout premier (avant dans un tableau, maintenant dans la liste. C'est pourquoi si je met les lignes de code en commentaire le tableau s'affiche normalement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    listeCartes.subList((nombreDeCartes/2), listeCartes.size()).clear();  //Prends que les 26 premières et supprime le reste des 74 cartes de la liste
               System.out.println(listeCartes.size());
            listeCartes.addAll(listeCartes); //Double les mêmes cartes à la liste pour avoir des paires (52 cartes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    je n'utilise pas NetBeans, mais j'imagine que c'est un composant swing créé par un plugin interactif. ça change rien donc.
    J'aimerais bien transférer le programme sur Eclipse mais tel quel, ça me donne pleins d'erreur de compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    je vois pas comment la même instance de composant Cartes pouvaient s'afficher à 2 endroits différents...tableau ou pas tableau... random ou pas random...un composant swing ne s'affiche qu'à un seul endroit à la fois... si tu pouvais afficher des paires, c'est que tu créais plusieurs instances de la même cartes... or dans ton premier code, tu génères 100 cartes; donc bien 100 composants différents que tu mélanges, plus ou moins...
    Ce soir, je vais essayer de transférer les bonnes cartes triées dans un tableau comme tu dis.
    Images attachées Images attachées    

  19. #19
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mario Cayer Voir le message
    Oui.j'ai 100 fichiers différents que j'assigne en tout premier (avant dans un tableau, maintenant dans la liste. C'est pourquoi si je met les lignes de code en commentaire le tableau s'affiche normalement.
    ce n'était pas ma question : ces photos sont elles bien des photos différentes ? (tu peux très bien avoir 100 fichiers qui sont en faite la même photo : dans ce cas tu auras 100 fois la même trombine qui s'affichera, même si c'est 100 fichiers différents)...
    parce que sinon je ne comprends pas comment tu pourrais avec le code que tu avais posté afficher la même photo 4 fois !!! le problème de ton algo de tri n'était que juste qu'il mélangeait pas assez, mais pas qu'il dupliquait quoique ce soit (ou alors j'ai mal regardé, et mal regardé à nouveau )
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  20. #20
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 52
    Par défaut
    Oui effectivement j'ai 100 photos bien différentes (Ce serait bien le bout d'en avoir des pareilles...).

    C'était d’ailleurs le but de changer le mode de tri puisque l'algorithme auHazard dupliquait les cartes. (Le numéro du compteur i devait revenir plus d'une fois)... En plus je doublais quelques cartes dupliquées ce qui me donnait 3-4 cartes dans le panel.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08
  2. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. CREATEFILEMAPPING qui ne fonctionne pas???
    Par Jasmine dans le forum MFC
    Réponses: 2
    Dernier message: 06/01/2004, 19h33
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo