132 lines
4.6 KiB
Java
132 lines
4.6 KiB
Java
import java.awt.event.MouseEvent;
|
|
import java.awt.event.MouseListener;
|
|
import javax.swing.JOptionPane;
|
|
|
|
/**
|
|
* Observateur gérant les interactions de la souris sur la grille de jeu.
|
|
*/
|
|
public class ControleurGrille implements MouseListener {
|
|
|
|
/** Constante pour le bouton gauche de la souris (Capture 26). */
|
|
private static final int BOUTON_GAUCHE = MouseEvent.BUTTON1;
|
|
|
|
/** Constante pour le bouton droit de la souris (Capture 26). */
|
|
private static final int BOUTON_DROIT = MouseEvent.BUTTON3;
|
|
|
|
/** Message affiché en cas de défaite. */
|
|
private static final String MESSAGE_DEFAITE = "BOUM ! Vous avez sauté sur une mine !";
|
|
|
|
/** Message affiché en cas de victoire. */
|
|
private static final String MESSAGE_VICTOIRE = "Félicitations ! Vous avez trouvé toutes les mines !";
|
|
|
|
/** Référence à la fenêtre affichant la grille. */
|
|
private FenetreJeu fenetre;
|
|
|
|
/** Référence au modèle contenant la logique du plateau. */
|
|
private Grille grille;
|
|
|
|
/**
|
|
* Constructeur de l'écouteur de la grille.
|
|
* @param fenetreJeu la fenêtre contenant les boutons.
|
|
* @param grilleJeu la grille contenant les données.
|
|
*/
|
|
public ControleurGrille(FenetreJeu fenetreJeu, Grille grilleJeu) {
|
|
this.fenetre = fenetreJeu;
|
|
this.grille = grilleJeu;
|
|
}
|
|
|
|
/**
|
|
* Méthode appelée lors d'un clic sur n'importe quel bouton de la grille.
|
|
* @param evenement les informations du clic souris.
|
|
*/
|
|
@Override
|
|
public void mouseClicked(MouseEvent evenement) {
|
|
if (this.grille.isPartieTerminee()) {
|
|
return;
|
|
}
|
|
|
|
for (int ligne = 0; ligne < grille.getLignes(); ligne++) {
|
|
for (int colonne = 0; colonne < grille.getColonnes(); colonne++) {
|
|
if (evenement.getSource() == fenetre.getBouton(ligne, colonne)) {
|
|
traiterClicSurCase(evenement, ligne, colonne);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Identifie le type de clic (gauche ou droit) et appelle la méthode correspondante.
|
|
* @param evenement l'action de la souris.
|
|
* @param ligne la ligne de la case cliquée.
|
|
* @param colonne la colonne de la case cliquée.
|
|
*/
|
|
private void traiterClicSurCase(MouseEvent evenement, int ligne, int colonne) {
|
|
Case caseCliquee = grille.getCase(ligne, colonne);
|
|
if (caseCliquee.isRevelee()) {
|
|
return;
|
|
}
|
|
|
|
if (evenement.getButton() == BOUTON_GAUCHE) {
|
|
gererClicGauche(caseCliquee, ligne, colonne);
|
|
} else if (evenement.getButton() == BOUTON_DROIT) {
|
|
gererClicDroit(caseCliquee, ligne, colonne);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Tente de révéler une case et gère l'éventuelle explosion.
|
|
* @param caseCliquee la case logique ciblée.
|
|
* @param ligne index de ligne.
|
|
* @param colonne index de colonne.
|
|
*/
|
|
private void gererClicGauche(Case caseCliquee, int ligne, int colonne) {
|
|
if (caseCliquee.getMarqueur() == Case.MARQUEUR_ETOILE) {
|
|
return;
|
|
}
|
|
|
|
boolean aExplose = grille.revelerCase(ligne, colonne);
|
|
if (aExplose) {
|
|
grille.setPartieTerminee(true);
|
|
fenetre.afficherDefaite(ligne, colonne);
|
|
JOptionPane.showMessageDialog(fenetre, MESSAGE_DEFAITE);
|
|
fenetre.changerBoutonEnRetourMenu();
|
|
} else {
|
|
fenetre.rafraichirTouteLaGrille();
|
|
verifierVictoire();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Teste si toutes les cases saines ont été révélées et annonce la victoire.
|
|
*/
|
|
private void verifierVictoire() {
|
|
if (grille.estGagnee()) {
|
|
grille.setPartieTerminee(true);
|
|
JOptionPane.showMessageDialog(fenetre, MESSAGE_VICTOIRE);
|
|
fenetre.changerBoutonEnRetourMenu();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Pose, change ou retire un marqueur sur la case ciblée.
|
|
* @param caseCliquee la case logique ciblée.
|
|
* @param ligne index de ligne.
|
|
* @param colonne index de colonne.
|
|
*/
|
|
private void gererClicDroit(Case caseCliquee, int ligne, int colonne) {
|
|
caseCliquee.changerMarqueur();
|
|
fenetre.rafraichirCase(ligne, colonne);
|
|
fenetre.mettreAJourCompteur();
|
|
}
|
|
|
|
/** @param evenement l'événement souris. */
|
|
public void mousePressed(MouseEvent evenement) {}
|
|
/** @param evenement l'événement souris. */
|
|
public void mouseReleased(MouseEvent evenement) {}
|
|
/** @param evenement l'événement souris. */
|
|
public void mouseEntered(MouseEvent evenement) {}
|
|
/** @param evenement l'événement souris. */
|
|
public void mouseExited(MouseEvent evenement) {}
|
|
}
|