diff --git a/ActionCase.java b/ActionCase.java new file mode 100644 index 0000000..e15db7d --- /dev/null +++ b/ActionCase.java @@ -0,0 +1,33 @@ +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import javax.swing.Swing.Utilities; + +public class ActionCase implements MouseListener { + + private FenetreJeu fenetrejeu; + private int ligne; + private int colonne; + + public ActionCase(FenetreJeu f, int l, int c) { + this.fenetreJeu = f; + this.ligne = l; + this.colonne = c; + } + + public void mouseClicked(MouseEvent e) { + // Clic droit + if (SwingUtilities.isRightMouseButton(e)) { + fenetreJeu.clicDroit(ligne, colonne); + } + // clic gauche + else if (SwingUtilities.isLeftMouseButton(e)) { + fenetreJeu.clicGauche(ligne, colonne); + } + } + + public void mousePressed(MouseEvent e) {} + public void mouseReleased(MouseEvent e) {} + public void mouseEntered(MouseEvent e) {} + public void mouseExited(MouseEvent e) {} +} + diff --git a/FenetreJeu.java b/FenetreJeu.java new file mode 100644 index 0000000..e370fa2 --- /dev/null +++ b/FenetreJeu.java @@ -0,0 +1,105 @@ +import javax.swing.*; +import java.awt.*; + +// Fenetre principal du jeu (ou il y a la grille de boutons) + +public class FenetreJeu { + + private JFrame fenetre; + private JPanel panneauGrille; + private JButton[][] boutons; + private Grille grille; + + public FenetreJeu(Grille g) { + this.grille = g; + int l = grille.getLigne(); + int c = grille.getColonne(); + + fenetre = new JFrame("Demineur"); + fenetre.setDefaultCloseOpertion(JFrame.EXIT_ON_CLOSE); + + panneauGrille = new JPanel(); + panneauGrille.setLayout(new GridLayout(l, c)); + boutons = new JButton [l][c]; + + // creation 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)); + // ecouteur de clics + boutons[i][j].addMouseListener(new ActionCase(this, i, j)); + panneauGrille.add(boutons[i][j]); + } + } + + fenetre.add(panneauGrille); + fenetre.pack(); + fenetre.setLocationRelativeTo(null); + fenetre.setVisible(true); + + actualiserAffichage(); + } + + // logique du clic droit + public void clicDroit(int l, int c) { + Case caseCliquee = grille.getCase(l, c); + caseCliquee.boucleMarqueur(); + actualiserAffichage(); + } + + // logique clic gauche + public void clicGauche(int l, int c) { + Case caseCliquee = grille.getCase(l, c); + + // secu on ne peut pas cliquer une une case avec un marqueur etoile ou ? + + if (caseCliquee.getMarqueur() != 0) return; + + if (caseCliquee.getEstMinee()) { + System.out.println("BOOM ! Vous avez touché une mine... !"); + caseCliquee.setEstRevelee(true); + + } else { + caseCliquee.setEstRevelee(true); + } + actualiserAffichage(); + } + + // mise à jour du texte et couleurs de tous les boutons + 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 + if (currentCase.getEstMinee()) { + btn.setText("¤"); + btn.setBackground(Color.RED); + } else { + int nb = currentCase.getNbMinesautour(); + if (nb > 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(""); + } + } + } + } +} + diff --git a/Grille.java b/Grille.java index b6be1e2..0a49576 100644 --- a/Grille.java +++ b/Grille.java @@ -59,5 +59,11 @@ public void compterMinesVoisines(int l, int c){ } + + // interface graphique + + public int getLigne() { return ligne; } + public int getColonne() { return colonne; } + public Case getCase(int l, int c) { return grille[l][c]; } } diff --git a/Makefile b/Makefile index f50a01c..0292293 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ + + Case.class : Case.java javac -implicit:none Case.java @@ -7,7 +9,10 @@ Grille.class : Grille.java Case.class Quitter.class : Quitter.java javac -implicit:none Quitter.java -NouvellePartie.class : NouvellePartie.java Menu.class Grille.class +FenetreJeu.class ActionCase.class : FenetreJeu.java ActionCase.java Grille.class + javac -implicit:none FenetreJeu.java ActionCase.java + +NouvellePartie.class : NouvellePartie.java Menu.class Grille.class FenetreJeu.class javac -implicit:none NouvellePartie.java Menu.class : Menu.java NouvellePartie.class Quitter.class diff --git a/Menu.java b/Menu.java index 3364bbf..e7f1fd7 100644 --- a/Menu.java +++ b/Menu.java @@ -38,4 +38,8 @@ public class Menu { } + + // cacher le menu quand on lance le jeu + + public JFrame getFenetre() { return fenetre; } } diff --git a/NouvellePartie.java b/NouvellePartie.java index 906ed27..4d4ed8a 100644 --- a/NouvellePartie.java +++ b/NouvellePartie.java @@ -13,5 +13,16 @@ 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); + } }