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) {} }