Problème java boucle

Fermé
tiDevDu54 Messages postés 13 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 28 août 2012 - 15 nov. 2009 à 21:46
tiDevDu54 Messages postés 13 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 28 août 2012 - 16 nov. 2009 à 15:41
Bonjour,
Je vous résume mon jeu en java pour le moment :
J’ai une grille sur laquelle j’ai placé un bonhomme (image) qui se déplace grâce aux touches directionnelles. Et sur cette grille je voudrai mettre au hasard plusieurs cadeaux sur mes cases. Mes cases sont des JPanels. En fait j’essai de trouver un moyen pour ne pas avoir deux cadeaux sur la même case. J’ai écrit une fonction : généréCadeau( int nombreCadeau). Je vous écris le code, malheureusement sa ne fonctionne pas et j’aimerai savoir pourquoi.

//création d'un tableau de hachage pour mes cadeaux
for(int i=0;i<nombreCadeau;i++)
{
tabCadeau.put("cadeau"+i, new JLabel( new ImageIcon("image/cadeau.gif")));
}

////////////////////////////////////////////
int nbPanel = 109; //nombre de panel
int hazar = 0;
int i = 0;
int j;

//on gère directement le premier cadeau
hazar = (int) (Math.random()*nbPanel);
tabPanel.get("monPanel"+hazar).add(tabCadeau.get("cadeau"+i));
tableauTirage.add(hazar);

i++;

while (tableauTirage.size()!=nombreCadeau)
{
//on tire un nombre au hasard
hazar = (int) (Math.random()*nbPanel);


//on insère dans le tableau le nombre tiré au hasard
tableauTirage.add(hazar);

j = 0;

//tant qu'on n'arrive pas à la fin du tableau
//et que le nombre tiré au hasard est diférent du nombre à l'élément j du tableau
while((hazar!=tableauTirage.get(j)) || (j<tableauTirage.size()))
{
//on avance
j++;

}

//on arrive ici soit parce qu'on est arrivé à la fin du tableau
//soit parce que le nombre tiré au hasard est égal au nombre j dans le tableau

//on test si le nombre dans le tableau est égal au nombre tiré au hasard
if(hazar!=tableauTirage.get(j))
{


//si le nombre tiré au hasard n'est pas trouvé dans le tableau des nombres précédement tiré au hasard
//on ajoute le cadeau au panel i
tabPanel.get("monPanel"+hazar).add(tabCadeau.get("cadeau"+i));
//on retire un nombre au hasard
hazar = (int) (Math.random()*nbPanel);
i++;
}
}


pane.add(layeredPane);

}

Sa a l’air de bloquer dans les indices dans le deuxième while
A voir également:

4 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
15 nov. 2009 à 22:09
Bonjour,

Tel qu'est écrit ton test dans ta boucle While, en sortie de boucle tu auras toujours j == tableauTirage.Size().
Mets un && plutôt qu'un || dans ton test.
Par ailleurs, si tu arrives au bout de la boucle, le premier test va planter car j sera plus grand que la taille du tableau. Heureusement, java fait de l'évaluation paresseuse, donc il te suffit d'inverser la position de tes deux tests pour prévenir ce problème.

Xavier
0
tiDevDu54 Messages postés 13 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 28 août 2012
16 nov. 2009 à 07:51
daccord merci je vais essayer, mais normalement je veux que l'on sorte de la boucle spour l'une ou l'autre des deux conditions. Le && ne veut pas signifier que l'on sort seulement si les deux conditions sont respectées en même temps ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
16 nov. 2009 à 11:19
le (condition1 && condition2) signifie que tu rentres dans le bloc seulement si les deux conditions sont vraies en même temps. De plus, si la première est fausse, alors java ne prend même pas la peine d'évaluer la deuxième (c'est l'évaluation paresseuse) ; cela a une importance si tu ne veux pas qu'une fonction dans condition2 soit appelée si de toute façon condition1 est fausse et donc que quoi qu'il arrive tu n'entreras de toutes façon pas dans la boucle.
0
tiDevDu54 Messages postés 13 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 28 août 2012
16 nov. 2009 à 15:41
d'accord merci pour les détails. Ce qui m'embète c'est que je n'arrive toujours pas a éviter de placer plusieurs cadeaux sur la même case. Il doit rester des erreurs dans ma fonction genererCadeau.
0