2023-04-27 21:19:45 +02:00
import java.util.Random ;
import javax.swing.JFrame ;
import javax.swing.JOptionPane ;
2023-04-28 20:34:59 +02:00
/ * *
* Class pour créer les différent parcours de l ' algo Aleatoire
* @version 1 . 1
* @author Matthis Fauvet
* /
2023-04-27 21:19:45 +02:00
public class AlgoAlea {
private boolean [ ] [ ] map ;
private Cellules [ ] [ ] grille ;
private int cetteTaille ;
private int comptErreur = 0 ;
private int [ ] coordGate ;
private These notreThese ;
private JFrame cetteFrame ;
2023-04-28 20:34:59 +02:00
/ * *
* Class qui créer un objet Algo Aleatoire pour résoudre les labyrinthe
* @param uneTaille c ' est la taille du labyrinthe
* @param tableau c ' est la grille de true et false qui permet de savoir si une cellules est un mur ou un couloir
* @param uneGrille tableau double dimension qui stock les différentes Cellules .
* @param uneFrame c ' est la fenetre qui affiche le labyrinthe
* /
2023-04-27 21:23:45 +02:00
public AlgoAlea ( int uneTaille , boolean [ ] [ ] tableau , Cellules [ ] [ ] uneGrille , JFrame uneFrame ) {
2023-04-27 21:19:45 +02:00
this . map = tableau ;
this . grille = uneGrille ;
this . cetteFrame = uneFrame ;
this . cetteTaille = uneTaille ;
}
/* ==================================== AUtomatique ==================================== */
2023-04-28 20:34:59 +02:00
/ * *
* la méthode auto ( ) permet de parcourir 100 fois le labyrinthe puis de print la moyenne de coup de résolutions
* ( en combien de coup a été résolue le lab )
* /
2023-04-27 21:19:45 +02:00
public void auto ( ) {
//outils.PrintGrilleBool(this.map,this.cetteTaille);
//outils.PrintGrilleCell(this.grille, this.cetteTaille);
int decompte = 0 ;
2023-04-28 20:34:59 +02:00
int [ ] tabRes = new int [ 100 ] ;
2023-04-27 21:19:45 +02:00
Random ran = new Random ( ) ;
int nxt = 0 ;
2023-04-28 20:34:59 +02:00
while ( decompte < 100 ) {
2023-04-27 21:19:45 +02:00
int compteur = 0 ;
this . coordGate = outils . ParcoursCell ( this . grille , this . cetteTaille ) ;
this . notreThese = new These ( coordGate [ 0 ] , coordGate [ 1 ] , this . cetteTaille , this . map ) ;
while ( this . notreThese . isArrived ( coordGate [ 2 ] , coordGate [ 3 ] ) ! = These . ARRIVE ) {
nxt = ran . nextInt ( 4 ) ;
if ( nxt = = 0 ) {
this . notreThese . goRight ( ) ;
} else if ( nxt = = 1 ) {
this . notreThese . goDown ( ) ;
} else if ( nxt = = 2 ) {
this . notreThese . goLeft ( ) ;
} else {
this . notreThese . goTop ( ) ;
}
compteur + = 1 ;
estInfini ( compteur ) ;
}
tabRes [ decompte ] = compteur ;
decompte + + ;
}
JOptionPane . showMessageDialog ( null , " Nous avons une moyenne de : " + outils . moyenneTabint ( tabRes ) + " pour ce labyrinthe " , " Information " , JOptionPane . INFORMATION_MESSAGE ) ;
}
/* ==================================== Manuelle ==================================== */
2023-04-28 20:34:59 +02:00
/ * *
* la class manuel propose une vision / utilisation manuel de notre algo tout en proposant de voir ses actions étape par étape
* /
2023-04-27 21:19:45 +02:00
public void manuel ( ) {
this . coordGate = outils . ParcoursCell ( this . grille , this . cetteTaille ) ;
this . notreThese = new These ( coordGate [ 0 ] , coordGate [ 1 ] , this . cetteTaille , this . map ) ;
Attente attendre = new Attente ( this . notreThese , this . grille , this . coordGate ) ;
this . cetteFrame . addKeyListener ( attendre ) ;
}
/* ==================================== INFINI ==================================== */
2023-04-28 20:34:59 +02:00
/ * *
* Dans un cas ou l ' algo réalise un trop grand nombre de fois des actions , on peut conjecturer que le lab n ' est juste pas finissable .
* @param unCompteur c ' est le nombre total de coup / déplacement tenté pour arrivé a la fin
* /
2023-04-27 21:19:45 +02:00
public void estInfini ( int unCompteur ) {
2023-04-28 20:34:59 +02:00
if ( unCompteur > 20000 ) {
2023-04-27 21:19:45 +02:00
this . comptErreur + + ;
}
if ( this . comptErreur > 3 ) {
JOptionPane . showMessageDialog ( null , " Le labyrinthe est trop probablement non-finissable " , " Erreur " , JOptionPane . ERROR_MESSAGE ) ;
System . exit ( 1 ) ;
}
}
}