Probleme lié à la liste d'objet et variable commune

Résolu/Fermé
Makuzepo Messages postés 3 Date d'inscription vendredi 27 mai 2016 Statut Membre Dernière intervention 28 mai 2016 - 27 mai 2016 à 15:20
Makuzepo Messages postés 3 Date d'inscription vendredi 27 mai 2016 Statut Membre Dernière intervention 28 mai 2016 - 28 mai 2016 à 12:15
Bonjour,
Je travaille sur un projet de jeu en Java. J'ai fait plusieurs class : ma fenetre, mes panneaux, mes monstres, mes map etc...
Le probleme est que je crée une Arraylist<Monstre> pour ranger mes objets monstres, chaque monstre est initialisé avec les mêmes attributs sauf pour leur rang (ça me permet de faire la différence entre eux et de gérer leur ordre d'apparition), cependant lorsque j'initialise la valeur de rang pour un objet cette modification s'applique à tous mes objets !! Et ce n'est pas ce que je veux. Je ne sais pas où est mon erreur. Si vous avez des idées je suis preneur.
En vous remerciant d'avance !
Voici ce que j'ai :

à l'initialisation :

Place 0
Place 1
Place 2
Place 3
Place 4
Place 5
Place 6
Place 7
Place 8
Place 9
et quand je vérifie dans une deuxieme boucle:

Place 2 9
Place 2 9
Place 2 9
Place 2 9
Place 2 9
Place 2 9
Place 2 9
Place 2 9
Place 2 9
Place 2 9

Ma boucle d'initialisation est:
horde étant ma ArraylList. Size la taille.

for (int i = 0; i<size; i++){
Monstre mons = new Monstre();
horde.add(mons);
horde.get(i).setPlace(i);
System.out.println("Place "+horde.get(i).place);
}


Ma boucle de verif :

for (int i = 0; i<horde.size(); i++){
System.out.println("Place 2 "+horde.get(i).place);
}

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
27 mai 2016 à 19:56
Bonjour,

J'éviterai d'utiliser get(i) comme tu l'as fait à l'ajout dans la liste, on peut s'en passer et c'est pas plus mal, car rien ne garanti que ta liste soit vide au départ et dans ce cas tu vas être décalé.

for (int i = 0; i<size; i++){
    Monstre mons = new Monstre();
    mons.setPlace(i);
    horde.add(mons);
    System.out.println("Add "+mons.place);
}

for (int i = 0; i<horde.size(); i++){
    System.out.println("Place "+i+":  "+horde.get(i).place);
}

Ceci étant dit ton problème doit être ailleurs.

Il faudrait voir comment tu as déclaré ton attribut place et ta méthode setPlace dans la classe Monstre.

Remarque : normalement tu devrais avoir un getPlace() il faut que tu l'utilises plutôt que passer directement par l'attribut place (qui devrait d'ailleurs être masqué)
0
Makuzepo Messages postés 3 Date d'inscription vendredi 27 mai 2016 Statut Membre Dernière intervention 28 mai 2016
28 mai 2016 à 10:06
Bonjour KX,

Merci pour tes conseils, j'ai modifié en conséquence. Je pense aussi que mon problème est ailleurs...
Voici ma classe Monstre :
public class Monstre{
	public static int money, point, posX, posY, vie, fin, vitesse;//, place;
	private static int place;
	public static boolean front = true, back = false, up = false, down = false, visible= true, mort = false;

	public Monstre(){
		money = 10;
		point = 10;
		vie = 70;
		posX=0;
		posY=100;
		vitesse = 100;
		fin = 0;
		//place = 0;
	}

	public static void setPosX(int x){
		posX = x;
	}
	public static void setPosY(int y){
		posY = y;
	}
	public static void setPlace(int p){
		place = p;
	}
	public static int getPlace(){
		return place;
	}
}


Voici ce que j'obtient :
Place Add 0
Place Add 1
Place Add 2
Place Add 3
Place Add 4
Place Add 5
Place Add 6
Place Add 7
Place Add 8
Place Add 9
i : 0 Place : 9
i : 1 Place : 9
i : 2 Place : 9
i : 3 Place : 9
i : 4 Place : 9
i : 5 Place : 9
i : 6 Place : 9
i : 7 Place : 9
i : 8 Place : 9
i : 9 Place : 9
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
28 mai 2016 à 11:29
Le problème est que tu as déclaré toutes tes variables et méthodes static, elles sont donc communes à tout les monstres peu importe la spécificité de chaque objet.

public class Monstre{
	private int money, point, posX, posY, vie, fin, vitesse, place;
	private boolean front, back, up, down, visible, mort;

	public Monstre() {
		money = 10;
		point = 10;
		posX=0;
		posY=100;
		vie = 70;
		fin = 0;
		vitesse = 100;
		place = 0;
		front = true;
		back = false;
		up = false;
		down = false;
		visible = true;
		mort = false;
	}

	public void setPosX(int x) {
		posX = x;
	}
	public void setPosY(int y) {
		posY = y;
	}
	public void setPlace(int p) {
		place = p;
	}
	public int getPlace(){
		return place;
	}
}

Remarque : je pense que tu peux déduire certains attributs à partir des autres, il est donc inutile de les conserver.
Par exemple, tu peux enlever
mort
, car tu peux le calculer avec
vie == 0
...

public boolean isMort() {
    return vie == 0;
}

Il en a va sûrement de même pour front, back, up et down qui doivent se calculer à partir de posX et posY (selon ce que tu veux faire).
0
Makuzepo Messages postés 3 Date d'inscription vendredi 27 mai 2016 Statut Membre Dernière intervention 28 mai 2016
Modifié par Makuzepo le 28/05/2016 à 12:16
Je pense que c'était bien ça mon problème, je débute en Java et je ne connaissais pas tout le pouvoir du mot clé static !!
Comme ma variable n'était plus en static, la valeur ne pouvait pas changer, je suis donc passé par le constructeur pour définir sa place:

public Monstre(int i){
         ...
  place = i;
 }


Voila ce que j'ai maintenant :

Place Add 0
Place Add 1
Place Add 2
Place Add 3
Place Add 4
Place Add 5
Place Add 6
Place Add 7
Place Add 8
Place Add 9

Place i : 0 : 0
Place i : 1 : 1
Place i : 2 : 2
Place i : 3 : 3
Place i : 4 : 4
Place i : 5 : 5
Place i : 6 : 6
Place i : 7 : 7
Place i : 8 : 8
Place i : 9 : 9

Merci en tout cas. Tu as été rapide et efficace !!
A bientôt !
0