Derniere version du jeu

This commit is contained in:
lecointre
2026-04-12 16:40:07 +02:00
parent 43cc3c1145
commit 86ff392e75
7 changed files with 734 additions and 244 deletions
+111 -42
View File
@@ -2,61 +2,130 @@ 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;
public ControleurGrille(FenetreJeu f, Grille g) {
this.fenetre = f;
this.grille = g;
/**
* 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 e) {
if (this.grille.isPartieTerminee()) return;
public void mouseClicked(MouseEvent evenement) {
if (this.grille.isPartieTerminee()) {
return;
}
for (int i = 0; i < grille.getLignes(); i++) {
for (int j = 0; j < grille.getColonnes(); j++) {
if (e.getSource() == fenetre.getBouton(i, j)) {
Case caseCliquee = grille.getCase(i, j);
if (caseCliquee.isRevelee()) return;
if (e.getButton() == MouseEvent.BUTTON1) {
if (caseCliquee.getMarqueur() != 1) {
boolean aExplose = grille.revelerCase(i, j);
if (aExplose) {
grille.setPartieTerminee(true);
fenetre.afficherDefaite(i, j);
JOptionPane.showMessageDialog(fenetre, "BOUM ! Vous avez sauté sur une mine !");
// NOUVEAU : On ne quitte plus de force, on change juste le bouton
fenetre.changerBoutonEnRetourMenu();
} else {
fenetre.rafraichirTouteLaGrille();
if (grille.estGagnee()) {
grille.setPartieTerminee(true);
JOptionPane.showMessageDialog(fenetre, "Félicitations ! Vous avez trouvé toutes les mines !");
// NOUVEAU : Idem pour la victoire
fenetre.changerBoutonEnRetourMenu();
}
}
}
}
else if (e.getButton() == MouseEvent.BUTTON3) {
caseCliquee.changerMarqueur();
fenetre.rafraichirCase(i, j);
fenetre.mettreAJourCompteur();
}
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;
}
}
}
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
/**
* 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) {}
}