Création d'une classe-liste et surcharge de get()
Résolu/Fermé
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
-
2 févr. 2013 à 15:24
Xenthys Messages postés 31 Date d'inscription dimanche 30 décembre 2012 Statut Membre Dernière intervention 2 mars 2013 - 3 févr. 2013 à 23:39
Xenthys Messages postés 31 Date d'inscription dimanche 30 décembre 2012 Statut Membre Dernière intervention 2 mars 2013 - 3 févr. 2013 à 23:39
A voir également:
- Création d'une classe-liste et surcharge de get()
- Liste déroulante excel - Guide
- Creation compte gmail - Guide
- Liste déroulante en cascade - Guide
- Création compte google - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
20 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 2/02/2013 à 17:27
Modifié par KX le 2/02/2013 à 17:27
En effet ce code tourne en rond :
"dans la classe Paquet le get est rattaché à une liste"
Si tu entends par là que Paquet extends List<Carte>, alors il est inutile de redéfinir la méthode get. Mais si tu le voulais tu devrais utiliser super :
Si en revanche la liste est un membre de la classe alors il faut l'utiliser :
Carte get(int i) { return this.get(i); // get appelle get qui appelle get qui appelle get... }
"dans la classe Paquet le get est rattaché à une liste"
Si tu entends par là que Paquet extends List<Carte>, alors il est inutile de redéfinir la méthode get. Mais si tu le voulais tu devrais utiliser super :
Carte get(int i) { return super.get(i); // get de Paquet appelle le get de la liste }
Si en revanche la liste est un membre de la classe alors il faut l'utiliser :
Carte get(int i) { return liste.get(i); }La confiance n'exclut pas le contrôle
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
2 févr. 2013 à 18:55
2 févr. 2013 à 18:55
Merci pour ta réponse! J'ai essayé la méthode avec le super qui me paraissait celle qui correspondait à ce que je voulais (prendre le get des Listes et l'étendre au Paquet) mais maintenant il me dit que la méthode get n'est pas définie pour un Objet (j'ai laissé Carte devant).
Pourtant, en regardant dans la doc https://docs.oracle.com/javase/6/docs/api/java/util/List.html la méthode get est censée rendre l'élément de la liste donc si cet élément est une carte, pourquoi ne pourrait-elle pas retourner une carte?
J'ai même essayé de rajouter extends List<Carte> mais ça m'a souligné le texte en disant que ce n'était pas l'interface attendue...
Pourtant, en regardant dans la doc https://docs.oracle.com/javase/6/docs/api/java/util/List.html la méthode get est censée rendre l'élément de la liste donc si cet élément est une carte, pourquoi ne pourrait-elle pas retourner une carte?
J'ai même essayé de rajouter extends List<Carte> mais ça m'a souligné le texte en disant que ce n'était pas l'interface attendue...
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 févr. 2013 à 19:30
2 févr. 2013 à 19:30
"la méthode get n'est pas définie pour un Objet"
ça veut dire que tu n'as pas d'extends, et que Paquet hérite directement d'Object, donc effectivement le super ne sert à rien dans ce cas. Et quand je disais extends List<Carte> il s'agirait plutôt d'un implements ou alors d'un extends ArrayList ou LinkedList, bref, tout ça tu en t'en sers visiblement pas.
"le get est rattaché à une liste"
Où est cette liste ? Je pense qu'il faudrait que tu regardes mon troisième code, où "liste" serait un objet List<Carte> (pareil : LinkedList ou ArrayList) que tu aurais défini.
Remarque : si tu nous donnes ton code de Paquet ce sera plus simple de t'aider...
ça veut dire que tu n'as pas d'extends, et que Paquet hérite directement d'Object, donc effectivement le super ne sert à rien dans ce cas. Et quand je disais extends List<Carte> il s'agirait plutôt d'un implements ou alors d'un extends ArrayList ou LinkedList, bref, tout ça tu en t'en sers visiblement pas.
"le get est rattaché à une liste"
Où est cette liste ? Je pense qu'il faudrait que tu regardes mon troisième code, où "liste" serait un objet List<Carte> (pareil : LinkedList ou ArrayList) que tu aurais défini.
Remarque : si tu nous donnes ton code de Paquet ce sera plus simple de t'aider...
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
Modifié par Xenthys le 2/02/2013 à 19:41
Modifié par Xenthys le 2/02/2013 à 19:41
Merci vraiment pour ton aide. Je ne voulais pas mettre le code pour ne pas tout surcharger mais le voici:
public class Paquet { static ArrayList<Carte> unPaquet = new ArrayList<Carte>(54); //Attributs de Clans private static final Clan Violet = new Clan("Violet"); private static final Clan VertClair = new Clan("Vert Clair"); private static final Clan VertFonce = new Clan("Vert Foncé"); private static final Clan Rouge = new Clan("Rouge"); private static final Clan Orange = new Clan("Orange"); private static final Clan Bleu = new Clan("Bleu"); private static final Clan Borne = new Clan("Borne"); Paquet(){ //Ajout des cartes au Paquet par Clan for(int i=1; i<=9;i++){ unPaquet.add(new Carte(Violet, i)); } for(int i=1; i<=9;i++){ unPaquet.add(new Carte(Orange, i)); } for(int i=1; i<=9;i++){ unPaquet.add(new Carte(Bleu, i)); } for(int i=1; i<=9;i++){ unPaquet.add(new Carte(VertClair, i)); } for(int i=1; i<=9;i++){ unPaquet.add(new Carte(VertFonce, i)); } for(int i=1; i<=9;i++){ unPaquet.add(new Carte(Rouge, i)); } } // Extension des méthodes remove() et get() à la classe Paquet void remove(int i){ this.remove(i); } Carte get(int i){ return super.get(i); } }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 févr. 2013 à 19:48
2 févr. 2013 à 19:48
Donc il faut reprendre mon troisième code, mais avec la liste "unPaquet"
Remarque : il me semble maladroit que "unPaquet" soit un objet static...
public void remove(int i) { unPaquet.remove(i); } public Carte get(int i) { return unPaquet.get(i); }
Remarque : il me semble maladroit que "unPaquet" soit un objet static...
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
2 févr. 2013 à 20:07
2 févr. 2013 à 20:07
Pourquoi le caractère statique de unPaquet te gêne?
En fait, ce que je veux faire et c'est pourquoi il est un peu gênant de particulariser la méthode get à unPaquet c'est que je duplique le Paquet pour pouvoir en faire une pioche qui a un nombre de cartes qui diminue et si je crée une copie copiePaquet pour pouvoir lui appliquer get, cette méthode ne marchera plus. Je voudrais la généraliser à tous les Paquets.
En fait, ce que je veux faire et c'est pourquoi il est un peu gênant de particulariser la méthode get à unPaquet c'est que je duplique le Paquet pour pouvoir en faire une pioche qui a un nombre de cartes qui diminue et si je crée une copie copiePaquet pour pouvoir lui appliquer get, cette méthode ne marchera plus. Je voudrais la généraliser à tous les Paquets.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 févr. 2013 à 20:15
2 févr. 2013 à 20:15
Ce qui me gène c'est de pouvoir faire ça :
Tu ne dupliques pas un Paquet comme tu dis, tu accumules tous tes paquets en un seul.
En fait p1 et p2 ne servent à rien ici, parce que la seule valeur qui compte c'est Paquet.unPaquet
Pour être cohérent, il faudrait que tout soit static ou rien du tout, mais pas un peu des deux...
Paquet p1 = new Paquet(); System.out.println(Paquet.unPaquet().size()); // 54 Paquet p2 = new Paquet(); System.out.println(Paquet.unPaquet().size()); // 128
Tu ne dupliques pas un Paquet comme tu dis, tu accumules tous tes paquets en un seul.
En fait p1 et p2 ne servent à rien ici, parce que la seule valeur qui compte c'est Paquet.unPaquet
Pour être cohérent, il faudrait que tout soit static ou rien du tout, mais pas un peu des deux...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
Modifié par Xenthys le 2/02/2013 à 20:37
Modifié par Xenthys le 2/02/2013 à 20:37
Tu as raison. J'ai enlevé le static devant unPaquet. Par contre, je ne comprends pas pourquoi tu écris Paquet.unPaquet(). Qu'est-ce que ça veut dire? Pourquoi y a-t-il des parenthèses après unPaquet dans ton code?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 févr. 2013 à 20:43
2 févr. 2013 à 20:43
C'est parce que mes doigts réfléchissent à la place de mon cerveau ^^
Dans ton cas effectivement tu peux faire Paquet.unPaquet.size(), mais normalement unPaquet devrait être private ou protected, et ainsi on ne pourrait plus accéder directement à l'objet unPaquet, il faudrait plutôt utiliser un accesseur et du coup mes parenthèses on un sens :
Dans ton cas effectivement tu peux faire Paquet.unPaquet.size(), mais normalement unPaquet devrait être private ou protected, et ainsi on ne pourrait plus accéder directement à l'objet unPaquet, il faudrait plutôt utiliser un accesseur et du coup mes parenthèses on un sens :
protected ArrayList<Carte> unPaquet; public List<Carte> unPaquet() // ou "getPaquet", "toList", etc. { return unPaquet; }
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
2 févr. 2013 à 20:47
2 févr. 2013 à 20:47
Ok! Je comprends: il faut que je crée unPaquet privé hors de mon constructeur en lui ajoutant toutes les cartes puis que dans le constructeur, je demande à retourner unPaquet que je peux éventuellement renommer comme copiePaquet. Et quant au problème pour récupérer la carte d'indice i qui se trouve dans le paquet?
En passant j'ai une question un peu bête, est-ce que à chaque fois que je rappelle unPaquet à l'aide du constructeur, les cartes ont le même indice? Je me doute bien que oui et que l'indice est lié à l'ordre dans lequel j'ai mis mes ajouts de cartes au Paquet mais je préfère demander.
En passant j'ai une question un peu bête, est-ce que à chaque fois que je rappelle unPaquet à l'aide du constructeur, les cartes ont le même indice? Je me doute bien que oui et que l'indice est lié à l'ordre dans lequel j'ai mis mes ajouts de cartes au Paquet mais je préfère demander.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 févr. 2013 à 20:54
2 févr. 2013 à 20:54
Effectivement comme tu l'as fait tous tes paquets seront dans le même ordre, mais on peut faire une méthode pour les mélanger, ce n'est pas très compliqué.
Au passage, je me demande ce que sont tes "Clan", il est intéressant d'utiliser un enum ici, est-ce que c'en est un ou pas ?
"quant au problème pour récupérer la carte d'indice i qui se trouve dans le paquet?"
quel problème ?
Au passage, je me demande ce que sont tes "Clan", il est intéressant d'utiliser un enum ici, est-ce que c'en est un ou pas ?
"quant au problème pour récupérer la carte d'indice i qui se trouve dans le paquet?"
quel problème ?
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
2 févr. 2013 à 20:57
2 févr. 2013 à 20:57
Pardon, je me suis mal exprimé: je n'ai pas exactement compris du coup si faire unPaquet.get(i) pour récupérer la carte d'indice i marchait si je faisais ce que tu m'as conseillé de faire.
Et pour mélanger le Paquet, je ne peux pas garder ma méthode distribuerDebut()? Elle tire au hasard une carte dans copiePaquet auquel on enlève cette carte.
Les clans c'est comme les familles Trèfle, Coeur, Pique ... Et je ne connais pas enum (shame on me), je n'en ai vraiment jamais entendu parler.
Et pour mélanger le Paquet, je ne peux pas garder ma méthode distribuerDebut()? Elle tire au hasard une carte dans copiePaquet auquel on enlève cette carte.
Les clans c'est comme les familles Trèfle, Coeur, Pique ... Et je ne connais pas enum (shame on me), je n'en ai vraiment jamais entendu parler.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 févr. 2013 à 21:19
2 févr. 2013 à 21:19
Les enum permettent de faire un nouveau type définis par des mots-clés.
Exemple, tu pourrais faire ta classe Carte comme ceci :
Et du coup, ta classe Paquet peut se simplifier ainsi :
"pour mélanger le Paquet, je ne peux pas garder ma méthode distribuerDebut()?"
Je n'ai pas le code de cette méthode, mais on peut simplement faire comme ça :
Exemple, tu pourrais faire ta classe Carte comme ceci :
public class Carte { static enum Clan { Violet, VertClair, VertFonce, Rouge, Orange, Bleu, Borne; } public final Clan clan; public final int val; public Carte(Clan clan, int val) { this.clan = clan; this.val = val; } }
Et du coup, ta classe Paquet peut se simplifier ainsi :
public class Paquet { protected final ArrayList<Carte> cartes; public Paquet() { cartes = new ArrayList<Carte>(54); for (Carte.Clan clan : Carte.Clan.values()) for (int val=1; val<=9; val++) cartes.add(new Carte(clan, val)); } public Carte get(int i) { return cartes.get(i); } public Carte remove(int i) { return cartes.remove(i); } }
"pour mélanger le Paquet, je ne peux pas garder ma méthode distribuerDebut()?"
Je n'ai pas le code de cette méthode, mais on peut simplement faire comme ça :
public void melanger() { Collections.shuffle(cartes); }
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
2 févr. 2013 à 21:26
2 févr. 2013 à 21:26
Wao, quelle efficacité, je suis vraiment très très loin d'en être là en java. Mais j'ai tout compris! Merci infiniment: je voudrais juste pour finir (et te laisser un peu tranquille^^) connaître la façon dont tu as utilisé la boucle for que tu as utilisée (les arguments sont assez étranges).
La méthode shuffle existe-t-elle ou faut-il l'importer de quelque part?
Et ma méthode distribuerDebut. Elle est censé tirer aléatoirement en deux coups 5 cartes du paquet et les donner aux deux joueurs.
for(Carte.Clan clan : Carte.Clan.values()).
La méthode shuffle existe-t-elle ou faut-il l'importer de quelque part?
Et ma méthode distribuerDebut. Elle est censé tirer aléatoirement en deux coups 5 cartes du paquet et les donner aux deux joueurs.
void distribueDebut(){ copiePaquet=monPaquet; for(int i=0; i<5;i++){ int j= (int) Math.floor(Math.random()*(53-i)); a=monPaquet.get(j); Joueur1.recoit(a); monPaquet.remove(j); CartesGauche[i]= new JButton(new ImageIcon("/Schotten totten/"+b.getClan()+b.getNumero()+".GIF")); } for(int k=6;k<12;k++){ int l= (int) Math.floor(Math.random()*(47-k)); b=copiePaquet.get(l); Joueur2.recoit(b); monPaquet.remove(l); CartesDroite[k]=new JButton(new ImageIcon("/Schotten totten/"+b.getClan()+b.getNumero()+".GIF")); } }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 févr. 2013 à 22:00
2 févr. 2013 à 22:00
Pour la méthode shuffle il faut importer java.util.Collections.
Voici sa documentation : Collections.shuffle(List)
Ta méthode distribueDebut() parait un peu compliqué. Si on considère que ton jeu de carte est mélangé, tu peux tout simplement prendre les cartes les unes à la suite des autres :
Dans la boucle for, on a deux difficultés vu comment je l'ai écrite.
D'une part il y a le type "Carte.Clan", il est écrit en deux temps parce que j'ai déclaré Clan comme un enum static de la classe Carte, mais on pourrait éventuellement déclarer la classe Clan indépendamment de la classe Carte
Ça simplifie un peu l'écriture "for (Clan clan : Clan.values())". Il faut donc juste savoir que Clan.values() est un tableau contenant toutes les valeurs. Pour comprendre que la boucle itère toutes les valeurs une à une, ce qui fait la même chose (mais en plus performant) que cette autre boucle :
Ce genre de boucles "for each" s'applique pas seulement aux tableaux mais à tous les objets Iterable, en particulier les Collection, et donc les listes. Par exemple on pourrait aussi faire :
Qui serait équivalent (mais là encore, en plus performant) à :
Voici sa documentation : Collections.shuffle(List)
Ta méthode distribueDebut() parait un peu compliqué. Si on considère que ton jeu de carte est mélangé, tu peux tout simplement prendre les cartes les unes à la suite des autres :
private int n=0; public Carte tirer() { return cartes.get(n++); }
Dans la boucle for, on a deux difficultés vu comment je l'ai écrite.
D'une part il y a le type "Carte.Clan", il est écrit en deux temps parce que j'ai déclaré Clan comme un enum static de la classe Carte, mais on pourrait éventuellement déclarer la classe Clan indépendamment de la classe Carte
public enum Clan { Violet, VertClair, VertFonce, Rouge, Orange, Bleu, Borne; } public class Carte { public final Clan clan; public final int val; public Carte(Clan clan, int val) { this.clan = clan; this.val = val; } } public class Paquet { protected final ArrayList<Carte> cartes; public Paquet() { cartes = new ArrayList<Carte>(54); for (Clan clan : Clan.values()) for (int val=1; val<=9; val++) cartes.add(new Carte(clan, val)); } }
Ça simplifie un peu l'écriture "for (Clan clan : Clan.values())". Il faut donc juste savoir que Clan.values() est un tableau contenant toutes les valeurs. Pour comprendre que la boucle itère toutes les valeurs une à une, ce qui fait la même chose (mais en plus performant) que cette autre boucle :
Clan[] tab = Clan.values(); for (int i=0; i<tab.length; i++) { Clan clan = tab[i]; ...
Ce genre de boucles "for each" s'applique pas seulement aux tableaux mais à tous les objets Iterable, en particulier les Collection, et donc les listes. Par exemple on pourrait aussi faire :
for (Carte c : cartes)
Qui serait équivalent (mais là encore, en plus performant) à :
for (int i=0; i<cartes.size(); i++) { Carte c = cartes.get(i);
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
2 févr. 2013 à 22:05
2 févr. 2013 à 22:05
Encore merci pour toute ton aide! Tu as vraiment passé beaucoup de temps à m'aider et je t'en suis reconnaissant. Je vais donc m'en voir tout ça et digérer toutes ces nouveautés. ;-)
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
3 févr. 2013 à 00:11
3 févr. 2013 à 00:11
Une dernière question (je n'arrive pas à m'arrêter), j'ai appliqué tous tes conseils mais un problème reste: comment est-ce que je peux initialiser cartes dans ma classe principale? Pourquoi me demande-t-il de le faire si cartes correspond dans ma classe Paquet à une liste bien définie? Je croyais qu'en la créant dans Paquet comme tu l'avais dit cette liste de cartes était figée et qu'elle était utilisable dans n'importe quelle classe telle quelle (mais du coup, dois-je la déclarer comme attribut et l'initialiser?)
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 févr. 2013 à 00:15
3 févr. 2013 à 00:15
Tu parles de ça ?
Cette liste n'est pas figée bien au contraire, puisqu'on peux supprimer des cartes avec la méthode remove, changer l'ordre des cartes avec le shuffle (ou autres), etc.
protected final ArrayList<Carte> cartes; public Paquet() { cartes = new ArrayList<Carte>(54); for (Clan clan : Clan.values()) for (int val=1; val<=9; val++) cartes.add(new Carte(clan, val)); }
Cette liste n'est pas figée bien au contraire, puisqu'on peux supprimer des cartes avec la méthode remove, changer l'ordre des cartes avec le shuffle (ou autres), etc.
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
3 févr. 2013 à 13:09
3 févr. 2013 à 13:09
Oui, pardon, je voulais dire que je croyais que cette liste de cartes était la même partout et que je pouvais la modifier. Alors qu'ici, en la créant dans la classe paquet puis en l'utilisant dans ma classe principale pour distribuer les cartes quand je lance cartes.get(5), il me donne une erreur NullPointerException ce qui me laisse à croire que dans la classe principale, ma liste cartes est vide ...
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 févr. 2013 à 15:31
3 févr. 2013 à 15:31
Je n'arrive toujours pas à voir le problème, ça doit venir d'une différence entre le code que j'ai écrit un peu au dessus, et celui que tu utilises. Moi si je fais ça je n'ai pas d'erreur :
Remarque : il faudrait redéfinir la méthode toString dans Carte pour avoir un affichage lisible :
public static void main(String[] arg) { Paquet p = new Paquet(); System.out.println(p.cartes.get(5)); System.out.println(p.get(12)); }
Remarque : il faudrait redéfinir la méthode toString dans Carte pour avoir un affichage lisible :
public String toString() { return String.format("{%d %s}",val,clan.name()); }
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
3 févr. 2013 à 17:51
3 févr. 2013 à 17:51
Il me dit toujours que get n'est pas défini pour la classe paquet et effectivement d'après le code de Paquet que tu m'as donné, il n'existe pas. Get est uniquement défini pour une liste.
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
Modifié par Xenthys le 3/02/2013 à 18:29
Modifié par Xenthys le 3/02/2013 à 18:29
Au temps pour moi, la première ligne que tu as écrite marche très bien et la carte est donnée:
Par contre, ta deuxième ligne de code
Et j'ai modifié ma méthode distribueDebut avec shuffle mais rien ne marche:
ma méthode: //Méthode de distribution des cartes
Je ne comprends pas non plus ce que p.cartes signifie ... J'ai vraiment du mal à comprendre ce qu'est un nouveau Paquet: c'est un nouveau jeu de cartes cartes ou ça remet dans cartes toutes les cartes qui sont dans le constructeur?
System.out.println(p.cartes.get(5));.
Par contre, ta deuxième ligne de code
System.out.println(p.get(12));ne marche pas pour la raison que j'ai citée dans l'autre post.
Et j'ai modifié ma méthode distribueDebut avec shuffle mais rien ne marche:
ma méthode: //Méthode de distribution des cartes
void distribueDebut(){ Collections.shuffle(cartes); for(int i=0; i<5;i++){ a=cartes.get(i); cartes.remove(i); Joueur1.recoit(a); CartesGauche[i]= new JButton(new ImageIcon("/Schotten totten/Images/"+a.clan+a.val+".GIF")); for(int j=0;j<5;j++){ b=cartes.get(j); cartes.remove(j); Joueur2.recoit(b); CartesDroite[j]=new JButton(new ImageIcon("/Schotten totten/Images/"+b.clan+b.val+".GIF")); } }
Exception in thread "main" java.lang.NullPointerException at java.util.Collections.shuffle(Unknown Source) at java.util.Collections.shuffle(Unknown Source) at SchottenTotten.distribueDebut(SchottenTotten.java:97) at SchottenTotten.main(SchottenTotten.java:120).
Je ne comprends pas non plus ce que p.cartes signifie ... J'ai vraiment du mal à comprendre ce qu'est un nouveau Paquet: c'est un nouveau jeu de cartes cartes ou ça remet dans cartes toutes les cartes qui sont dans le constructeur?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 févr. 2013 à 20:30
3 févr. 2013 à 20:30
Je ne fais pas des copier-coller de tout le code à chaque fois, mais la méthode get qui te manques c'est la même que celle du début, celle pour laquelle tu as ouvert cette discussion, elle n'a pas changé depuis. Regarde par exemple #13
Par contre pour ta distribution de cartes, il faut pas faire cartes.get(i); et remove(i) dans la boucle parce que tu décales les indices deux fois, alors ça fait un résultat très loin de ce que tu veux je pense.
En plus, comme tu fais des remove, les cartes ne reviennent plus ! Est-ce que tu as prévu de les remettre dans le paquet une fois que les joueurs ont finis de jouer ? Parce que sinon, tu vas te retrouver avec un paquet vide, et tu ne pourras plus tirer de cartes (c'est logique !)
"J'ai vraiment du mal à comprendre ce qu'est un nouveau Paquet: c'est un nouveau jeu de cartes cartes ou ça remet dans cartes toutes les cartes qui sont dans le constructeur?"
Si tu fais un new Paquet, ce sera un nouveau Paquet, avec de nouvelles cartes, parce que les cartes que tu as pioché tu les as donné aux joueurs, donc à moins de les remettre dans le paquet, elles ne peuvent pas revenir.
Par contre pour ta distribution de cartes, il faut pas faire cartes.get(i); et remove(i) dans la boucle parce que tu décales les indices deux fois, alors ça fait un résultat très loin de ce que tu veux je pense.
Exemple : [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, ...] Joueur 1 : get(0)=0, remove(0)=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, ...] get(1)=2, remove(1)=[1,3,4,5,6,7,8,9,10,11,12,13,14,15, ...] get(2)=4, remove(2)=[1,3,5,6,7,8,9,10,11,12,13,14,15, ...] get(3)=6, remove(3)=[1,3,5,7,8,9,10,11,12,13,14,15, ...] get(4)=8, remove(4)=[1,3,5,7,9,10,11,12,13,14,15, ...] Joueur 2 : get(0)=1, remove(0)=[3,5,7,9,10,11,12,13,14,15, ...] get(1)=5, remove(1)=[3,7,9,10,11,12,13,14,15, ...] get(2)=9, remove(2)=[3,7,10,11,12,13,14,15, ...] get(3)=11, remove(3)=[3,7,10,12,13,14,15, ...] get(4)=13, remove(4)=[3,7,10,12,14,15, ...]
En plus, comme tu fais des remove, les cartes ne reviennent plus ! Est-ce que tu as prévu de les remettre dans le paquet une fois que les joueurs ont finis de jouer ? Parce que sinon, tu vas te retrouver avec un paquet vide, et tu ne pourras plus tirer de cartes (c'est logique !)
"J'ai vraiment du mal à comprendre ce qu'est un nouveau Paquet: c'est un nouveau jeu de cartes cartes ou ça remet dans cartes toutes les cartes qui sont dans le constructeur?"
Si tu fais un new Paquet, ce sera un nouveau Paquet, avec de nouvelles cartes, parce que les cartes que tu as pioché tu les as donné aux joueurs, donc à moins de les remettre dans le paquet, elles ne peuvent pas revenir.
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
3 févr. 2013 à 22:09
3 févr. 2013 à 22:09
Merci pour ta réponse j'ai fait tous les changements que tu as mentionné mais j'ai détecté un autre problème. Je me suis demandé si mon appel d'image était bon et en fait, il se trouve que this.clan ne renvoie rien du tout!
J'ai mis ça dans la classe principale pour tester:
et eclipse me renvoie:
J'ai pourtant modifié toutes les classes comme tu m'as dit et je n'arrive pas à comprendre où est l'erreur.
J'ai mis ça dans la classe principale pour tester:
public static void main(String[] args) { SchottenTotten laPartie=new SchottenTotten(); a=new Carte(Violet, 5); System.out.println("/Schotten totten/Images/"+a.clan+a.val+".GIF"); System.out.println(a.clan); System.out.println(a.val); }
et eclipse me renvoie:
/Schotten totten/Images/null5.GIF null 5.
J'ai pourtant modifié toutes les classes comme tu m'as dit et je n'arrive pas à comprendre où est l'erreur.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 févr. 2013 à 22:20
3 févr. 2013 à 22:20
a=new Carte(Violet, 5); ne peux pas marcher, ça m'étonne même que tu arrives à compiler...
public static void main(String[] args) { Carte a=new Carte(Clan.Violet, 5); System.out.println(a.clan.name()); System.out.println(a.val); System.out.println("/Schotten totten/Images/"+a.clan.name()+a.val+".GIF"); }
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
Modifié par Xenthys le 3/02/2013 à 23:10
Modifié par Xenthys le 3/02/2013 à 23:10
Merci, je ne connaissais pas les méthodes utilisables avec enum. Je vais regarder la doc à ce propos.
Mais l'erreur d'affichage de l'image sur le bouton n'est pas due à ça. J'ai essayé de faire afficher l'image de la carte que j'ai soit avec
Mais l'erreur d'affichage de l'image sur le bouton n'est pas due à ça. J'ai essayé de faire afficher l'image de la carte que j'ai soit avec
CartesGauche[2].setIcon(new ImageIcon("Schotten totten/Images/"+a.clan.name()+a.val+".GIF"));, soit avec
CartesGauche[1]=new ImageIcon("Schotten totten/Images/Bleu1.GIF")mais ça ne marche pas. La première méthode a marché tout à l'heure mais entretemps je ne sais plus ce que j'ai changé et à la place d'une image, j'ai juste trois petits points qui s'affichent.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
3 févr. 2013 à 23:11
3 févr. 2013 à 23:11
Une manière simple de connaitre toutes les méthodes disponibles de Clan :
Pour tes images, si tu n'es pas sûr du chemin relatif, donne le chemin complet, "C:/..."
for (java.lang.reflect.Method method : Clan.class.getMethods()) System.out.println(method.toString());
Pour tes images, si tu n'es pas sûr du chemin relatif, donne le chemin complet, "C:/..."
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
Modifié par Xenthys le 3/02/2013 à 23:15
Modifié par Xenthys le 3/02/2013 à 23:15
Pardon, je m'étais trompé en mettant le nom du fichier: il faut mettre Images/Bleu1.GIF par exemple. Il ne faut pas remonter au nom du projet. Par contre, la méthode shuffle bugge:
J'ai toujours et encore une erreur de NUllPointerException.
Et je voulais savoir, pour réadapter la taille du bouton à mon image, je dois définir une classe qui dérive de JButton ou existe-t-il une méthode déjà créée?
void distribueDebut(){ Paquet p = new Paquet(); Collections.shuffle(cartes); for(int i=0; i<5;i++){ a=p.cartes.get(i); CartesGauche[i].setIcon(new ImageIcon("Images/"+a.clan.name()+a.val+".GIF")); for(int j=0;j<5;j++){ b=p.cartes.get(j); CartesDroite[j].setIcon(new ImageIcon("Images/"+b.clan.name()+b.val+".GIF")); } } }
J'ai toujours et encore une erreur de NUllPointerException.
Et je voulais savoir, pour réadapter la taille du bouton à mon image, je dois définir une classe qui dérive de JButton ou existe-t-il une méthode déjà créée?
Xenthys
Messages postés
31
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
2 mars 2013
1
3 févr. 2013 à 23:39
3 févr. 2013 à 23:39
En fait, tout marche nikel. Je vais juste regarder comment adapter les images aux boutons. Mais les cartes sont bien distribuées et données aux Joueurs (elles apparaissent sur les boutons des joueurs). Le mélange des cartes marche aussi: c'est moi qui dans ma grande bêtise avait oublié de mettre p. devant cartes pour donner p.cartes. C'est magnifique! Merci infiniment!!!!!!!!!!!!! Tu m'as sauvé d'un mois de désespoir à tourner en rond. :D