diff --git a/Case.class b/Case.class index 1bfbceb..1e7e19d 100644 Binary files a/Case.class and b/Case.class differ diff --git a/Case.java b/Case.java index bec1583..751e649 100644 --- a/Case.java +++ b/Case.java @@ -153,14 +153,14 @@ public class Case extends JComponent{ //autrement nous afficherons l'image de la bombe }else{ Image imgboombe= Toolkit.getDefaultToolkit().getImage("./IMAGE/bombe.png"); - //si la suspition est de 4 (possible que si c'est la bombe qui a exploser) + //si la suspition est de 4 (possible que si c'est la bombe qui a exploser) valeur sentinelle if(this.suspition==4){ //on dessine un rectangle rouge secondPinceau.setColor(new Color(255,0,0)); secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18); }else{ - //on dessine un rectangle orange pour montrer que la case étais miner - secondPinceau.setColor(new Color(255, 127, 0)); + //on dessine un rectangle orange pour montrer que la case était une bombe + secondPinceau.setColor(new Color(200, 127, 0)); secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18); } //on affiche la bombe diff --git a/IMAGE/replay.png b/IMAGE/replay.png index 0093677..b795398 100644 Binary files a/IMAGE/replay.png and b/IMAGE/replay.png differ diff --git a/Makefile b/Makefile index 22f506a..124107b 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ OFILES= Case.class\ paintChoix.class\ observateurChoix.class\ plusoumoins.class\ - bombeEtValider.class + observateurButtonEtText.class CFLAGS= -implicit:none @@ -51,8 +51,8 @@ observateurChoix.class: observateurChoix.java plusoumoins.class: plusoumoins.java javac $(CFLAGS) plusoumoins.java -bombeEtValider.class: bombeEtValider.java - javac $(CFLAGS) bombeEtValider.java +observateurButtonEtText.class: observateurButtonEtText.java + javac $(CFLAGS) observateurButtonEtText.java #Chapitre 5: nettoyage des fichiers generes diff --git a/main_ex.class b/main_ex.class index d558dae..1cd341f 100644 Binary files a/main_ex.class and b/main_ex.class differ diff --git a/main_ex.java b/main_ex.java index bf3f500..56aa116 100644 --- a/main_ex.java +++ b/main_ex.java @@ -3,14 +3,15 @@ // Classe ayant pour but d'être executer //importons les packages necessaires -import java.awt.*; import javax.swing.*; public class main_ex{ public static void main(String[] Args){ // on initialise une fenettre JFrame fenetre = new JFrame("Démineur"); + //on créé notre plateau de jeu plateau jeu = new plateau(fenetre); + //on lance a l'aide de celui-ci le 1er menu jeu.menuChoixTypePartie(); } } \ No newline at end of file diff --git a/observateurButtonEtText.class b/observateurButtonEtText.class new file mode 100644 index 0000000..be01c5c Binary files /dev/null and b/observateurButtonEtText.class differ diff --git a/observateurButtonEtText.java b/observateurButtonEtText.java new file mode 100644 index 0000000..e9116bb --- /dev/null +++ b/observateurButtonEtText.java @@ -0,0 +1,64 @@ +//Clément Martins et Tom Monin +//Class utiliser pour observateur avec plusieur action ossible (en fonction de sa fonction défini a la création) +import java.awt.event.*; +import javax.swing.*; +import java.awt.*; +import java.io.*; + +public class observateurButtonEtText implements ActionListener { + private plateau plat; + private int fonction; + private JTextField zone; + public observateurButtonEtText(plateau plat0, int fonction0, JTextField zone0){ + this.plat=plat0; + this.fonction=fonction0; + this.zone=zone0; + } + @Override + public void actionPerformed(ActionEvent evenement){ + if(this.fonction==1){ + int nombre=0; + try{ + this.zone.setBackground(new Color(255,255,255)); + nombre=Integer.parseInt(evenement.getActionCommand()); + if(nombre<0){ + nombre=0; + } + if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1){ + if(nombre>this.plat.getLigne()*this.plat.getCollonne()){ + nombre=this.plat.getLigne()*this.plat.getCollonne(); + } + this.zone.setText(String.valueOf(nombre)); + }else{ + this.zone.setBackground(Color.red); + this.zone.setText("Selectionner Ligne et Collonne Avant"); + this.plat.setBombe(-1); + } + this.plat.setBombe(nombre); + }catch(NumberFormatException e1){ + this.zone.setBackground(Color.red); + this.zone.setText("rentrer un nombre valide"); + this.plat.setBombe(-1); + } + } + if(this.fonction==2){ + if(this.plat.getLigne()!=-1 && this.plat.getLigne()!=-1 && this.plat.getBombe()!=-1){ + this.plat.newGame(); + } + } + if(this.fonction==3){ + this.plat.menuChoixLCB(); + } + if(this.fonction==4){ + try{ + FileInputStream fichier = new FileInputStream("./sauvegarde.data"); + this.plat.reprendrePartie(fichier); + }catch(FileNotFoundException e1){ + + } + } + if(this.fonction==5){ + this.plat.getFenetre().dispose(); + } + } +} \ No newline at end of file diff --git a/observateurCase.class b/observateurCase.class index b8bf630..e235e14 100644 Binary files a/observateurCase.class and b/observateurCase.class differ diff --git a/observateurCase.java b/observateurCase.java index 6d32911..c844a60 100644 --- a/observateurCase.java +++ b/observateurCase.java @@ -50,21 +50,9 @@ public class observateurCase implements MouseListener{ if(plat.etatDeVictoire()==-1){ //on precise quelle case a exploser this.tableau[this.ligne][this.collonne].setSuspition(4); - plateau.removeListener(this.tableau); - for(int i=0;i Fonction pour afficher le logo rejouer <---------------------------- + private void paintLogo(){ + //on modifie l'aspect de l'ancien logo this.logo.setChoix(7); + //et la fonction de son observateur this.observateur.setFonction(true); } + //------------------------------------> Fonction pour lancer une nouvelle partie <----------------------- + public void newGame(){ + //initialisation du tableau de Case this.tableau=new Case[ligne][collonne]; for(int i=0; i Fonction pour sauvegarder la partie <------------------------- + public void save(){ + //les fonctions vont lever des Exeption nous devons donc mettre un try Catch try{ + //nous initialison le outputStream en créant le fichier "sauvegarde.data" FileOutputStream sav = new FileOutputStream(new File("sauvegarde.data")); + //nous allons sérialiser le tableau de Case ObjectOutputStream oos = new ObjectOutputStream(sav); + //nous écrivons donc tout d'abord la taille de celui-ci oos.writeInt(this.ligne); oos.writeInt(this.collonne); + //puis nous parcourons le tableau en sérialisant toute les Case for(int i=0; i Fonction pour Lancer une partie <-------------------------------------- + private void launchGame(int score){ + //on ferme l'ancienne fenetre this.fenetre.dispose(); + //on en crée une nouvelles this.fenetre=new JFrame("démineur"); - // l'application ne se fermera que si on clique sur - fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fenetre.setVisible(true); - fenetre.addWindowListener(new observateurFenetre(this)); - GridLayout grille = new GridLayout(this.ligne+1,this.collonne); - fenetre.setLayout(grille); + // l'application se fermera que si on ferme la fenetre + this.fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + //on l'affiche + this.fenetre.setVisible(true); + //on ajoute son observateur (pour savegarder la partie si on ferme la fenetre) + this.fenetre.addWindowListener(new observateurFenetre(this)); + //on met un gestionaires de mise en page grille avec le nombre de ligne+1 (pour le menu en haut) et le nombre de collonne + this.fenetre.setLayout(new GridLayout(this.ligne+1,this.collonne)); + //on met en place le menu du haut et donc toute la première ligne for(int i=0; i Fonction d'affichage du menu pour le Choix des Ligne, Collonne et Bombe <----------------------------- public void menuChoixLCB(){ + //nous fermons l'ancienne fenetre this.fenetre.dispose(); + //créons une nouvelle this.fenetre= new JFrame("démineur"); this.fenetre.setLocation(0,0); this.fenetre.setVisible(true); this.fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - GridLayout grille = new GridLayout(27,3); - fenetre.setLayout(grille); + //nous utiliserons un gestionnaires avec 27 ligne(de 4 a 30 ligne/collonne) et 3 collonne + fenetre.setLayout(new GridLayout(27,3)); + //initialisation des objet utiliser par des observateur plus tard paintChoix retenue= new paintChoix(-1, -1); paintChoix premier= new paintChoix(-1, -1); paintChoix retenue2= new paintChoix(-1, -1); paintChoix premier2= new paintChoix(-1, -1); JLabel texte1 = new JLabel("ligne: ???"); JLabel texte2 = new JLabel("collonne: ???"); + //aligment Central plus estetique texte1.setHorizontalAlignment(JLabel.CENTER); texte2.setHorizontalAlignment(JLabel.CENTER); JTextField nbombe = new JTextField("0"); + //nous ajoutons les Case for(int i=0; i<27; i++){ + //creons les composant paintChoix pinceau = new paintChoix(i, 1); paintChoix pinceau2 = new paintChoix(i, 2); - pinceau.setPreferredSize(new Dimension(500,100)); + pinceau.setPreferredSize(new Dimension(700,100)); pinceau2.setPreferredSize(new Dimension(500, 100)); if(i==0){ + //si c'est la première Case alors ça sera la première pour sa ligne premier=pinceau; premier2=pinceau2; } + //nous leurs ajoutons un observateur pinceau.addMouseListener(new observateurChoix(pinceau, premier, texte1, this)); pinceau2.addMouseListener(new observateurChoix(pinceau2, premier2, texte2, this)); + //positionons la retenue sur le nouveau pinceau retenue.setPaintChoix(pinceau); retenue=pinceau; retenue2.setPaintChoix(pinceau2); retenue2=pinceau2; + //nous ajoutons la première case sur la collonne 1 this.fenetre.add(pinceau); + //la dexième collonne dependra de sa hauteur dans la ligne if(i==10){ + //texte sur les lignes this.fenetre.add(texte1); } if(i==12){ + //texte sur les collonnes this.fenetre.add(texte2); - }if(i!=10 && i!=12 && i!=26 && i!=17 && i!=18 && i!=19 && i!=16){ - this.fenetre.add(new JLabel()); }if(i==26){ + //si c'est la dernière ligne, boutons valider JButton valider = new JButton("valider"); - valider.addActionListener(new bombeEtValider(this, 2, nbombe)); + valider.addActionListener(new observateurButtonEtText(this, 2, nbombe)); this.fenetre.add(valider); }if(i==17){ + //boutons plus JButton plus = new JButton("+"); plus.addActionListener(new plusoumoins(nbombe, 1, this)); this.fenetre.add(plus); }if(i==18){ + //texteArea qui représente le nombre de bombe nbombe.setHorizontalAlignment(JLabel.CENTER); - nbombe.addActionListener(new bombeEtValider(this, 1, nbombe)); + nbombe.addActionListener(new observateurButtonEtText(this, 1, nbombe)); this.fenetre.add(nbombe); }if(i==19){ + //boutons moins JButton moins = new JButton("-"); moins.addActionListener(new plusoumoins(nbombe, -1, this)); this.fenetre.add(moins); }if(i==16){ + //juste le texte JLabel texte3 = new JLabel("Nombre de Bombe"); texte3.setHorizontalAlignment(JLabel.CENTER); this.fenetre.add(texte3); + }if(i!=10 && i!=12 && i!=26 && i!=17 && i!=18 && i!=19 && i!=16){ + //autrement nous ajoutons un composant inutile + this.fenetre.add(new JLabel()); } + //enfin nous ajoutons sur la 3ième collonne le 2ième paintChoix this.fenetre.add(pinceau2); } + //nous ajustons la fenetre a la taille de son contenue volontairement grand qui poussera sûrment un plein ecran (2700x2100) this.fenetre.pack(); } + //-----------------------------------------> Fonction pour l'affichage du premier menu (nouvelle partie/reprendrePartie/quitter) <--------------------- public void menuChoixTypePartie(){ + //nous créons une nouvelles fenetre this.fenetre.dispose(); this.fenetre= new JFrame("démineur"); this.fenetre.setLocation(0,0); this.fenetre.setVisible(true); - this.fenetre.setSize(1000, 500); this.fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel pan = new JPanel(); + this.fenetre.setLayout(new FlowLayout()); + JPanel pan1 = new JPanel(); + JPanel pan2 = new JPanel(); + JPanel pan3 = new JPanel(); JButton nouveau = new JButton("nouvelle partie"); JButton reprende = new JButton("reprendrePartie"); JButton quitter = new JButton("quitter"); - nouveau.addActionListener(new bombeEtValider(this, 3, null)); - reprende.addActionListener(new bombeEtValider(this, 4, null)); - quitter.addActionListener(new bombeEtValider(this, 5, null)); - pan.add(nouveau); - pan.add(reprende); - pan.add(quitter); - this.fenetre.add(pan, BorderLayout.CENTER); + nouveau.addActionListener(new observateurButtonEtText(this, 3, null)); + reprende.addActionListener(new observateurButtonEtText(this, 4, null)); + quitter.addActionListener(new observateurButtonEtText(this, 5, null)); + pan1.add(nouveau); + pan2.add(reprende); + pan3.add(quitter); + pan1.setPreferredSize(new Dimension(800, 800)); + pan2.setPreferredSize(new Dimension(800, 800)); + pan3.setPreferredSize(new Dimension(800, 800)); + this.fenetre.add(pan1); + this.fenetre.add(pan2); + this.fenetre.add(pan3); + this.fenetre.pack(); + //nous ajustons la fenetre a la taille de son contenue volontairement grand qui poussera sûrment un plein ecran (2000x2000) } } \ No newline at end of file diff --git a/sauvegarde.data b/sauvegarde.data new file mode 100644 index 0000000..79d8076 Binary files /dev/null and b/sauvegarde.data differ