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
Bonjour à tous,

Dans le cadre d'un projet informatique, je dois créer un jeu de cartes. Pour cela, j'ai écrit plusieurs classes dont la classe Carte qui spécifie les attributs de chaque carte (famille et numéro) et la classe Paquet qui est chargée de regrouper la totalité de mes cartes. Ma classe paquet possède donc un constructeur qui est Paquet() où j'ajoute à la liste monPaquet toutes les cartes nécessaires.
J'ai créé une méthode qui est get() et qui est la suivante:

Carte get(int i){
return this.get(i);
}.

Le problème est que, quand dans ma classe principale je lance le programme où j'ai construit ma méthode distribue (pour distribuer les cartes aux deux joueurs), j'ai une erreur de StackOverFlow que je ne comprends pas. J'ai lu qu'il s'agissait d'une erreur liée à une mauvaise récursivité (la fonction s'appelle elle-même). Comment faire pour avoir ce get qui me permettrait d'avoir la carte une fois qu'elle est sortie du paquet?

Je pense que c'est lié au fait que dans la classe Paquet le get est rattaché à une liste (c'est comme ça que j'ai défini monPaquet) alors que dans la classe principale j'ai défini un Paquet et la méthode ne marche plus. Bref, je suis un peu perdu ...

Merci d'avance
A voir également:

20 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 2/02/2013 à 17:27
En effet ce code tourne en rond :

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
0
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
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...
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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...
0
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
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); 
    } 
   
  } 
  
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
2 févr. 2013 à 19:48
Donc il faut reprendre mon troisième code, mais avec la liste "unPaquet"

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...
0
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
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
2 févr. 2013 à 20:15
Ce qui me gène c'est de pouvoir faire ça :

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

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
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?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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 :

protected ArrayList<Carte> unPaquet;

public List<Carte> unPaquet() // ou "getPaquet", "toList", etc.
{
    return unPaquet;
}
0
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
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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 ?
0
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
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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 :

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);
}
0
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
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).
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"));
			
			}
			}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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 :

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);
0
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
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. ;-)
0
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
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?)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 févr. 2013 à 00:15
Tu parles de ça ?

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.
0
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
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 ...
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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 :

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());
}
0
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
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.
0
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
Au temps pour moi, la première ligne que tu as écrite marche très bien et la carte est donnée:
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?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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.

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.
0
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
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:
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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");
}
0
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
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
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 févr. 2013 à 23:11
Une manière simple de connaitre toutes les méthodes disponibles de Clan :

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:/..."
0
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
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:

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