Probleme recursive démineur java

-
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
Afficher la suite 

1 réponse

Messages postés
3485
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 octobre 2019
915
0
Merci
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
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.
Commenter la réponse de Reivax962