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

Collection et Stream Java Discussion :

Créer un objet plateau contenant un tableau de cases


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut Créer un objet plateau contenant un tableau de cases
    Bonjour,
    J'ai un projet a faire en Java. C'est un jeu de société où des tortues doivent avancer sur 10 cases a l'aide de cartes. Les tortues avancent et peuvent aussi reculer. Elle peuvent aussi être toutes sur la même case.

    Il faut donc créer un objet Plateau qui va contenir un tableau Case[4][9].
    Mais je ne sais pas comment assigne une tortue a une case et aussi savoir l'afficher en console (Superposé ou non).

    Des bouts de codes pour vous montrez plus facilement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      public Plateau (int i) { 
    	  cases = new Case[i];
    	  for (int j=0;j<i;j++)
    		  cases[j]=new Case();
      };
    Dite moi si vous voulez d'autres bout de java
    Merci d'avance !

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Une classe Plateau, qui a un attribut de type tableau de Case, s'écrit tout simplement :

    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
    public class Plateau {
     
        private final Case[][] cases;
     
        public Plateau() {
            // initialisation du tableau :
            cases = new Case[4][9];
            for(int i=0; i<cases.length; i++) {
                 for(int j=0; j<cases[i].length; j++) {
                     cases[i][j]=new Case();
                 }
            }
        }
     
    }
    Pour afficher des cases avec les tortues en console, il faudrait connaitre le nombre maximal de tortues en tout, par case. Doit-on afficher chaque tortue ? Doit-on afficher chaque tortue avec une chaîne distincte (genre "tortue1", "tortue2"...), ou par un caractère commun (par exemple, "*") ? N'y a-t-il pas une façon spéciale pour simpifier l'affichage (par exemple, affiche juste le nombre de tortues dans la case) ?
    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
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour assigner des tortues aux cases, il y a 2 approches :

    1. Une tortue connait la case dans laquelle elle se trouve (un pointeur sur une instance de Case, donc mutateur pour l'assignation)
    2. Une case connait les tortues qui s'y trouvent (une liste) (donc méthode du type ajouteTortue(Tortue tortue))
    3. Les 2 à la fois


    N'y-a t'il pas d'indications à ce sujet dans ton énoncé ? Peut-être sous la forme d'un début de code dans les classes Case ou Tortue ?
    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.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut
    Merci pour ta réponse.
    Il y a 5 tortues (5 joueurs maximum).

    Plus d'infos sur le jeu ici : http://jeuxstrategieter.free.fr/Cour...es_complet.php

    Ok, merci pour la création du tableau. Mais maintenant, comment faut t'il faire pour mettre une tortue dessus ? et récuperer les informations ?
    Nous sommes bloqués sur ce probleme :/

  5. #5
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Vu le sujet, faire l'affichage en console, ce n'est pas évident : il faut distinguer les tortues. On peut éventuellement les représenter par un chiffre de 1 à 5. Par exemple :

    1 2
     3
    4 5
    Ce qui veut dire une case de taille maxi 3*3.


    A ce qu'on voti dans le sujet, le parcourt ne fait pas 4 × 9 cases, mais 1 × 10 cases. Qu'on pourrait affiche tout simplement sous forme d'un tableau de 5 colonnes, une pour chaque tortue : soit on gère un tableau de [10][5], 10 lignes de 5 tortues, soit un tableau de [10], 10 cases.

    Il me semble plus simple de gérer la case sur laquelle la tortue se trouve, par un int par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Tortue [
     
        public int getCase() {
            return caseIndex;
        }
     
        public void setCase(int index) {
           caseIndex=index;
        }
     
    }
    Mais dans ce cas, la classe Case n'a pas de grande utilité : il n'y a même pas besoin de tableau de cases d'ailleurs.

    Sinon, si une Case peut contenir des tortues, on peut les stocker dans un tableau, mais une liste sera probablement plus pratique à gérer :

    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
    public class Case {
     
         private List<Tortue> tortues=new ArrayList<>();
     
         // ajouter une tortue à une case
         public void ajouteTortue(Tortue tortue) {
              tortues.add(tortue);
         }
     
         // retirer une tortue d'une case
         public void supprimeTortue(Tortue tortue) {
              tortues.remove(tortue);
         }
     
        // donne la liste des tortues dans la case
        public List<Tortue> getTortues() {
              return tortues;
        }
     
        // affiche la case avec ses tortues dans la console (les tortues sont alignées à gauche : on pourrait les aligner dans leur colonne respective, ce qui serait très facile à faire avec un tableau [10][5].
         public void afficherCase() {
                System.out.print("|");
                for(Tortue tortue : tortues) {
                     System.out.print(tortue.getNumero());
                }
                for(int i=tortues.size(); i< NOMBRE_MAXIMAL_TORTUES; i++) {
                     System.out.print(" "); // on affiche des espaces pour remplir la case vide
                } 
                System.out.println("|");
         }
     
    }
    On peut afficher le plateau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    afficherLigneEntreCase();
    for(Case case : cases) {
         case.afficherCase();
         afficherLigneEntreCase();
    }
    Avec afficherLigneEntreCase() qui affiche le bon nombre de -
    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.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut
    Merci beaucoup pour l'aide.
    Mais, malheureusement, nous avons des erreurs que nous ne comprenons pas.

    Les //NOTE sont les endroits où ca coince :/

    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
    		/* CLASS PLATEAU */
     
    public class Plateau {
     
        private final Case[][] cases;
     
        public Plateau() {
            // initialisation du tableau :
            cases = new Case[1][10];
            for(int i=0; i<cases.length; i++) {
                 for(int j=0; j<cases[i].length; j++) {
                     cases[i][j]=new Case();
                 }
            }
        }
     
    }
     
    		/* CLASS TORTUE */ NOTE: Nous devons assigner des couleurs aux tortues 
     
    public class Tortue {
     
    	//private Couleur couleur;
    	private Tortue tortues;
     
     
    /*	
    	public Tortue(int c) {
    		this.couleur = new Couleur(c);
    	}
     
    	public Couleur getCouleur() {
    		return couleur;
    	}
     
    	public void setCouleur(Couleur couleur) {
    		this.couleur = couleur;
    	}*/
     
    	public Tortue getTortue() {
    		return tortues;
    	}
     
    	public void setTortue(Tortue tortues) {
    		this.tortues = tortues;
    	}
     
    	public int getCase() {
            int caseIndex = 0;
    		return caseIndex;
        }
     
        public void setCase(int index) {
           int caseIndex = index;
        }
     
     
    	public void add(Tortue tortue) {
    		// TODO Auto-generated method stub
     
    	}
     
     
    	public void remove(Tortue tortue) {
    		// TODO Auto-generated method stub
     
    	}
     
     
    	public char[] getNumero() {
    		// TODO Auto-generated method stub
    		return null;
    	}
     
     
    	public int size() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    }
     
    		/* CLASS CASE*/
     
    import java.awt.List;
    import java.util.ArrayList;
     
    public class Case {
     
    	private Tortue tortues; NOTE: Je ne sais pas s'il fallait le créer mais ca a diminué le nombre d'erreur... mais eclipse me demande changer son nom
     
         private List<Tortue> tortues = new ArrayList<>(); NOTE: je dois le renommer aussi
     
         // ajouter une tortue à une case
         public void ajouteTortue(Tortue tortue) {
              tortues.add(tortue);
         }
     
         // retirer une tortue d'une case
         public void supprimeTortue(Tortue tortue) {
              tortues.remove(tortue);
         }
     
        // donne la liste des tortues dans la case NOTE: me demande d'enlever le type d'argument
        public List<Tortue> getTortues() {
              return tortues;
        }
     
        // affiche la case avec ses tortues dans la console (les tortues sont alignées à gauche : on pourrait les aligner dans leur colonne respective, ce qui serait très facile à faire avec un tableau [10][5].
         public void afficherCase() {
                System.out.print("|");
                for(Tortue tortue : tortues) { NOTE: dit"peut seulement iterer un array ou une instance de java.lang.iterable
                     System.out.print(tortue.getNumero());
                }
                for(int i=tortues.size(); i< 5; i++) {
                     System.out.print(" "); // on affiche des espaces pour remplir la case vide
                } 
                System.out.println("|");
         }
     
    }

  7. #7
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	private Tortue tortues; NOTE: Je ne sais pas s'il fallait le créer mais ca a diminué le nombre d'erreur... mais eclipse me demande changer son nom
     
         private List<Tortue> tortues = new ArrayList<>(); NOTE: je dois le renommer aussi
    2 variables de même nom : tortues. Ça ne risque pas de fonctionner. Le fait de rajouter n'importe quoi et que ça diminue le nombre d'erreurs ne veut rien dire : Eclipse et le compilateur essaye d'estimer les erreurs en fonction de ce qui est détectable. Parfois, une erreur fait que le traitement s'arrête sur cette erreur : du coup, les autres erreurs ne sont pas détectées. Donc, ajouter un truc qui fait que pleins d'erreurs disparaissent ne veut pas dire que ce truc est pertinent.

    Je suppose que la première variable a été insérée à cause de la méthode public void setTortue(Tortue tortues) incongrue dans la classe Tortue : pourquoi y-aurait-il besoin d'un attribut Tortue pour une Tortue ? Les tortues sont indépendantes, les cases contiennent des tortues (d'où liste de Tortue dans Case), le plateau contient des cases (d'où tableau de Case dans Plateau).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for(Tortue tortue : tortues) { NOTE: dit"peut seulement iterer un array ou une instance de java.lang.iterable
    Normal, la première variable est du type Tortue, alors que mon code utilisait la seconde variable de type List<Tortue> donc parfaitement itérable contrairement à l'autre. Ici, le fait que le compilateur détecte le fait qu'il y ait 2 variables de même nom de l'empêche pas de tenter de compiler le reste, qui plante. Là, pareil, c'est souvent comme ça : pour certaines erreurs, surtout quand elles sont plusieurs, le compilateur se mélange les pinceaux (il fait ce qu'il peut), et indique parfois des erreurs là où il n'y en a pas, ou indique des emplacements d'erreurs existantes mais pas au bon endroit.

    Ensuite, l’intitulé des messages d'erreur est indispensable à leur résolution. Même si la simple lecture du code suffit parfois à les voir, les fournir n'est pas du luxe.
    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.

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut
    Merci pour ton aide, vraiment.
    Je suis en 1er année d'IUT Information, et nous étudions le Java depuis seulement quelques mois.
    Je ne comprend pas tout ce que tu dit :/

    Je pense que le mieux serais de te faire parvenir le dossier entier pour que tu puisses voir plus précisément l'erreur.
    Nous avons surement fait pas mal d'erreurs de syntaxes, mais nous sommes débutants

    https://mega.co.nz/#!W1lzEb7B!gxi298...fgI7UsFxZefNYg

    Si tu peux encore nous aider Merci d'avance !

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    J'ai regardé vite fait et ce n'est pas si mal. Il reste la classe Tortue a compléter et peut être à mettre en place les mécanismes de déplacement de tortues (supprimer la tortue d'une case par appel de supprimerTortue sur la case de départ et ajouterTortue sur la case d'arrivée? Pour la classe Tortue, elle n'a qu'un seul attribut, c'est la couleur, c'est tout.

    Différentes remarques toutefois :

    1. quand une classe dispose d'un attribut qui n'a pas être modifié, comme la couleur de la Tortue par exemple, ou la Hauteur d'une carte, ne faites pas de mutateur. Passer la valeur dans le constructeur.
      Par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      public class Tortue {
       
          private final Couleur couleur;
       
          public Tortue(Couleur couleur) {
              this.couleur=couleur;
          }
       
          public Couleur getCouleur() {
              return couleur;
          }
       
      }
    2. En particulier, pour les classes qui représentent juste des énumérations de valeur, commer Couleur ou Hauteur. Bon, j'utiliserais personnellement une enum pour ces classes, mais je ne sais pas ce que tu as vu en cours et ce que tu peux utiliser pour faire ton projet.
      Pourquoi utiliser une classe avec un attribut int et une méthode de conversion en String : c'est plus simple d'avoir une représentation directe. Qu'on peut comparer directement, sur laquelle on peut faire un switch, etc.
      Par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      public enum Couleur {
          ROUGE,
          VERTE,
          JAUNE,
          BLEUE,
          VIOLETTE,
          NEUTRE;
      }
      On peut pour faire la représentation implémenter la méthode toString() (plutôt que de faire afficher(), ou initCouleur() qui a encore moins de sens) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      public enum Couleur {
          ROUGE,
          VERTE,
          JAUNE,
          BLEUE,
          VIOLETTE,
          NEUTRE;
       
          public String toString() {
              return name().toLowerCase();
          }
      }
      Qu'on peut utiliser comme ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      public class Tortue {
          private final Couleur couleur;
       
          public Tortue(Couleur tortue) {
             this.couleur=couleur;
          }
       
          public Couleur getTortue() {
             return couleur;
          }
       
      }
      Tu pourras faire des :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if( tortue.getCouleur()==carte.getCouleur() ) { /*...*/ }
      ou
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      switch( tortue.getCouleur() ) {
          case ROUGE:
               /* ... */
               break;
          case BLEUE:
               /* ... */
               break;
       
      }
      Ce qui est simple et lisible.

      Pour la Hauteur :

      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
      public enum Hauteur {
           AVANCE_UNE_CASE("+"),
           AVANCE_DEUX_CASES("++"),
           RECUL_UNE_CASE("-"),
           DERNiERE_AVANCE_DEUX_CASE("^"),
           DERNIERE_AVANCE_DEUX_CASES("^^");
       
           private final String representation;
           private Hauteur(String representation) {
                this.representation=represention;
           }
           public String toString() {
                return represenation;
           }
      }
      Ensuite on pourra faire l'affichage tout simplement comme ça :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      System.out.println( "Carte : " + carte.getCouleur() + " " + carte.getHauteur() );
      Si vous n'utiliser pas enum, fais des constantes :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      public classe Hauteur {
       
           public final static String AVANCE_UNE_CASE = "+";
           public final static String AVANCE_DEUX_CASES = "++";
           public final static String RECUL_UNE_CASE="-";
           public final static String DERNiERE_AVANCE_DEUX_CASE="^";
           public final static String DERNIERE_AVANCE_DEUX_CASES="^^";
       
      }
      Et :
      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
      public class Carte {
       
          private final String hauteur;
          private final String couleur;
          public Carte(String hauteur, String couleur) {
               this.hauteur=hauteur;
               this.couleur=couleur;
          }
       
          public String getHauteur() {
               return hauteur;
          }
          public String getCouleur() {
               return couleur;
          }
       
      }
    3. Pour Pioche, j'aurais plutôt utiliser un ArrayList pour stocker les cartes, mais un tableau, à la limite, c'est acceptable. Une List aurait simplifié différentes choses :
      • Le mélange : Collections.shuffle(liste); tout simplement
      • La pioche :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        public Carte piocher() {
             return liste.remove(0);
        }
      • Ta méthode d'initialisation du paquet est beaucoup trop compliquée.
        Avec une enum, on peut s'aider pour simplifier en ajoutant une méthode à l'enum :
        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
        public enum Hauteur {
             AVANCE_UNE_CASE("+", 1, 5),
             AVANCE_DEUX_CASES("++", 5, 2),
             RECUL_UNE_CASE("-", 1, 0),
             DERNiERE_AVANCE_DEUX_CASE("^", 0, 3),
             DERNIERE_AVANCE_DEUX_CASES("^^", 2);
         
             private final int nombreInitialCouleur;
             private final int nombreInitialNeutre;
             private final String representation;
             private Hauteur(String representation, int nombreInitialCouleur, int nombreInitialNeutre) {
                  this.representation=represention;
                  this.nombreInitialCouleur=nombreInitialCouleur;
                  this.nombreInitialNeutre=nombreInitialNeutre;
             }
             public String toString() {
                  return represenation;
             }
             public int getNombreInitial(Couleur couleur) {
                  if ( couleur==Couleur.NEUTRE) {
                      return nombreInitialNeutre;
                  }
                  else {
                      return nombreInitialCouleur;
                  }
             }
        }
        Il suffit de faire :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        public List<Carte> nouveauPaquet() {
             List<Carte> cartes = new ArrayList<>();
             for(Couleur couleur : Couleur.values()) { // si Couleur est une enum
                 for(Hauteur hauteur : Hauteur.values()) {
                     int nombreCartes = hauteur.getNombreInitial(couleur);
                     for(int i=0; i<nombreCartes; i++) {
                         cartes.add( new Carte(hauteur, couleur));
                     }
                 }
             }
             return cartes;
        }
        C'est quand même plus simple que tous tes tests de modulo !

    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
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Merci beaucoup pour ton aide.
    Alors nous avons ajouter et modifier certaines choses.
    Tout d'abord, nous ne comprenons pas le deuxième et troisième arguments du enum "AVANCE_UNE_CASE("+", 1, 5),.." que tu nous a donner

    Presque toutes les erreurs ont été corrigés mais il en reste une dans pioche.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public Carte piocher() {
    	     return List.remove(0);
    	}
    Le code de pioche.java en entier :
    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
    import java.util.ArrayList;
    import java.util.List;
     
     
    public class Pioche {
     
     
    	public List<Carte> nouveauPaquet() {
    	     List<Carte> cartes = new ArrayList<>();
    	     for(Couleur couleur : Couleur.values()) { // si Couleur est une enum
    	         for(Hauteur hauteur : Hauteur.values()) {
    	             int nombreCartes = hauteur.getNombreInitial(couleur);
    	             for(int i=0; i<nombreCartes; i++) {
    	                 cartes.add( new Carte(hauteur, couleur));
    	             }
    	         }
    	     }
    	     return cartes;
    	}
     
    	public Carte piocher() {
    	     return List.remove(0);
    	}
    }
    Nous ne savons pas comment la résoudre :

    De plus, comment peut on distribuer les cartes aux joueurs ?

    Merci d'avance.

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par asurion Voir le message
    Bonjour,
    Merci beaucoup pour ton aide.
    Alors nous avons ajouter et modifier certaines choses.
    Tout d'abord, nous ne comprenons pas le deuxième et troisième arguments du enum "AVANCE_UNE_CASE("+", 1, 5),.." que tu nous a donner
    D'après la règle, il y a 52 cartes, certaines de couleur, certaines neutres : le nombre de cartes pour chaque hauteur n'est pas le même si la carte est une carte de couleur, que s'il s'agit d'une carte neutre. D'où 2 paramètres. Pour mieux comprendre, il suffit de regarde la méthode, getNombreInitial, qui donne pour une Hauteur donnée, et une Couleur, le nombre de cartes initiales dans un paquet (j'ai mis dans les couleurs non seulement les couleurs de tortues, mais également la couleur neutre - pour avoir une modélisation exacte, il aurait fallut faire 2 enums, une pour les couleurs de tortues et une pour les couleurs de cartes, avec une équivalence, pour les couleurs de tortues, mais pour simplifier j'en ai indiqué qu'une qui fusionne les 2 notions) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public int getNombreInitial(Couleur couleur) {
              if ( couleur==Couleur.NEUTRE) {
                  return nombreInitialNeutre;
              }
              else {
                  return nombreInitialCouleur;
              }
         }
    Citation Envoyé par asurion Voir le message
    Presque toutes les erreurs ont été corrigés mais il en reste une dans pioche.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public Carte piocher() {
    	     return List.remove(0);
    	}
    Le code de pioche.java en entier :
    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
    import java.util.ArrayList;
    import java.util.List;
     
     
    public class Pioche {
     
     
    	public List<Carte> nouveauPaquet() {
    	     List<Carte> cartes = new ArrayList<>();
    	     for(Couleur couleur : Couleur.values()) { // si Couleur est une enum
    	         for(Hauteur hauteur : Hauteur.values()) {
    	             int nombreCartes = hauteur.getNombreInitial(couleur);
    	             for(int i=0; i<nombreCartes; i++) {
    	                 cartes.add( new Carte(hauteur, couleur));
    	             }
    	         }
    	     }
    	     return cartes;
    	}
     
    	public Carte piocher() {
    	     return List.remove(0);
    	}
    }
    Nous ne savons pas comment la résoudre :

    De plus, comment peut on distribuer les cartes aux joueurs ?

    Merci d'avance.
    Là, je t'avais juste donné une méthode séparée de tout contexte pour te montrer comment créer un nouveau paquet plus simplement, mais il y a non seulement plein d'autre méthodes dans ta classe, qui restent valables (utiles et nécessaires) (au remplacement du tableau par une liste près, et aux autres adaptions conséquentes).

    Dans votre méthode piocher(), tu invoques la méthode remove() sur une variable List qui n'a été déclarée nulle part. Si par List, tu voulais reférencer l'interface List, bien évidemment, on appelle jamais une méthode comme ça, directement (sauf si elle statique). Donc, si tu passes à une liste au lieu du tableau il te faudra au moins :

    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
     
    public class Pioche {
     
            private List<Carte> cartes;
     
            public Pioche() {
                 initialiser();
                 battre();
            }
     
            public void initialiser() { 
                 cartes = nouveauPaquet();
            }
     
    	private List<Carte> nouveauPaquet() {
    	     List<Carte> cartes = new ArrayList<>();
    	     for(Couleur couleur : Couleur.values()) { // si Couleur est une enum
    	         for(Hauteur hauteur : Hauteur.values()) {
    	             int nombreCartes = hauteur.getNombreInitial(couleur);
    	             for(int i=0; i<nombreCartes; i++) {
    	                 cartes.add( new Carte(hauteur, couleur));
    	             }
    	         }
    	     }
    	     return cartes;
    	}
     
            public void battre() {
                 Collections.shuffle(cartes);
            }
     
            public int getNombreDeCartesRestantes() { 
                 return cartes.size();
            }
     
    	public Carte piocher() {
    	     return cartes.remove(0);
    	}
     
            /* ... etc ... */
    }
    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
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par asurion Voir le message
    De plus, comment peut on distribuer les cartes aux joueurs ?
    Pour cette question, je remets ton 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
    public class Joueur {
     
      private Carte[] main;
      private Couleur couleur;
     
      //CONSTRUCTEURS
      public Joueur (Couleur couleur) { 
    	  this.couleur=new Couleur(1);
    	  this.couleur=couleur;
    	  main = new Carte[5];
    	  for (int i=0;i<5;i++)
    		  this.setCarte(i, new Carte(8,8));
      };
     
      //GETTER ET SETTER
      public Carte getCarte(int i){
    	  return main[i];
      }
      public void setCarte(int i,Carte carte){
    	  this.main[i] = carte;
      }
      public Couleur getCouleur(){
    	  return this.couleur;
      }
     
      //METHODES
      public void afficherMain(){
    	  System.out.println("Joueur de couleur "+this.getCouleur().initCouleur());
    	  for(int i=0;i<5;i++)
    		  System.out.println("Carte "+ (i+1) +" : "+this.getCarte(i).afficherCarte());
      }
     
    }
    Cette classe pose un problème, c'est que la main est initialisée à partir de cartes qui ne proviennent pas de la pioche (ce sont toutes des nouvelles instances indépendantes). Il faudrait à priori plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Joueur (Couleur couleur) { 
    	  this.couleur=new Couleur(1);
    	  this.couleur=couleur;
    	  main = new Carte[5];
    	  for (int i=0;i<5;i++)
    		  this.setCarte(i, jeuDeCarte.pioche());
      }
    Mais ceci pose un problème : jeuDeCarte n'est pas accessible. On pourrait le passer en argument du constructeur, mais ça impose d'avoir d'un côté une dépendance forte entre le Joueur et le jeu de cartes (on ne peut pas créer de Joeur s'il n'existe pas de jeu de carte), et en plus le jeu de cartes doit exister avant le joueur, et tout nouveau jeu de cartes ne pourra pas être pris en compte, ou alors, il faudrait ajouter un mutateur, qui serait tout de même incongru du point de vue de la modélisation (le jeu de carte n'est pas un attribut du joueur).

    En fait, il vaudrait mieux qu'une autre classe soit chargée d'appelle setCarte(int, Carte) pour donner des cartes au joueur, en les piochant depuis la pioce. Cette classe pourrait être MaitreDuJeu par exemple (à priori c'est son rôle) : cette classe en tout cas, doit connaitre, les joueurs, la pioche, et avoir les méthodes qui correspondent aux règles : c'est elle qui doit savoir combien de cartes il faut distribuer à chaque joueur au début (ce n'est en tout cas pas au joueur de le savoir comme c'est le cas dans ta classe - je parle du 5).

    Ici aussi, la main pourrait être une liste (un ArrayList<Carte>), ce qui permettrait d'ajouter (distribuer) ou enlever des cartes (jouer) plus facilement.
    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.

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Merci de ton aide.

    Nous avons une erreur qui persiste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Joueur {
     
      private Carte[] main;
      private Couleur couleur;
     
      //CONSTRUCTEURS
      public Joueur (Couleur couleur) { 
    	 this.couleur=new Couleur(1); //<<-- Cette erreur ci ! "Cannot instantiate the type Couleur"
    	  this.couleur=couleur;
    	  main = new Carte[5];
    	  for (int i=0;i<5;i++)
    		  this.setCarte(i, Pioche.piocher()); 
      }
    Nous n'arrivons pas à initialiser la couleur des joueurs et des cartes.
    Ceci nous bloque pour l'avancé du projet.

    L'état actuel du projet: https://mega.co.nz/#!RZZGHajZ!4aiufD...92auqZ3iWvuSYQ

  14. #14
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour créer un joueur, il suffit de passer la Couleur en argument du constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Joueur joeurRouge = new Joueur(Couleur.ROUGE);
    Tout simplement.

    Si vous stocker les joeurs dans une liste (par exemple, à priori, dans une variable de MaitreDuJeux :

    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
    public class MaitreDuJeu {
     
       private List<Joueur> joueurs = new ArrayList<>();
     
       public MaitreDuJeu() {
     
            initialiserJoueurs();
     
       }
     
       private void initialiserJoueurs() {
           joueurs.clear(); // ceci n'est pas obligatoire si la méthode n'est appelée qu'une seule fois (ça supprime tous les joueurs contenus dans la liste), mais comme ça on peut la réappeler, par exemple, pour réinitialiser le jeu si on veut
           for(Couleur couleur : couleurs.values()) { // values() donne la liste de toutes les valeurs de l'enum
                if ( couleur!=Couleur.NEUTRE ) { // on ne doit pas créer une tortue de couleur NEUTRE (on pourrait aussi mettre un attribut dans Couleur pour dire que la couleur n'est pas valable pour une tortue)
                     joueurs.add(  new Joueur(couleur) ); // on ajoute un Joueur de la couleur contenue dans la variable couleur
                }
           }
       }
     
     
    }
    Tu peux supprimer la ligne this.couleur=new Couleur(1); dans le constructeur de Joueur.
    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.

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut
    Merci pour ta réponse rapide.

    Nous avons changer deux trois trucs, nous n'avons d'erreurs apparente, mais nous avons une erreur Eclipse quand nous essayons d’exécuter le Main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Exception in thread "main" java.lang.NullPointerException
    	at Pioche.piocher(Pioche.java:42)
    	at Joueur.<init>(Joueur.java:12)
    	at MaitreDuJeu.initialiserJoueurs(MaitreDuJeu.java:18)
    	at MaitreDuJeu.<init>(MaitreDuJeu.java:10)
    	at Menu.main(Menu.java:6)
    Notre pack entier : http://www.mediafire.com/download/6c...oydvom/src.rar

    Merci pour ton aide :/ On galere vraiment.

  16. #16
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La NullPointerExceotion arrive quand on appelle une méthode (ou qu'on accède à un attribut) sur une référence null. Ce qui est le cas de ta variable pioche dans la classe Piocher.

    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
    public class Pioche {
     
    	private static List<Carte> cartes;
     
        public Pioche() {
             initialiser();
             battre();
        }
     
        public void initialiser() { 
             cartes = nouveauPaquet();
        }
     
    	public List<Carte> nouveauPaquet() {
    	     List<Carte> cartes = new ArrayList<>();
    	     for(Couleur couleur : Couleur.values()) { // si Couleur est une enum
    	         for(Hauteur hauteur : Hauteur.values()) {
    	             int nombreCartes = hauteur.getNombreInitial(couleur);
    	             for(int i=0; i<nombreCartes; i++) {
    	                 cartes.add( new Carte(hauteur, couleur));
    	                 //System.out.println(i);
    	             }
    	         }
    	     }
    	     return cartes;
    	}
     
    	public void battre() {
            Collections.shuffle(cartes);
       }
     
       public int getNombreDeCartesRestantes() { 
            return cartes.size();
       }
     
    	public static Carte piocher() {
    	     return cartes.remove(0);
    	}
    }
    Ceci vient du fait que tu appelles piocher() en static alors que la classe n'est pas faite pour fonctionner en static : la variable cartes est initialisée uniquement si on appelle son constructeur (sinon cartes n'est affectée avec aucune valeur). Tu as fait un accès statique à piocher() dans Joueur pour pouvoir accèder à la pioche. Je t'avais dit dans un précédent message que ce n'était pas pas une bonne idée que la joueur accède directement à la pioche (soit il fallait que le joeur possède un attribut Pioche, soit faire un accès statique comme tu as fait). Le mieux étant que cela soit le MaitreDuJeu qui pôssède la pioche et distribue les cartes aux joueurs.

    Si tu veux continuer à utiliser un accès statique à pioche, il faut transformer toute la classe pioche pour qu'elle fonctionne en statique. Deux moyens pour ça :

    1. Tout mettre en statique, ce qui n'est jamais une bonne solution (enfin, c'est souvent plus simple à utiliser directement, mais c'est très restrictif ) :
      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
      public class Pioche {
       
          private static List<Carte> cartes;
       
          static {
               initialiser();
               battre();
          }
       
          public static void initialiser() { 
               cartes = nouveauPaquet();
          }
       
      	public List<Carte> nouveauPaquet() {
      	     List<Carte> cartes = new ArrayList<>();
      	     for(Couleur couleur : Couleur.values()) { // si Couleur est une enum
      	         for(Hauteur hauteur : Hauteur.values()) {
      	             int nombreCartes = hauteur.getNombreInitial(couleur);
      	             for(int i=0; i<nombreCartes; i++) {
      	                 cartes.add( new Carte(hauteur, couleur));
      	                 //System.out.println(i);
      	             }
      	         }
      	     }
      	     return cartes;
      	}
       
      	public static void battre() {
              Collections.shuffle(cartes);
         }
       
         public static int getNombreDeCartesRestantes() { 
              return cartes.size();
         }
       
      	public static Carte piocher() {
      	     return cartes.remove(0);
      	}
      }
    2. Faire un singleton : c'est à dire gérer une instance unique de Pioche, avec un accès statique. Le moyen le plus simple (tu verras par la suiite que cela peut poser des problèmes dans certains contextes, mais dans le tien ça devrait fonctionner comme ça) est de faire :

      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
      public class Pioche {
       
          public final static Pioche SINGLETON = new Pioche();
       
          private List<Carte> cartes;
       
          public Pioche() {
               initialiser();
               battre();
          }
       
          public void initialiser() { 
               cartes = nouveauPaquet();
          }
       
      	public List<Carte> nouveauPaquet() {
      	     List<Carte> cartes = new ArrayList<>();
      	     for(Couleur couleur : Couleur.values()) { // si Couleur est une enum
      	         for(Hauteur hauteur : Hauteur.values()) {
      	             int nombreCartes = hauteur.getNombreInitial(couleur);
      	             for(int i=0; i<nombreCartes; i++) {
      	                 cartes.add( new Carte(hauteur, couleur));
      	                 //System.out.println(i);
      	             }
      	         }
      	     }
      	     return cartes;
      	}
       
      	public void battre() {
              Collections.shuffle(cartes);
         }
       
         public int getNombreDeCartesRestantes() { 
              return cartes.size();
         }
       
      	public Carte piocher() {
      	     return cartes.remove(0);
      	}
      }
      Dans Joueur, tu appelles piocher() comme ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
        public Joueur (Couleur couleur) { 
      	  this.couleur=couleur;
      	  main = new Carte[5];
      	  for (int i=0;i<5;i++)
      		  this.setCarte(i, Pioche.SINGLETON.piocher());
        }


    Le mieux étant quand même de supprimer tout accès à Pioche dans la classe Joueur et de laisser le MaitreDuJeu distribuer les 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
    public class MaitreDuJeu {
     
        /* ... */ // je remets pas ce que j'ai mis dans mes précents messages
        private Pioche pioche; 
     
        public void debutPartie() { // par exemple  
              initialiserJoueurs();
              initialiserCartes(); 
              for(Joueur joueur : joueurs) {
                  distribuer( joueur, 5 );
              }
        }
     
        private void initialiserCartes() {
                pioche = new Pioche();
        }
     
        /**
          * Donne un certain nombre de cartes au joueur spécifié en ls prenant dans la pioche
          * @param joueur le joueur à qui donner les cartes
          * @param nombreDeCartes le nombre de cartes à distribuer
          */
        private void distribuer(Joueur joueur, int nombreDeCartes) {
              if ( nombreDeCartes> pioche.getNombreDeCartesRestantes() ) throw new IllegalStateException("Plus assez de cartes dans la pioche"); // ceci est un exemple de blindage - je ne sais plus ce qui'll y a dans les règles dans ce cas, peut être faut-il réinitialisr la pioche, ou reboucler sur la défausse (ce qui correspondrait à l'appel d'une méthode de pioche, dédiée à ça) : je re laisse voir ce qu'il faut faire ici
              for(int i=0; i<nombreDeCartes; i++) {
                  joueur.donnerCarte( pioche.piocher() ); 
              }
        }
    }
    La méthode donneCarte() n'existe pas actuellement dans votre classe Joueur : elle suppose qu'on stocke la main d'un joueur dans une liste et non pas un tableau beaucoup moins pratique à utiliser (il faut fournir un indice, ou le gérer soit-même en automatique, ce que fait une ArrayList justement).

    On aurait donc une classe Joueur comme ça :

    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
    public class Joueur {
     
      private List<Carte> main;
      private Couleur couleur;
     
     
      //CONSTRUCTEURS
      public Joueur (Couleur couleur) { 
    	  this.couleur=couleur;
    	  main =new ArrayList<>()
      }
     
      //GETTER ET SETTER
      public Carte jouerCarte(int numeroCarte){
    	  return main.remove(numeroCarte); // je prend une carte dans la main
      }
      public Carte getCarte(int numeroCarte){
    	  return main.get(numeroCarte); 
      }
      public int getNombreDeCartes() {
              return main.size();
      }
      public void donnerCarte(Carte carte){
    	  this.main.add(carte); // j'ajoute la carte à la main
      }
      public Couleur getCouleur(){
    	  return this.couleur;
      }
     
      //METHODES
      public void afficherMain(){ // ici, comme je vous l'avais déjà dit,ce serait mieux d'avoir une méthode toString()
    	  System.out.println("Joueur de couleur "+this.getCouleur()); // ici, il y avait une erreur dans votre code : this.getCouleur().initCouleur() ! pourquoi appeler initCouleur ? d'ailleurs cette méthode ne devrait même pas exister, elle n'a aucun sens
    	  for(int i=0; i<cartes.size(); i++)
    		  System.out.println("Carte "+ (i+1) +" : "+this.get(i).afficherCarte()); // au lieu de afficherCarte(), on pourrait appeler toString() de Carte (implicitement, il n'y aurait même pas besoin de l'écrire)
      }
    }
    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.

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je me suis mis depuis quelques temps au java et je fais des petits projets pour m'entrainer.
    Ce jeu des tortues m'a paru intéressant donc je m'y suis attardé de plus près.

    J'ai donc créer la classe tortue, case(qui est une liste de tortues),et plateau (qui est une liste de cases).
    Le plateau s'initialise bien (j'ai les 10 cases), mais lorsque je veux ajouter une tortue à une case spécifique, ça me les ajoute dans toutes les cases !

    Voici quelques lignes de codes pour vous éclairer :

    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
    public static void main(String[] args) {
    		Plateau p=new Plateau();
     
     
    		for(ECouleur coul:ECouleur.values()){
    				Tortue t = new Tortue(coul);
    				p.cases.get(1).ajouterTortue(t);	
     
     
    			}	
     
     
    	System.out.println(p.toString());
    		}
     
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Plateau{
     
    List<Case> cases;
     
    public Plateau(){
    	cases=new LinkedList<Case> ();
     
    	for(int i=1;i<11;i++){
    		Case c=new Case(i);
    		cases.add(c);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Case {
     
    	public static List<Tortue> Tortues;
    	private int num;
     
    	public Case(int n){
    		Tortues=new ArrayList<Tortue>();
    		this.num=n;
            }
    merci d'avance pour votre aide

  18. #18
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,
    Citation Envoyé par rodolph141 Voir le message
    [...]
    mais lorsque je veux ajouter une tortue à une case spécifique, ça me les ajoute dans toutes les cases !
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Case {
    	
    	public static List<Tortue> Tortues;
    	private int num;
    	
    	public Case(int n){
    		Tortues=new ArrayList<Tortue>();
    		this.num=n;
            }
    La liste Tortues est statique, donc "partagée" entre toutes les instances de Case (il n'existe qu'une et une seule variable Tortues, pointant vers forcément la même liste).
    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.

  19. #19
    Membre régulier
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Mai 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mai 2015
    Messages : 93
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    Nous avons modifier pas mal de chose. La pioche fonctionne correctement, nous pouvons distribuer des cartes.
    Mais nous sommes confronté a un nouveau problème, comment initialiser l'emplacement des tortues ?

    Les .java : https://mega.co.nz/#!sAQ0xKgQ!nK0pJb...bHUBdoeaFEERmY

    Merci encore

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup ! ça fonctionne beaucoup mieux maintenant

    Je suis maintenant passé au déplacement des tortues. J'ai pour l'instant la méthode deplacerTortue qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void deplacerTortue(Tortue t,EAction e){
     
    	switch(e){
    	case Avancer:
    		cases.get(t.getPosition()).ajouterTortue(t);
    		cases.get(t.getPosition()-1).supprimerTortue(t);
    		t.setPosition(t.getPosition()+1);
    		break;
    	case Reculer:
     
    	}
     
    }
    Cependant, je me suis rendu compte qu'il serait beaucoup plus pratique de passer en paramètre la couleur(énumération) de la tortue plutôt que la tortue en elle-même.
    Sachant qu'une tortue possède un attribut privé couleur. Je ne vois pas comment faire référence à une tortue de part sa couleur.

Discussions similaires

  1. [XL-2010] Créer un tableau contenant un tableau?
    Par gecko404 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/05/2015, 14h43
  2. Réponses: 4
    Dernier message: 24/02/2012, 12h04
  3. [XL-MAC 2011] créer un tableau contenant un tableau
    Par Aurore24 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/01/2012, 19h24
  4. Créer un classe (objet) en contenant un autre?
    Par Rusty2096 dans le forum Langage
    Réponses: 4
    Dernier message: 25/02/2010, 16h17
  5. Serialiser un objet contenant un tableau
    Par stdebordeau dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/09/2009, 21h29

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