Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme de flood fill pour jeu de démineur

Sujet résolu
    8 mai 2022 à 14:37:00

    Bonjour,

    Je débute Java et je cherche à faire un jeu de démineur. J'aimerais faire une méthode qui révèle toutes les cases vides avec aucune mine voisine lorsqu'on clique sur une case vide. J'ai déjà réussi à obtenir quelque chose, mais ma méthode se contente de révéler les cases avec aucune mine voisine seulement, alors que je devrais obtenir "un mur" de chiffre comme dans le vrai jeu de démineur. 

    Voici ce que j'obtiens :

     Et le code de ma méthode :

    public void devoilement(int x, int y){
               
                
                
               if(x >= 0 && x <= 9 && y >=0 && y <= 9 && this.p.getCellule(x, y).getNbMinesVoisines()==0 && !p.getCellule(x, y).getVisibilite() ) {
                       p.getCellule(x, y).setVisibilite(true);
                       devoilement( x+1, y);              
                       devoilement( x-1, y);             
                       devoilement( x,  y+1);
                       devoilement( x,  y-1);      
               }       
               else{ 
                   return;
               }   
                     
            }

    Je pense que le probleme vient de la condition "getNbMinesVoisines()==0" mais sans cette condition, j'ai une erreur StackOverFlow car la méthode cherche à rendre visible deux mêmes cases en boucle.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2022 à 17:04:44

      Bonjour,

      Ton algorithme a deux problèmes.

      Le premier, c'est que tu ne considères que deux cas : celui où tu ouvres une case et ses voisines et celui où tu ne fais rien. Or, il y en a un troisième, celui où tu ouvres une case mais pas ses voisines.

      Le deuxième concerne ton problème de récursivité infinie. Pour éviter d'ouvrir une case plusieurs fois, il faut juste tester si elle est déjà ouverte. Si c'est le cas, on ne fait rien.

      • Partager sur Facebook
      • Partager sur Twitter
        8 mai 2022 à 17:55:23

        Merci beaucoup, j'ai réussi à bricoler quelque chose avec vos indications.

        public void devoilement(int x, int y){
                   
                   if(x < 0 && x > 9 && y < 0 && y > 9 && this.p.getCellule(x, y).getVisibilite()==true )
                       return;
                   
                   if(x >= 0 && x <= 9 && y >=0 && y <= 9 && this.p.getCellule(x, y).getNbMinesVoisines()!=0)
                       this.p.getCellule(x, y).setVisibilite(true);
                    
                   if(x >= 0 && x <= 9 && y >=0 && y <= 9 && !p.getCellule(x, y).getVisibilite() ) {
                           p.getCellule(x, y).setVisibilite(true);
                           devoilement( x+1, y);              
                           devoilement( x-1, y);             
                           devoilement( x,  y+1);
                           devoilement( x,  y-1);      
                   }       
                   else{ 
                       return;
                   }   
                         
                }

        Ca à l'air de fonctionner !

        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2022 à 19:48:10

          Bravo.

          Il y a juste une petite erreur de logique dans le premier if.

          On ne fait rien

          • si on est en dehors de la grille
          • ou alors si la case est déjà visible

          La condition correcte est donc

          if ((x < 0 || x >= LARGEUR || y < 0 || y >= HAUTEUR) || p.isVisible()) {
             return;
          }



          • Partager sur Facebook
          • Partager sur Twitter
            8 mai 2022 à 20:20:38

            Effectivement, petite erreur d'inattention, merci.
            • Partager sur Facebook
            • Partager sur Twitter

            Algorithme de flood fill pour jeu de démineur

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown