ajout de plein de fonctionalité (sauver quitter, fin de partie , reprendre , reveler tout )

This commit is contained in:
2026-04-11 14:10:20 +02:00
parent ec932d0aae
commit 86ae6b6066
13 changed files with 319 additions and 126 deletions
-66
View File
@@ -1,66 +0,0 @@
import java.util.Random;
public class Grille {
private Case[][] grille;
private int ligne,colonne;
private Random generateur = new Random();
public Grille(int ligne,int colonne) {
this.ligne = ligne;
this.colonne = colonne;
this.grille = new Case[ligne][colonne];
for(int i =0;i<ligne;i++){
for(int j =0;j<colonne;j++){
this.grille[i][j] = new Case();
}
}
}
public void placerMines(int nbMines){
int randomLigne,randomColonne;
for(int i=0;i<nbMines;i++){
randomLigne = generateur.nextInt(ligne);
randomColonne = generateur.nextInt(colonne);
if (grille[randomLigne][randomColonne].getEstMinee() == true){
i--; } else {
grille[randomLigne][randomColonne].setEstMinee(true);
}
}
}
public void compterMinesVoisines(int l, int c){
int compteur = 0;
for(int i = -1; i <= 1; i++){
for(int j = -1; j <= 1; j++){
int vL = l + i;
int vC = c + j;
if(vL >= 0 && vL < ligne && vC >= 0 && vC < colonne){
if (grille[vL][vC].getEstMinee()) {
compteur++;
}
}
}
}
grille[l][c].setNbMinesautour(compteur);
}
public void calculerToutesLesMines(){
for(int i =0;i<ligne;i++){
for(int j =0;j<colonne;j++){
compterMinesVoisines(i,j);
}
}
}
// interface graphique
public int getLigne() { return ligne; }
public int getColonne() { return colonne; }
public Case getCase(int l, int c) { return grille[l][c]; }
}
-1
View File
@@ -1 +0,0 @@
doucoure@salle223-08.17695:1775656275
+62
View File
@@ -0,0 +1,62 @@
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
public class ActionDemarrer implements ActionListener {
private JTextField champLignes;
private JTextField champColonnes;
private JTextField champMines;
private JFrame cible;
private Menu menuPrincipal;
public ActionDemarrer(JTextField champL,JTextField champC, JTextField champM, JFrame cible, Menu menu) {
this.champLignes = champL;
this.champColonnes = champC;
this.champMines = champM;
this.cible = cible;
this.menuPrincipal = menu;
}
public void actionPerformed(ActionEvent e) {
String sLignes = champLignes.getText();
String sColonnes = champColonnes.getText();
String sMines = champMines.getText();
try {
int l = Integer.parseInt(sLignes);
int c = Integer.parseInt(sColonnes);
int m = Integer.parseInt(sMines);
// Vérife entre 4 et 30 ligne/colonne
if (l < 4 || l > 30 || c < 4 || c > 30) {
System.out.println("Erreur : Les dimensions doivent être comprises entre 4 et 30");
return;
}
// Véérife nb Mines
if (m >= (l * c)) {
System.out.println("Erreur : Le nombre de mines doit être inférieur au nombre de cases !");
return;
}
Grille g = new Grille(l, c);
g.placerMines(m);
g.calculerToutesLesMines();
new FenetreJeu(g);
// On ferme les deux fenêtres
cible.dispose();
menuPrincipal.getFenetre().dispose();
} catch (NumberFormatException ex) {
System.out.println("Erreur : Veuillez entrer des nombres entiers valides");
}
}
}
+34
View File
@@ -0,0 +1,34 @@
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
import java.io.File;
public class ActionReprendre implements ActionListener {
private Menu menu;
public ActionReprendre(Menu m) {
this.menu = m;
}
@Override
public void actionPerformed(ActionEvent e) {
try {
FileInputStream fichier = new FileInputStream("sauvegarde.ser");
ObjectInputStream flux = new ObjectInputStream(fichier);
Grille g = (Grille) flux.readObject();
flux.close();
fichier.close();
new FenetreJeu(g);
menu.getFenetre().dispose();
} catch (IOException | ClassNotFoundException ex) {
System.err.println("Erreur lors du chargement : " + ex.getMessage());
}
}
}
+17
View File
@@ -0,0 +1,17 @@
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
public class ActionRetourMenu implements ActionListener {
private JFrame fenetreJeu;
public ActionRetourMenu(JFrame f) {
this.fenetreJeu = f;
}
public void actionPerformed(ActionEvent e) {
fenetreJeu.dispose();
new Menu();
}
}
+33
View File
@@ -0,0 +1,33 @@
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class ActionSauverQuitter implements ActionListener {
private Grille grilleASauver;
public ActionSauverQuitter(Grille g) {
this.grilleASauver = g;
}
public void actionPerformed(ActionEvent e) {
try {
FileOutputStream fichier = new FileOutputStream("sauvegarde.ser");
ObjectOutputStream flux = new ObjectOutputStream(fichier);
flux.writeObject(grilleASauver);
flux.close();
fichier.close();
System.out.println("Partie sauvegardée avec succès !");
System.exit(0);
} catch (IOException ex) {
System.out.println("Erreur lors de la sauvegarde : " + ex.getMessage());
}
}
}
+8 -1
View File
@@ -1,6 +1,9 @@
public class Case { import java.io.Serializable;
public class Case implements Serializable {
private boolean estMinee; private boolean estMinee;
private boolean estMineFatale;
private boolean estRevelee; private boolean estRevelee;
private int marqueur; private int marqueur;
private int nbMinesautour; private int nbMinesautour;
@@ -8,6 +11,7 @@ public class Case {
public Case() { public Case() {
this.estMinee = false; this.estMinee = false;
this.estMineFatale = false;
this.estRevelee = false; this.estRevelee = false;
this.marqueur = 0; this.marqueur = 0;
this.nbMinesautour = 0; this.nbMinesautour = 0;
@@ -16,6 +20,9 @@ public class Case {
public boolean getEstMinee() { return estMinee; } public boolean getEstMinee() { return estMinee; }
public void setEstMinee(boolean min) { this.estMinee = min; } public void setEstMinee(boolean min) { this.estMinee = min; }
public boolean getEstMineFatale() {return estMineFatale; }
public void setEstMineFatale(boolean b) {this.estMineFatale = b;}
public boolean getEstRevelee() { return estRevelee; } public boolean getEstRevelee() { return estRevelee; }
public void setEstRevelee(boolean rev) { this.estRevelee = rev; } public void setEstRevelee(boolean rev) { this.estRevelee = rev; }
+126 -35
View File
@@ -9,6 +9,8 @@ public class FenetreJeu {
private JPanel panneauGrille; private JPanel panneauGrille;
private JButton[][] boutons; private JButton[][] boutons;
private Grille grille; private Grille grille;
private boolean partieTerminee = false;
private JLabel labelStatut;
public FenetreJeu(Grille g) { public FenetreJeu(Grille g) {
this.grille = g; this.grille = g;
@@ -35,14 +37,59 @@ public class FenetreJeu {
} }
} }
fenetre.add(panneauGrille); fenetre.setLayout(new BorderLayout());
fenetre.pack(); fenetre.add(panneauGrille, BorderLayout.CENTER);
fenetre.setLocationRelativeTo(null);
fenetre.setVisible(true);
actualiserAffichage(); // 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));
conteneurBoutons.add(boutonMenu);
conteneurBoutons.add(boutonSauver);
panneauBas.add(labelStatut, BorderLayout.NORTH);
panneauBas.add(conteneurBoutons, BorderLayout.SOUTH);
fenetre.add(panneauBas, BorderLayout.SOUTH);
fenetre.pack();
fenetre.setLocationRelativeTo(null);
fenetre.setVisible(true);
actualiserAffichage();
} }
public void verifierVictoire() {
int casesAReveler = (grille.getLigne() * grille.getColonne());
int nbMines = 0;
int nbRevelees = 0;
for (int i = 0; i < grille.getLigne(); i++) {
for (int j = 0; j < grille.getColonne(); j++) {
if (grille.getCase(i, j).getEstMinee()) nbMines++;
if (grille.getCase(i, j).getEstRevelee()) nbRevelees++;
}
}
if (nbRevelees == (casesAReveler - nbMines)) {
partieTerminee = true;
System.out.println("Vous avez gagné !");
}
}
public void revelerCaseProche(int l, int c){ public void revelerCaseProche(int l, int c){
if (l < 0 || l >= grille.getLigne() || c < 0 || c >= grille.getColonne() )return; if (l < 0 || l >= grille.getLigne() || c < 0 || c >= grille.getColonne() )return;
Case caseActuelle = grille.getCase(l, c); Case caseActuelle = grille.getCase(l, c);
@@ -59,10 +106,24 @@ public class FenetreJeu {
} }
} }
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);
}
}
}
}
// logique du clic droit // logique du clic droit
public void clicDroit(int l, int c) { public void clicDroit(int l, int c) {
if (partieTerminee) return;
Case caseCliquee = grille.getCase(l, c); Case caseCliquee = grille.getCase(l, c);
caseCliquee.boucleMarqueur(); caseCliquee.boucleMarqueur();
actualiserAffichage(); actualiserAffichage();
@@ -70,6 +131,7 @@ public class FenetreJeu {
// logique clic gauche // logique clic gauche
public void clicGauche(int l, int c) { public void clicGauche(int l, int c) {
if (partieTerminee) return;
Case caseCliquee = grille.getCase(l, c); Case caseCliquee = grille.getCase(l, c);
// secu on ne peut pas cliquer une une case avec un marqueur etoile ou ? // secu on ne peut pas cliquer une une case avec un marqueur etoile ou ?
@@ -77,8 +139,11 @@ public class FenetreJeu {
if (caseCliquee.getMarqueur() != 0) return; if (caseCliquee.getMarqueur() != 0) return;
if (caseCliquee.getEstMinee()) { if (caseCliquee.getEstMinee()) {
caseCliquee.setEstMineFatale(true);
System.out.println("BOOM ! Vous avez touché une mine... !"); System.out.println("BOOM ! Vous avez touché une mine... !");
caseCliquee.setEstRevelee(true); caseCliquee.setEstRevelee(true);
partieTerminee = true;
partiePerdu();
} else { } else {
revelerCaseProche(l,c); revelerCaseProche(l,c);
@@ -89,36 +154,62 @@ public class FenetreJeu {
// mise à jour du texte et couleurs de tous les boutons // mise à jour du texte et couleurs de tous les boutons
public void actualiserAffichage() { public void actualiserAffichage() {
int l = grille.getLigne(); int l = grille.getLigne();
int c = grille.getColonne(); int c = grille.getColonne();
for (int i = 0; i < l; i++) { for (int i = 0; i < l; i++) {
for (int j = 0; j < c; j++) { for (int j = 0; j < c; j++) {
Case currentCase = grille.getCase(i, j); Case currentCase = grille.getCase(i, j);
JButton btn = boutons[i][j]; JButton btn = boutons[i][j];
if (currentCase.getEstRevelee()) { if (currentCase.getEstRevelee()) {
btn.setEnabled(false); // pour rendre le bouton incliquable btn.setEnabled(false); // pour rendre le bouton incliquable
if (currentCase.getEstMinee()) {
btn.setText("¤"); if (currentCase.getEstMinee()) {
btn.setBackground(Color.RED); // C'est une vraie mine
} else { btn.setText("¤");
int nb = currentCase.getNbMinesautour(); if (currentCase.getEstMineFatale()) {
if (nb > 0) { btn.setBackground(Color.RED);
btn.setText(String.valueOf(nb)); } else {
} else { btn.setBackground(Color.ORANGE);
btn.setText(""); // case viiiide }
}
} } else {
} else { // Ce n'est pas une mine
btn.setEnabled(true); if (currentCase.getMarqueur() == 1) {
int mq = currentCase.getMarqueur(); // Erreur si le joueur a mis une fausse étoile
if (mq == 1) btn.setText("*"); btn.setText("X");
else if (mq == 2) btn.setText("?"); btn.setBackground(Color.YELLOW);
else btn.setText(""); } else {
} // on affiche le chiffre ou rien
} int nb = currentCase.getNbMinesautour();
} if (nb > 0) {
btn.setText(String.valueOf(nb));
} else {
btn.setText(""); // case vide
}
}
}
} else {
// La case est encore cachée
btn.setEnabled(true);
int mq = currentCase.getMarqueur();
if (mq == 1) btn.setText("");
else if (mq == 2) btn.setText("?");
else btn.setText("");
}
}
}
} }
} }
+2 -1
View File
@@ -1,6 +1,7 @@
import java.util.Random; import java.util.Random;
import java.io.Serializable;
public class Grille { public class Grille implements Serializable {
private Case[][] grille; private Case[][] grille;
private int ligne,colonne; private int ligne,colonne;
+3 -11
View File
@@ -1,5 +1,3 @@
Case.class : Case.java Case.class : Case.java
javac -implicit:none Case.java javac -implicit:none Case.java
@@ -9,19 +7,13 @@ Grille.class : Grille.java Case.class
Quitter.class : Quitter.java Quitter.class : Quitter.java
javac -implicit:none Quitter.java javac -implicit:none Quitter.java
FenetreJeu.class ActionCase.class : FenetreJeu.java ActionCase.java Grille.class Menu.class NouvellePartie.class ActionDemarrer.class FenetreJeu.class ActionCase.class ActionRetourMenu.class ActionSauverQuitter.class ActionReprendre.class : Menu.java NouvellePartie.java ActionDemarrer.java FenetreJeu.java ActionCase.java ActionRetourMenu.java ActionSauverQuitter.java ActionReprendre.java Grille.class Quitter.class
javac -implicit:none FenetreJeu.java ActionCase.java javac -implicit:none Menu.java NouvellePartie.java ActionDemarrer.java FenetreJeu.java ActionCase.java ActionRetourMenu.java ActionSauverQuitter.java ActionReprendre.java
NouvellePartie.class : NouvellePartie.java Grille.class FenetreJeu.class
javac -implicit:none NouvellePartie.java
Menu.class : Menu.java NouvellePartie.class Quitter.class
javac -implicit:none Menu.java
Demineur.class : Demineur.java Menu.class Demineur.class : Demineur.java Menu.class
javac -implicit:none Demineur.java javac -implicit:none Demineur.java
run : Demineur.class Menu.class run : Demineur.class
java Demineur java Demineur
clean : clean :
+8
View File
@@ -1,5 +1,6 @@
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.io.File;
public class Menu { public class Menu {
@@ -10,6 +11,7 @@ public class Menu {
private JButton boutonQuitter; private JButton boutonQuitter;
private GridLayout gestionnaire; private GridLayout gestionnaire;
public Menu() { public Menu() {
fenetre = new JFrame(); fenetre = new JFrame();
fenetre.setSize(300,300); fenetre.setSize(300,300);
@@ -27,6 +29,12 @@ public class Menu {
boutonNouvellePartie.addActionListener(new NouvellePartie(this)); boutonNouvellePartie.addActionListener(new NouvellePartie(this));
panneauMenu.add(boutonNouvellePartie); panneauMenu.add(boutonNouvellePartie);
boutonReprendre = new JButton("Reprendre"); boutonReprendre = new JButton("Reprendre");
File f = new File("sauvegarde.ser");
if (f.exists()) {
boutonReprendre.addActionListener(new ActionReprendre(this));
}else {
boutonReprendre.setEnabled(false);
}
panneauMenu.add(boutonReprendre); panneauMenu.add(boutonReprendre);
boutonQuitter = new JButton("Quitter"); boutonQuitter = new JButton("Quitter");
boutonQuitter.addActionListener(new Quitter()); boutonQuitter.addActionListener(new Quitter());
+26 -11
View File
@@ -1,5 +1,7 @@
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
// Action pour lance une nouvelle partie // Action pour lance une nouvelle partie
@@ -12,17 +14,30 @@ public class NouvellePartie implements ActionListener {
} }
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
System.out.println("Lancement de la nouvelle partie..."); JFrame fenetreConfig = new JFrame();
// cache menu fenetreConfig.setSize(300,250);
menu.getFenetre().setVisible(false); fenetreConfig.setLocation(100,100);
fenetreConfig.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//grille test (10x10 avec 10 mines) fenetreConfig.setVisible(true);
Grille g = new Grille(10, 10); GridLayout g = new GridLayout(4, 2);
g.placerMines(10); fenetreConfig.setLayout(g);
g.calculerToutesLesMines(); JTextField champLignes = new JTextField("10");
JTextField champColonnes = new JTextField("10");
// on lance l'interface graphique du jeu JTextField champMines = new JTextField("10");
new FenetreJeu(g); JButton demarrer = new JButton("Démarrer");
fenetreConfig.add(new JLabel("Ligne"));
fenetreConfig.add(champLignes);
fenetreConfig.add(new JLabel("Colonne"));
fenetreConfig.add(champColonnes);
fenetreConfig.add(new JLabel("Nb Mine"));
fenetreConfig.add(champMines);
fenetreConfig.add(new JLabel(" "));
fenetreConfig.add(demarrer);
demarrer.addActionListener(new ActionDemarrer(champLignes, champColonnes, champMines, fenetreConfig, menu));
fenetreConfig.setVisible(true);
} }
} }
BIN
View File
Binary file not shown.