Java: Problème d'utilisation de tableau 2D

vincenormand -  
KX Messages postés 19031 Statut Modérateur -
Bonjour, je fais un jeu de Démineur pour un travail, et mon code plante pour une raison que j'ignore.
Voici le code où survient l'erreur:

JButton tabButton[][] = new JButton[size][size];
//Je crée un tableau dans la classe Boutton
Button tabMines[][] = new Button[size][size];
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(size, size));

//Création du tableau de mines
for(int i = 0; i < size; i++)
{
for(int j = 0; j < size; j++)
{
//Je crée chaques boutons avec la valeur False.
//Avant de faire cela je faisais : tabMines[i][j].setMines(false),
//mais le compilateur plantait car l'objet n'existait pas je pense.
tabMines[i][j] = new Button(false);
}
}
int random = 0;
for(int i = 0; i < size; i++)
{
//Ici, la boucle s'exécute une fois, passe à setMine(true) et setIcon(BOMB_ICON),
//puis recommence, mais la 2ème fois tous les objets Button de la classe on la
// valeur True, donc la boucle DoWhile devient infinie. Alors voilà mon problème.
do
{
//On calcule un chiffre entre 0 et 9
random = (int) (Math.random() * (size - 1));
}
//Répète s'il y a déjà une mine à cet endroit
while (tabMines[size - 1 - random][random].getMine() == true);

//Assignation de la mine à la position donnée
tabMines[size - 1 - random][random].setMine(true);
tabMines[size - 1 - random][random].setIcon(BOMB_ICON);
}

Voilà, merci d'avance pour l'aide.

A voir également:

1 réponse

KX Messages postés 19031 Statut Modérateur 3 020
 
Math.random() renvoit un double entre 0 inclu et 1 exclu
Donc ta valeur random sera comprise entre 0 et size-2 (size-1 est exclu comme 1)
Et size-1-random est compris entre 1 (0 est exclu) et size-1.
Ta boucle do while testera donc uniquement [size-1][0], [size-2][1]... [1][size-2].
Il n'y a donc que size-1 possibilités. Or quand tu exécutes ta boucle for tu élimines à chaque tour une des possibilités de quitter la boucle do while.
Lorsque tu arrives à i=size-1, il ne reste donc plus que tabMines[0][size-1] qui est égal à false, mais la boucle do while ne pourra jamais la trouver et boucle à l'infini.

La résolution de ton problème est donc simple, tu dois faire Math.random() * size;
0
vincenormand
 
Mais je fais déjà: random = (int) (Math.random() * (size - 1));
Mon problème quand je regarde en debug est que au premier tour de boucle DoWhile, "tabMines[size - 1 - random][random].getMine()" retourne false.
Il fait donc setMine() et setIcon(). Puis au 2ème tour du 2ème For, dans le DoWhile, "tabMines[size - 1 - random][random].getMine()" retourne True pour tous les objets qui suivent.
Comme si la ligne :
"tabMines[size - 1 - random][random].setMine(true); "
assignait True à tous les objets dans le tableau quand il devrait seulement l'assigner à "tabMines[size - 1 - random][random]"
En tout cas, merci quand même
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Il faut que tu fasses random = (int) (Math.random() * size); sans le -1 qui est une erreur.
0