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 !"); } } }