SAE21_2022/ParcoursManuel.java

85 lines
3.6 KiB
Java

import javax.swing.JOptionPane;
/**
* Cette class est une class de parcour de labyrinthe qui se base sur la récurence afin de trouve la sortie le plus vite possible
* @version 1.1
* @author Matthis Fauvet
*/
public class ParcoursManuel {
private int taille;
private int ceCompteur = 0;
private Cellules[][] labyrinthe;
/**
* Constructeur
* @param tableau importation du tableau a parcourir
* @param X position Actuelle en X de l'algo
* @param Y position Actuelle en Y de l'algo
* @param len taille max du labyrinthe
*/
public ParcoursManuel(Cellules[][] tableau, int X, int Y, int len){
this.taille = len;
this.labyrinthe = tableau;
this.Parcourir(X, Y);
}
/**
* Méthode récursive qui fonctionne ainsi :
* A chaque fois que l'on va sur une case , on essaie d'aller en bas, sinon a droite, sinon en haut ou alors sinon a gauche
* si on ne oeut plus aller nulle part, alors on revient a la case précédente en essayant les chemins que l'on avait pas encore essayé
* a chaque fois que l'on passe sur une case, on la rend non-accessible
*
* @param coordX position Actuelle en X de l'algo
* @param coordY position Actuelle en Y de l'algo
*/
public boolean Parcourir(int coordX, int coordY){
boolean done = false;
if(estValide(coordX, coordY)) {
if (this.labyrinthe[coordX][coordY].getType() == Cellules.SORTIE){
JOptionPane.showMessageDialog(null, "Nous avons trouvé un chemin en "+this.ceCompteur+" coups pour ce labyrinthe", "Information", JOptionPane.INFORMATION_MESSAGE);
return true;
} else {
this.labyrinthe[coordX][coordY].setType(Cellules.MUR);
//Appels récursifs
if(done != true){
done = Parcourir(coordX + 1, coordY);
done = Parcourir(coordX, coordY + 1);
done = Parcourir(coordX - 1, coordY);
done = Parcourir(coordX, coordY - 1);
}
}
}
return done;
}
/**
* cette méthode permet de renvoyer true si la prochaine case est valable sinon false. Egalement, a chaque fois que l'on passe sur une nouvelle case, on colorie l'ancienne
* @param pos_x On rentre
* @param pos_y c'est la grille de true et false qui permet de savoir si une cellules est un mur ou un couloir
*/
private boolean estValide(int pos_x, int pos_y) {
this.ceCompteur++;
boolean result = false;
//Si la case passée en paramètre est dans les dimensions du labyrinthe
if (pos_x >= 0 && pos_x < this.taille && pos_y >= 0 && pos_y < this.taille){
//Et si la case est un espace vide
if (this.labyrinthe[pos_x][pos_y].getType() != Cellules.SORTIE && this.labyrinthe[pos_x][pos_y].getType() != Cellules.MUR && this.labyrinthe[pos_x][pos_y].getType() != Cellules.ENTREE){
this.labyrinthe[pos_x][pos_y].peindre(Cellules.VUE);
}
if (this.labyrinthe[pos_x][pos_y].getType() == Cellules.COULOIR || this.labyrinthe[pos_x][pos_y].getType() == Cellules.ENTREE || this.labyrinthe[pos_x][pos_y].getType() == Cellules.SORTIE){
result = true;
}
if (this.labyrinthe[pos_x][pos_y].getType() != Cellules.SORTIE && this.labyrinthe[pos_x][pos_y].getType() != Cellules.MUR && this.labyrinthe[pos_x][pos_y].getType() != Cellules.ENTREE){
this.labyrinthe[pos_x][pos_y].peindre(Cellules.DESSUS);
}
}
return result;
} //Fin estValide()
}