Files
SAE21_2025/ControleurMenu.java
2026-04-12 16:40:07 +02:00

136 lines
5.0 KiB
Java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
/**
* Observateur gérant les interactions avec les boutons du menu principal.
*/
public class ControleurMenu implements ActionListener {
/** Constante définissant la valeur de retour en cas d'annulation ou d'erreur de saisie. */
private static final int ERREUR_SAISIE = -1;
/** Constante définissant le nombre minimum de lignes ou colonnes. */
private static final int DIMENSION_MIN = 4;
/** Constante définissant le nombre maximum de lignes ou colonnes. */
private static final int DIMENSION_MAX = 30;
/** Référence vers la fenêtre du menu. */
private MenuPrincipal menu;
/**
* Constructeur de l'écouteur du menu.
* @param menuPrincipal la fenêtre du menu principal.
*/
public ControleurMenu(MenuPrincipal menuPrincipal) {
this.menu = menuPrincipal;
}
/**
* Déclenchée lors d'un clic sur l'un des boutons du menu.
* @param evenement l'action générée par le clic.
*/
@Override
public void actionPerformed(ActionEvent evenement) {
if (evenement.getSource() == this.menu.getBoutonNouvellePartie()) {
lancerNouvellePartie();
} else if (evenement.getSource() == this.menu.getBoutonReprendre()) {
chargerPartieSauvegardee();
} else if (evenement.getSource() == this.menu.getBoutonQuitter()) {
System.exit(0);
}
}
/**
* Demande les dimensions et génère une nouvelle partie si les saisies sont valides.
*/
private void lancerNouvellePartie() {
try {
int nbLignes = demanderValeur("Nombre de lignes (entre 4 et 30) :");
if (nbLignes == ERREUR_SAISIE) return;
int nbColonnes = demanderValeur("Nombre de colonnes (entre 4 et 30) :");
if (nbColonnes == ERREUR_SAISIE) return;
int nbMines = demanderValeur("Nombre total de mines :");
if (nbMines == ERREUR_SAISIE) return;
if (!sontDimensionsValides(nbLignes, nbColonnes, nbMines)) {
JOptionPane.showMessageDialog(menu, "Valeurs incorrectes !");
return;
}
demarrerJeu(nbLignes, nbColonnes, nbMines);
} catch (NumberFormatException exception) {
JOptionPane.showMessageDialog(menu, "Erreur : Vous devez entrer des nombres entiers !");
}
}
/**
* Vérifie si les dimensions entrées par l'utilisateur respectent les limites.
* @param lignes le nombre de lignes choisi.
* @param colonnes le nombre de colonnes choisi.
* @param mines le nombre de mines choisi.
* @return true si tout est correct, false sinon.
*/
private boolean sontDimensionsValides(int lignes, int colonnes, int mines) {
boolean lignesInvalides = lignes < DIMENSION_MIN || lignes > DIMENSION_MAX;
boolean colonnesInvalides = colonnes < DIMENSION_MIN || colonnes > DIMENSION_MAX;
boolean minesInvalides = mines >= (lignes * colonnes) || mines <= 0;
return !lignesInvalides && !colonnesInvalides && !minesInvalides;
}
/**
* Initialise la fenêtre de jeu avec les paramètres validés et ferme le menu.
* @param lignes le nombre de lignes.
* @param colonnes le nombre de colonnes.
* @param mines le nombre de mines.
*/
private void demarrerJeu(int lignes, int colonnes, int mines) {
Grille nouvelleGrille = new Grille(lignes, colonnes, mines);
FenetreJeu fenetre = new FenetreJeu(nouvelleGrille);
fenetre.setVisible(true);
this.menu.dispose();
}
/**
* Ouvre une boîte de dialogue pour demander un entier à l'utilisateur.
* @param message le texte à afficher.
* @return le nombre entier saisi, ou ERREUR_SAISIE en cas d'annulation.
*/
private int demanderValeur(String message) {
String saisie = JOptionPane.showInputDialog(menu, message);
if (saisie == null || saisie.trim().isEmpty()) return ERREUR_SAISIE;
return Integer.parseInt(saisie);
}
/**
* Tente de lire le fichier de sauvegarde et restaure la partie si possible.
*/
private void chargerPartieSauvegardee() {
try {
FileInputStream fluxEntree = new FileInputStream("sauvegarde.dat");
ObjectInputStream lecteurObjet = new ObjectInputStream(fluxEntree);
Grille grilleChargee = (Grille) lecteurObjet.readObject();
lecteurObjet.close();
fluxEntree.close();
FenetreJeu fenetre = new FenetreJeu(grilleChargee);
fenetre.rafraichirTouteLaGrille();
fenetre.setVisible(true);
this.menu.dispose();
} catch (IOException | ClassNotFoundException exception) {
JOptionPane.showMessageDialog(menu, "Aucune sauvegarde trouvée ou fichier corrompu !");
}
}
}