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
+121 -36
View File
@@ -1,50 +1,135 @@
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;
public ControleurMenu(MenuPrincipal m) {
this.menu = m;
/**
* Constructeur de l'écouteur du menu.
* @param menuPrincipal la fenêtre du menu principal.
*/
public ControleurMenu(MenuPrincipal menuPrincipal) {
this.menu = menuPrincipal;
}
@Override
/**
* 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.getBtnNouvellePartie()) {
try {
String strL = JOptionPane.showInputDialog(menu, "Nombre de lignes (entre 4 et 30) :");
if (strL == null) return;
int l = Integer.parseInt(strL);
String strC = JOptionPane.showInputDialog(menu, "Nombre de colonnes (entre 4 et 30) :");
if (strC == null) return;
int c = Integer.parseInt(strC);
String strM = JOptionPane.showInputDialog(menu, "Nombre total de mines :");
if (strM == null) return;
int m = Integer.parseInt(strM);
if (l < 4 || l > 30 || c < 4 || c > 30 || m >= (l * c)) {
JOptionPane.showMessageDialog(menu, "Valeurs incorrectes ! Les dimensions doivent être entre 4 et 30, et les mines inférieures au nombre de cases.");
return;
}
Grille nouvelleGrille = new Grille(l, c, m);
FenetreJeu fenetre = new FenetreJeu(nouvelleGrille);
fenetre.setVisible(true);
this.menu.dispose();
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(menu, "Erreur : Vous devez entrer des nombres entiers !");
}
} else if (evenement.getSource() == this.menu.getBtnReprendre()) {
System.out.println("Chargement de la sauvegarde...");
} else if (evenement.getSource() == this.menu.getBtnQuitter()) {
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 !");
}
}
}