java doc et reglage probleme win/lose
This commit is contained in:
+150
-102
@@ -1,8 +1,10 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
// Fenetre principal du jeu (ou il y a la grille de boutons)
|
||||
|
||||
/**
|
||||
* Fenêtre principale du jeu.
|
||||
* Gère l'interface de la partie en cours, la grille de boutons, les clics et les conditions de fin de partie.
|
||||
*/
|
||||
public class FenetreJeu {
|
||||
|
||||
private JFrame fenetre;
|
||||
@@ -11,67 +13,72 @@ public class FenetreJeu {
|
||||
private Grille grille;
|
||||
private boolean partieTerminee = false;
|
||||
private JLabel labelStatut;
|
||||
private JButton boutonSauver;
|
||||
|
||||
/**
|
||||
* Constructeur de la fenêtre de jeu.
|
||||
* @param g La grille contenant les données des cases et des mines.
|
||||
*/
|
||||
public FenetreJeu(Grille g) {
|
||||
this.grille = g;
|
||||
int l = grille.getLigne();
|
||||
int c = grille.getColonne();
|
||||
this.grille = g;
|
||||
int l = grille.getLigne();
|
||||
int c = grille.getColonne();
|
||||
|
||||
fenetre = new JFrame("Demineur");
|
||||
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
fenetre = new JFrame("Demineur");
|
||||
fenetre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
|
||||
fenetre.addWindowListener(new ActionFermerFenetre(this));
|
||||
|
||||
panneauGrille = new JPanel();
|
||||
panneauGrille.setLayout(new GridLayout(l, c));
|
||||
boutons = new JButton [l][c];
|
||||
panneauGrille = new JPanel();
|
||||
panneauGrille.setLayout(new GridLayout(l, c));
|
||||
boutons = new JButton [l][c];
|
||||
|
||||
// creation de tous les boutons de la grille
|
||||
// Création de tous les boutons de la grille
|
||||
for (int i = 0; i < l; i++) {
|
||||
for (int j = 0; j < c; j++) {
|
||||
boutons[i][j] = new JButton();
|
||||
boutons[i][j].setPreferredSize(new Dimension(45, 45));
|
||||
boutons[i][j].setFont(new Font("Arial", Font.BOLD, 16));
|
||||
boutons[i][j].addMouseListener(new ActionCase(this, i, j));
|
||||
panneauGrille.add(boutons[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < l; i++) {
|
||||
for (int j = 0; j < c; j++) {
|
||||
boutons[i][j] = new JButton();
|
||||
boutons[i][j].setPreferredSize(new Dimension(45, 45));
|
||||
boutons[i][j].setFont(new Font("Arial", Font.BOLD, 16));
|
||||
// ecouteur de clics
|
||||
boutons[i][j].addMouseListener(new ActionCase(this, i, j));
|
||||
panneauGrille.add(boutons[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
fenetre.setLayout(new BorderLayout());
|
||||
fenetre.setLayout(new BorderLayout());
|
||||
fenetre.add(panneauGrille, BorderLayout.CENTER);
|
||||
|
||||
// Panneau de contrôle en bas
|
||||
// Panneau de contrôle en bas
|
||||
JPanel panneauBas = new JPanel();
|
||||
panneauBas.setLayout(new BorderLayout());
|
||||
|
||||
labelStatut = new JLabel("Partie en cours...", SwingConstants.CENTER);
|
||||
labelStatut.setFont(new Font("Arial", Font.BOLD, 14));
|
||||
|
||||
// pour aligner les boutons horizontalement
|
||||
JPanel conteneurBoutons = new JPanel();
|
||||
|
||||
JButton boutonMenu = new JButton("Menu Principal");
|
||||
boutonMenu.addActionListener(new ActionRetourMenu(fenetre));
|
||||
|
||||
JButton boutonSauver = new JButton("Sauver et Quitter");
|
||||
boutonSauver.addActionListener(new ActionSauverQuitter(grille));
|
||||
boutonSauver = new JButton("Sauver et Quitter");
|
||||
boutonSauver.addActionListener(new ActionSauverQuitter(this));
|
||||
|
||||
conteneurBoutons.add(boutonMenu);
|
||||
conteneurBoutons.add(boutonSauver);
|
||||
|
||||
panneauBas.add(labelStatut, BorderLayout.NORTH);
|
||||
panneauBas.add(conteneurBoutons, BorderLayout.SOUTH);
|
||||
|
||||
fenetre.add(panneauBas, BorderLayout.SOUTH);
|
||||
|
||||
|
||||
fenetre.add(panneauBas, BorderLayout.SOUTH);
|
||||
|
||||
fenetre.pack();
|
||||
fenetre.setLocationRelativeTo(null);
|
||||
fenetre.setVisible(true);
|
||||
actualiserAffichage();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Vérifie si toutes les cases sans mine ont été révélées.
|
||||
* Si c'est le cas, déclenche l'état de victoire.
|
||||
*/
|
||||
public void verifierVictoire() {
|
||||
int casesAReveler = (grille.getLigne() * grille.getColonne());
|
||||
int nbMines = 0;
|
||||
@@ -86,113 +93,151 @@ public class FenetreJeu {
|
||||
|
||||
if (nbRevelees == (casesAReveler - nbMines)) {
|
||||
partieTerminee = true;
|
||||
bloquerSauvegarde();
|
||||
System.out.println("Vous avez gagné !");
|
||||
labelStatut.setFont(new Font("Arial", Font.BOLD, 24));
|
||||
labelStatut.setForeground(new Color(0, 150, 0));
|
||||
labelStatut.setText(" VICTOIRE ! Bien joué !");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Révèle les cases adjacentes en cascade si la case actuelle n'a aucune mine autour.
|
||||
* Cette méthode est récursive.
|
||||
* @param l L'index de la ligne de la case actuelle.
|
||||
* @param c L'index de la colonne de la case actuelle.
|
||||
*/
|
||||
public void revelerCaseProche(int l, int c){
|
||||
if (l < 0 || l >= grille.getLigne() || c < 0 || c >= grille.getColonne() )return;
|
||||
Case caseActuelle = grille.getCase(l, c);
|
||||
if (caseActuelle.getMarqueur() != 0 || caseActuelle.getEstRevelee() == true )return;
|
||||
caseActuelle.setEstRevelee(true);
|
||||
if(caseActuelle.getNbMinesautour() == 0){
|
||||
for(int i = -1; i <= 1; i++){
|
||||
for(int j = -1; j <= 1; j++){
|
||||
int vL = l + i;
|
||||
int vC = c + j;
|
||||
revelerCaseProche(vL,vC);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (l < 0 || l >= grille.getLigne() || c < 0 || c >= grille.getColonne() ) return;
|
||||
Case caseActuelle = grille.getCase(l, c);
|
||||
if (caseActuelle.getMarqueur() != 0 || caseActuelle.getEstRevelee() == true ) return;
|
||||
|
||||
caseActuelle.setEstRevelee(true);
|
||||
|
||||
if(caseActuelle.getNbMinesautour() == 0){
|
||||
for(int i = -1; i <= 1; i++){
|
||||
for(int j = -1; j <= 1; j++){
|
||||
int vL = l + i;
|
||||
int vC = c + j;
|
||||
revelerCaseProche(vL,vC);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Désactive le bouton de sauvegarde et supprime le fichier de sauvegarde existant.
|
||||
* Appelée lorsque la partie est terminée (victoire ou défaite).
|
||||
*/
|
||||
public void bloquerSauvegarde() {
|
||||
boutonSauver.setEnabled(false);
|
||||
java.io.File fichier = new java.io.File("sauvegarde.ser");
|
||||
if (fichier.exists()) {
|
||||
fichier.delete();
|
||||
}
|
||||
}
|
||||
|
||||
/** @return true si la partie est terminée, false sinon. */
|
||||
public boolean isPartieTerminee() { return partieTerminee; }
|
||||
|
||||
/** @return La grille logique manipulée par cette fenêtre. */
|
||||
public Grille getGrille() { return grille; }
|
||||
|
||||
/**
|
||||
* Gère les événements de défaite.
|
||||
* Affiche le message de défaite et révèle toutes les mines et erreurs de la grille.
|
||||
*/
|
||||
public void partiePerdu(){
|
||||
for(int i =0; i<grille.getLigne(); i++){
|
||||
for(int j=0;j < grille.getColonne();j++){
|
||||
Case currentCase = grille.getCase(i, j);
|
||||
if(currentCase.getEstMinee() || currentCase.getMarqueur() == 1) {
|
||||
currentCase.setEstRevelee(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
bloquerSauvegarde();
|
||||
labelStatut.setFont(new Font("Arial", Font.BOLD, 24));
|
||||
labelStatut.setForeground(Color.RED);
|
||||
labelStatut.setText(" DÉFAITE !");
|
||||
for(int i =0; i<grille.getLigne(); i++){
|
||||
for(int j=0;j < grille.getColonne();j++){
|
||||
Case currentCase = grille.getCase(i, j);
|
||||
if(currentCase.getEstMinee() || currentCase.getMarqueur() == 1) {
|
||||
currentCase.setEstRevelee(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// logique du clic droit
|
||||
/**
|
||||
* Logique exécutée lors d'un clic droit sur la grille.
|
||||
* Modifie le marqueur de la case (Doute, Mine, Vide).
|
||||
* @param l L'index de la ligne cliquée.
|
||||
* @param c L'index de la colonne cliquée.
|
||||
*/
|
||||
public void clicDroit(int l, int c) {
|
||||
if (partieTerminee) return;
|
||||
Case caseCliquee = grille.getCase(l, c);
|
||||
caseCliquee.boucleMarqueur();
|
||||
actualiserAffichage();
|
||||
if (partieTerminee) return;
|
||||
Case caseCliquee = grille.getCase(l, c);
|
||||
caseCliquee.boucleMarqueur();
|
||||
actualiserAffichage();
|
||||
}
|
||||
|
||||
// logique clic gauche
|
||||
/**
|
||||
* Logique exécutée lors d'un clic gauche sur la grille.
|
||||
* Révèle la case, déclenche une cascade ou provoque la défaite si c'est une mine.
|
||||
* @param l L'index de la ligne cliquée.
|
||||
* @param c L'index de la colonne cliquée.
|
||||
*/
|
||||
public void clicGauche(int l, int c) {
|
||||
if (partieTerminee) return;
|
||||
Case caseCliquee = grille.getCase(l, c);
|
||||
if (partieTerminee) return;
|
||||
Case caseCliquee = grille.getCase(l, c);
|
||||
|
||||
// secu on ne peut pas cliquer une une case avec un marqueur etoile ou ?
|
||||
// sécurité: on ne peut pas cliquer sur une case avec un marqueur étoile ou ?
|
||||
if (caseCliquee.getMarqueur() != 0) return;
|
||||
|
||||
if (caseCliquee.getMarqueur() != 0) return;
|
||||
|
||||
if (caseCliquee.getEstMinee()) {
|
||||
caseCliquee.setEstMineFatale(true);
|
||||
System.out.println("BOOM ! Vous avez touché une mine... !");
|
||||
caseCliquee.setEstRevelee(true);
|
||||
partieTerminee = true;
|
||||
partiePerdu();
|
||||
|
||||
} else {
|
||||
revelerCaseProche(l,c);
|
||||
}
|
||||
actualiserAffichage();
|
||||
if (caseCliquee.getEstMinee()) {
|
||||
caseCliquee.setEstMineFatale(true);
|
||||
System.out.println("BOOM ! Vous avez touché une mine... !");
|
||||
caseCliquee.setEstRevelee(true);
|
||||
partieTerminee = true;
|
||||
partiePerdu();
|
||||
} else {
|
||||
revelerCaseProche(l,c);
|
||||
verifierVictoire();
|
||||
}
|
||||
actualiserAffichage();
|
||||
}
|
||||
|
||||
|
||||
// mise à jour du texte et couleurs de tous les boutons
|
||||
/**
|
||||
* Met à jour l'apparence de tous les boutons de la grille en fonction de l'état des cases.
|
||||
* Met également à jour le compteur de mines restantes en bas de la fenêtre.
|
||||
*/
|
||||
public void actualiserAffichage() {
|
||||
int l = grille.getLigne();
|
||||
int c = grille.getColonne();
|
||||
|
||||
|
||||
for (int i = 0; i < l; i++) {
|
||||
for (int j = 0; j < c; j++) {
|
||||
Case currentCase = grille.getCase(i, j);
|
||||
JButton btn = boutons[i][j];
|
||||
|
||||
|
||||
if (currentCase.getEstRevelee()) {
|
||||
btn.setEnabled(false); // pour rendre le bouton incliquable
|
||||
btn.setEnabled(false);
|
||||
|
||||
if (currentCase.getEstMinee()) {
|
||||
// C'est une vraie mine
|
||||
btn.setText("¤");
|
||||
if (currentCase.getEstMineFatale()) {
|
||||
btn.setBackground(Color.RED);
|
||||
} else {
|
||||
btn.setBackground(Color.ORANGE);
|
||||
}
|
||||
|
||||
} else {
|
||||
// Ce n'est pas une mine
|
||||
if (currentCase.getMarqueur() == 1) {
|
||||
// Erreur si le joueur a mis une fausse étoile
|
||||
btn.setText("X");
|
||||
btn.setBackground(Color.YELLOW);
|
||||
} else {
|
||||
// on affiche le chiffre ou rien
|
||||
int nb = currentCase.getNbMinesautour();
|
||||
if (nb > 0) {
|
||||
btn.setText(String.valueOf(nb));
|
||||
} else {
|
||||
btn.setText(""); // case vide
|
||||
btn.setText("");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
// La case est encore cachée
|
||||
btn.setEnabled(true);
|
||||
int mq = currentCase.getMarqueur();
|
||||
if (mq == 1) btn.setText("★");
|
||||
@@ -201,15 +246,18 @@ public class FenetreJeu {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!partieTerminee) {
|
||||
int nbEtoiles = 0;
|
||||
for (int i = 0; i < l; i++) {
|
||||
for (int j = 0; j < c; j++) {
|
||||
if (grille.getCase(i, j).getMarqueur() == 1) {
|
||||
nbEtoiles++;
|
||||
}
|
||||
}
|
||||
}
|
||||
int progression = grille.getNbMinesTotales() - nbEtoiles;
|
||||
labelStatut.setText("Progression : " + progression + " mine(s) restante(s)");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user