diff --git a/#Grille.java# b/#Grille.java# deleted file mode 100644 index bb2299c..0000000 --- a/#Grille.java# +++ /dev/null @@ -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= 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 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"); + } + } + +} diff --git a/ActionReprendre.java b/ActionReprendre.java new file mode 100644 index 0000000..e31a8b4 --- /dev/null +++ b/ActionReprendre.java @@ -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()); + } + } +} diff --git a/ActionRetourMenu.java b/ActionRetourMenu.java new file mode 100644 index 0000000..f38c69f --- /dev/null +++ b/ActionRetourMenu.java @@ -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(); + } +} diff --git a/ActionSauverQuitter.java b/ActionSauverQuitter.java new file mode 100644 index 0000000..8f9214d --- /dev/null +++ b/ActionSauverQuitter.java @@ -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()); + } + } +} diff --git a/Case.java b/Case.java index 59f9d5c..95882fa 100644 --- a/Case.java +++ b/Case.java @@ -1,6 +1,9 @@ -public class Case { +import java.io.Serializable; + +public class Case implements Serializable { private boolean estMinee; + private boolean estMineFatale; private boolean estRevelee; private int marqueur; private int nbMinesautour; @@ -8,6 +11,7 @@ public class Case { public Case() { this.estMinee = false; + this.estMineFatale = false; this.estRevelee = false; this.marqueur = 0; this.nbMinesautour = 0; @@ -16,6 +20,9 @@ public class Case { public boolean getEstMinee() { return estMinee; } 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 void setEstRevelee(boolean rev) { this.estRevelee = rev; } diff --git a/FenetreJeu.java b/FenetreJeu.java index 6af1d74..a43fc5b 100644 --- a/FenetreJeu.java +++ b/FenetreJeu.java @@ -9,6 +9,8 @@ public class FenetreJeu { private JPanel panneauGrille; private JButton[][] boutons; private Grille grille; + private boolean partieTerminee = false; + private JLabel labelStatut; public FenetreJeu(Grille g) { this.grille = g; @@ -35,14 +37,59 @@ public class FenetreJeu { } } - fenetre.add(panneauGrille); - fenetre.pack(); - fenetre.setLocationRelativeTo(null); - fenetre.setVisible(true); + fenetre.setLayout(new BorderLayout()); + fenetre.add(panneauGrille, BorderLayout.CENTER); - 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){ if (l < 0 || l >= grille.getLigne() || c < 0 || c >= grille.getColonne() )return; Case caseActuelle = grille.getCase(l, c); @@ -59,10 +106,24 @@ public class FenetreJeu { } } + + + + public void partiePerdu(){ + for(int i =0; i 0) { - btn.setText(String.valueOf(nb)); - } else { - btn.setText(""); // case viiiide - } - } - } else { - btn.setEnabled(true); - int mq = currentCase.getMarqueur(); - if (mq == 1) btn.setText("*"); - else if (mq == 2) btn.setText("?"); - else btn.setText(""); - } - } - } + 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 + + 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 + } + } + } + + } 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(""); + } + } + } } + + + + + + + + + } diff --git a/Grille.java b/Grille.java index 0a49576..63b654e 100644 --- a/Grille.java +++ b/Grille.java @@ -1,6 +1,7 @@ import java.util.Random; +import java.io.Serializable; -public class Grille { +public class Grille implements Serializable { private Case[][] grille; private int ligne,colonne; diff --git a/Makefile b/Makefile index 3dca1b2..a9932ab 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,3 @@ - - Case.class : Case.java javac -implicit:none Case.java @@ -9,19 +7,13 @@ Grille.class : Grille.java Case.class Quitter.class : Quitter.java javac -implicit:none Quitter.java -FenetreJeu.class ActionCase.class : FenetreJeu.java ActionCase.java Grille.class - javac -implicit:none FenetreJeu.java ActionCase.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 +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 Menu.java NouvellePartie.java ActionDemarrer.java FenetreJeu.java ActionCase.java ActionRetourMenu.java ActionSauverQuitter.java ActionReprendre.java Demineur.class : Demineur.java Menu.class javac -implicit:none Demineur.java -run : Demineur.class Menu.class +run : Demineur.class java Demineur clean : diff --git a/Menu.java b/Menu.java index e7f1fd7..67063f0 100644 --- a/Menu.java +++ b/Menu.java @@ -1,5 +1,6 @@ import javax.swing.*; import java.awt.*; +import java.io.File; public class Menu { @@ -10,6 +11,7 @@ public class Menu { private JButton boutonQuitter; private GridLayout gestionnaire; + public Menu() { fenetre = new JFrame(); fenetre.setSize(300,300); @@ -27,6 +29,12 @@ public class Menu { boutonNouvellePartie.addActionListener(new NouvellePartie(this)); panneauMenu.add(boutonNouvellePartie); 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); boutonQuitter = new JButton("Quitter"); boutonQuitter.addActionListener(new Quitter()); diff --git a/NouvellePartie.java b/NouvellePartie.java index 4d4ed8a..d22000d 100644 --- a/NouvellePartie.java +++ b/NouvellePartie.java @@ -1,5 +1,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import javax.swing.*; +import java.awt.*; // Action pour lance une nouvelle partie @@ -12,17 +14,30 @@ public class NouvellePartie implements ActionListener { } public void actionPerformed(ActionEvent e) { - System.out.println("Lancement de la nouvelle partie..."); - // cache menu - menu.getFenetre().setVisible(false); - - //grille test (10x10 avec 10 mines) - Grille g = new Grille(10, 10); - g.placerMines(10); - g.calculerToutesLesMines(); - - // on lance l'interface graphique du jeu - new FenetreJeu(g); + JFrame fenetreConfig = new JFrame(); + fenetreConfig.setSize(300,250); + fenetreConfig.setLocation(100,100); + fenetreConfig.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + fenetreConfig.setVisible(true); + GridLayout g = new GridLayout(4, 2); + fenetreConfig.setLayout(g); + JTextField champLignes = new JTextField("10"); + JTextField champColonnes = new JTextField("10"); + JTextField champMines = new JTextField("10"); + 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); + } } diff --git a/sauvegarde.ser b/sauvegarde.ser new file mode 100644 index 0000000..5ac8bc8 Binary files /dev/null and b/sauvegarde.ser differ