Probleme recursive démineur java

Fermé
entwan - Modifié le 3 juin 2019 à 18:33
 entwan - 3 juin 2019 à 18:11
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
3 juin 2019 à 17:45
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
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