Derniere version du jeu
This commit is contained in:
+121
-36
@@ -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 !");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user