Probleme recursive démineur java

entwan -  
 entwan -
Bonjour,


Mon problème est le suivant:
je créer un démineur en java et j'aimerais que lorsqu’on clique sur une case vide une fonction récursive permet de vérifier les cases alentour et si elles sont des cases aussi vides qu'elles se découvrent aussi.

j'avais donc ceci:

 public void DevoileCase( int lignes,  int colonnes) {
    if (lignes >= 0 && lignes <= 12 && colonnes >= 0 && colonnes <= 6 && this.ChoseCell(lignes, colonnes) == false) {
        int NbMA = NbMinesBetween(lignes, colonnes);

        if (NbMA == 0)
            this.map[lignes][colonnes] = Cell.EMPTYCELL;
        if (NbMA != 0)
            this.map[lignes][colonnes] = Cell.NUMBEREDCELL;
        ++nbCaseVue;

        if (NbMA == 0) // partie récursive
        {
            try {
                DevoileCase(lignes + 1, colonnes);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }
            try {
                DevoileCase(lignes + 1, colonnes + 1);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }
            try {
                DevoileCase(lignes, colonnes + 1);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }

            try {
                DevoileCase(lignes - 1, colonnes);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }
            try {
                DevoileCase(lignes - 1, colonnes - 1);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }
            try {
                DevoileCase(lignes, colonnes - 1);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }
            try {
                DevoileCase(lignes - 1, colonnes + 1);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }
            try {
                DevoileCase(lignes + 1, colonnes - 1);
            } catch (java.lang.StackOverflowError e) {
                System.out.println("marche pas ");
            }
        }
    }
}

Donc la Méthode NbmethodeBetween renvoi le nombre de bombe autour ainsi si il n'y a pas de bomb la case prends la valeur de Cell.Empty et j'aimerais que de se fait elle vérifie toutes les cases autour d'elle mais il ya un problème la fonction récursive boucle.

Par exemple si a un endroit il ya une case vide et a cotes aussi alors les deux vont s'appeler en même temps comment la faire s’arrêter.


Merci :)

Configuration: Windows / Firefox 66.0
A voir également:

1 réponse

Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Que fait this.ChoseCell(lignes, colonnes) ?

A priori, je vois un écueil, mais peut-être est-il couvert par cette fonction : tu ne vérifies pas que la case en cours n'a pas déjà été traitée. Si elle est dévoilée, il ne faut rien faire. Sinon la fonction va passer systématiquement sur les mêmes cases...

Xavier
0
entwan
 
This.Chosel verifie si c'est une bombe donc si c'est une bombe il ne fait rien...

Oui j'y ai pensé mais je ne trouve pas comment faire j'ai essayé de faire
public void DevoileCase(final int lignes, final int colonnes) {
if (lignes >= 0 && lignes < nbLines && colonnes >= 0 && colonnes < nbRow && this.map[lignes][colonnes] == Cell.HIDDENCELL) {

soit de rajouter la vérification sur this.map[lignes][colonnes] == Cell.HIDDENCELL

mais ça ne marche pas j'ai aussi pensé à stocker les coordonnes des cases déjà dévoiles dans un tableau et de vérifier qu'il ne soit pas dans le tableau.
0