136 lines
5.0 KiB
Java
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 !");
|
|
}
|
|
}
|
|
}
|