diff --git a/Case.class b/Case.class new file mode 100644 index 0000000..e4e47a6 Binary files /dev/null and b/Case.class differ diff --git a/Case.java b/Case.java new file mode 100644 index 0000000..abe31c5 --- /dev/null +++ b/Case.java @@ -0,0 +1,172 @@ +// Tom Monin et Clément Martins +// paintChoix V3 +// class représentant une case dans la partie + +import java.awt.*; +import javax.swing.*; +import javax.swing.JComponent; + +public class Case extends JComponent{ + //Etat de la case: + private boolean visibilite; //Visible ou pas + private boolean bombe; //Miner ou pas + private int voisin; //Le nombre de mine aux alentours + private int suspition; // son Etat de suspition ( 0:pas une bombe, 1:en est une, 2:je doute) + // Les Images de la case (point d'interogation, etoile et bombe...) ne sont pas des attributs de la classe Case car + //pour faciliter la sauvegarde et donc permettre de sérialiser l'objet les attribut devrons être des classes réalisant Serializable ou Externialisable + + //Constructeur de la Case + public Case(){ + //nous initialisons les valeurs + this.visibilite=false; //la visibiler est fausse donc la case est cacher + this.bombe=false; // ce n'est pas une bombe + this.voisin=0; // elle n'a pas de voisin bombe + this.suspition=0; // la suspition est a 0 (pas une bombe) + } + + // Nous mettons les getter/setter + + public void setVisibiliter(boolean trueorfalse){ + this.visibilite=trueorfalse; + } + public void setBombe(){ + this.bombe=true; + } + public void suspition(){ + this.suspition++; + if(this.suspition==3){ + this.suspition=0; + } + } + public void setSuspition(int n){ + this.suspition=n; + //valeur sentinel pour montrer que c'est cette case qui a exploser + } + public boolean getBombe(){ + return this.bombe; + } + public void setVoisin(int nvoisin){ + this.voisin=nvoisin; + } + public int getSuspition(){ + return this.suspition; + } + public boolean getVisibiliter(){ + return this.visibilite; + } + public int getVoisin(){ + return this.voisin; + } + + //on paint la case en fonction de ses attribut et donc son etat + @Override + protected void paintComponent(Graphics pinceau) { + // obligatoire : on crée un nouveau pinceau pour pouvoir le modifier plus tard + Graphics secondPinceau = pinceau.create(); + // obligatoire : si le composant n'est pas censé être transparent + if (this.isOpaque()) { + // obligatoire : on repeint toute la surface avec la couleur de fond + secondPinceau.setColor(this.getBackground()); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + //On paint ce que l'on veut maintenant + //si la case est cacher (pas visible) + if(this.visibilite==false){ + //on dessinne un rectangle gris sur un fond noir + secondPinceau.setColor(new Color(0,0,0)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + secondPinceau.setColor(new Color(100, 100, 100)); + secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18); + //si on supecte que c'est une bome + if(this.suspition==1){ + //on affiche l'etoile + Image etoile= Toolkit.getDefaultToolkit().getImage("./IMAGE/etoile.png"); + secondPinceau.drawImage(etoile, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + //si on suspecte que on ne sais pas + if(this.suspition==2){ + Image interogation= Toolkit.getDefaultToolkit().getImage("./IMAGE/pointintero.png"); + //on affiche le point d'interogation + secondPinceau.drawImage(interogation, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + } + //si la case est afficher(visible) + if(this.visibilite==true){ + //on dessine un rectangle blanc sur un fond noir + secondPinceau.setColor(new Color(0,0,0)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + secondPinceau.setColor(new Color(255, 255, 255)); + secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18); + //si la case a au moins 1 voisin qui est une bombe + if(this.voisin>0){ + //on ecrit le nombre de voisin que elle a + if(this.voisin==1){ + Image un=Toolkit.getDefaultToolkit().getImage("./IMAGE/un.jpg"); + secondPinceau.drawImage(un, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + if(this.voisin==2){ + Image deux=Toolkit.getDefaultToolkit().getImage("./IMAGE/deux.jpg"); + secondPinceau.drawImage(deux, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + if(this.voisin==3){ + Image trois=Toolkit.getDefaultToolkit().getImage("./IMAGE/trois.jpg"); + secondPinceau.drawImage(trois, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + if(this.voisin==4){ + Image quatre=Toolkit.getDefaultToolkit().getImage("./IMAGE/quatre.jpg"); + secondPinceau.drawImage(quatre, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + if(this.voisin==5){ + Image cinq=Toolkit.getDefaultToolkit().getImage("./IMAGE/cinq.png"); + secondPinceau.drawImage(cinq, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + if(this.voisin==6){ + Image six=Toolkit.getDefaultToolkit().getImage("./IMAGE/six.jpg"); + secondPinceau.drawImage(six, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + if(this.voisin==7){ + Image sept=Toolkit.getDefaultToolkit().getImage("./IMAGE/sept.jpg"); + secondPinceau.drawImage(sept, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + if(this.voisin==8){ + Image huit=Toolkit.getDefaultToolkit().getImage("./IMAGE/huit.jpg"); + secondPinceau.drawImage(huit, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + //si la case est supecter mais visible (possible que si le joueur a perdu) et que ce n'est pas une bombe + //on affiche un fond rouge pour mettre en valeur l'erreur + if(this.suspition==1 && this.bombe==false){ + secondPinceau.setColor(new Color(255, 0, 0)); + secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18); + Image etoile= Toolkit.getDefaultToolkit().getImage("./IMAGE/etoile.png"); + secondPinceau.drawImage(etoile, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + } + //si la case est une bombe + if(this.bombe==true){ + //si la bombe est suspecter mais afficher (possible que si le joeur perd) + if(this.suspition==1){ + //on affiche l'etoile sur fond vert pour préciser que le joueur avait raison + secondPinceau.setColor(new Color(0, 255, 0)); + secondPinceau.fillRect(this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18); + Image etoile= Toolkit.getDefaultToolkit().getImage("./IMAGE/etoile.png"); + secondPinceau.drawImage(etoile, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + //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) 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 é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 + secondPinceau.drawImage(imgboombe, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/20*10, this.getHeight()/20*10 ,this); + } + } + } + } +} \ No newline at end of file diff --git a/IMAGE/bombe.png b/IMAGE/bombe.png new file mode 100644 index 0000000..60fc420 Binary files /dev/null and b/IMAGE/bombe.png differ diff --git a/IMAGE/cinq.png b/IMAGE/cinq.png new file mode 100644 index 0000000..7b3d7b1 Binary files /dev/null and b/IMAGE/cinq.png differ diff --git a/IMAGE/cinqD.png b/IMAGE/cinqD.png new file mode 100644 index 0000000..3a42907 Binary files /dev/null and b/IMAGE/cinqD.png differ diff --git a/IMAGE/deux.jpg b/IMAGE/deux.jpg new file mode 100644 index 0000000..ff2c305 Binary files /dev/null and b/IMAGE/deux.jpg differ diff --git a/IMAGE/deuxD.png b/IMAGE/deuxD.png new file mode 100644 index 0000000..a51cb36 Binary files /dev/null and b/IMAGE/deuxD.png differ diff --git a/IMAGE/err.png b/IMAGE/err.png new file mode 100644 index 0000000..eadff1a Binary files /dev/null and b/IMAGE/err.png differ diff --git a/IMAGE/etoile.png b/IMAGE/etoile.png new file mode 100644 index 0000000..66964aa Binary files /dev/null and b/IMAGE/etoile.png differ diff --git a/IMAGE/huit.jpg b/IMAGE/huit.jpg new file mode 100644 index 0000000..9c681d7 Binary files /dev/null and b/IMAGE/huit.jpg differ diff --git a/IMAGE/huitD.png b/IMAGE/huitD.png new file mode 100644 index 0000000..bc6dc2a Binary files /dev/null and b/IMAGE/huitD.png differ diff --git a/IMAGE/lose.png b/IMAGE/lose.png new file mode 100644 index 0000000..846538e Binary files /dev/null and b/IMAGE/lose.png differ diff --git a/IMAGE/neufD.png b/IMAGE/neufD.png new file mode 100644 index 0000000..a3aa467 Binary files /dev/null and b/IMAGE/neufD.png differ diff --git a/IMAGE/nouveau.jpg b/IMAGE/nouveau.jpg new file mode 100644 index 0000000..dfad617 Binary files /dev/null and b/IMAGE/nouveau.jpg differ diff --git a/IMAGE/pointintero.png b/IMAGE/pointintero.png new file mode 100644 index 0000000..651da3e Binary files /dev/null and b/IMAGE/pointintero.png differ diff --git a/IMAGE/quatre.jpg b/IMAGE/quatre.jpg new file mode 100644 index 0000000..ae4d002 Binary files /dev/null and b/IMAGE/quatre.jpg differ diff --git a/IMAGE/quatreD.png b/IMAGE/quatreD.png new file mode 100644 index 0000000..89fd693 Binary files /dev/null and b/IMAGE/quatreD.png differ diff --git a/IMAGE/quitter.jpg b/IMAGE/quitter.jpg new file mode 100644 index 0000000..c4f76dd Binary files /dev/null and b/IMAGE/quitter.jpg differ diff --git a/IMAGE/replay.png b/IMAGE/replay.png new file mode 100644 index 0000000..b795398 Binary files /dev/null and b/IMAGE/replay.png differ diff --git a/IMAGE/reprendre.png b/IMAGE/reprendre.png new file mode 100644 index 0000000..138f2d9 Binary files /dev/null and b/IMAGE/reprendre.png differ diff --git a/IMAGE/sav.png b/IMAGE/sav.png new file mode 100644 index 0000000..c0ba49b Binary files /dev/null and b/IMAGE/sav.png differ diff --git a/IMAGE/sept.jpg b/IMAGE/sept.jpg new file mode 100644 index 0000000..d6841fd Binary files /dev/null and b/IMAGE/sept.jpg differ diff --git a/IMAGE/septD.png b/IMAGE/septD.png new file mode 100644 index 0000000..be84204 Binary files /dev/null and b/IMAGE/septD.png differ diff --git a/IMAGE/six.jpg b/IMAGE/six.jpg new file mode 100644 index 0000000..f84ef83 Binary files /dev/null and b/IMAGE/six.jpg differ diff --git a/IMAGE/sixD.png b/IMAGE/sixD.png new file mode 100644 index 0000000..71f8892 Binary files /dev/null and b/IMAGE/sixD.png differ diff --git a/IMAGE/trois.jpg b/IMAGE/trois.jpg new file mode 100644 index 0000000..30b0737 Binary files /dev/null and b/IMAGE/trois.jpg differ diff --git a/IMAGE/troisD.png b/IMAGE/troisD.png new file mode 100644 index 0000000..3b502a0 Binary files /dev/null and b/IMAGE/troisD.png differ diff --git a/IMAGE/un.jpg b/IMAGE/un.jpg new file mode 100644 index 0000000..2a2e75e Binary files /dev/null and b/IMAGE/un.jpg differ diff --git a/IMAGE/unD.png b/IMAGE/unD.png new file mode 100644 index 0000000..1f5b861 Binary files /dev/null and b/IMAGE/unD.png differ diff --git a/IMAGE/win.png b/IMAGE/win.png new file mode 100644 index 0000000..2dae96e Binary files /dev/null and b/IMAGE/win.png differ diff --git a/IMAGE/zeroD.png b/IMAGE/zeroD.png new file mode 100644 index 0000000..83a84eb Binary files /dev/null and b/IMAGE/zeroD.png differ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..efdd7cc --- /dev/null +++ b/Makefile @@ -0,0 +1,64 @@ +# PROJET DÉMINEUR MAKEFILE: +# +# Chapitre 1: But final; + +but: main_ex.class + +# Chapitre 2 : Variable +OFILES= Case.class\ + plateau.class\ + observateurCase.class\ + paintMenuJeu.class\ + observateurSAV.class\ + observateurFenetre.class\ + paintChoix.class\ + observateurChoix.class\ + observateurButtonEtText.class + +CFLAGS= -implicit:none + +# Chapitre 3 : Dependances (règle implicite): +Case.class: Case.java + javac $(CFLAGS) Case.java + +plateau.class : plateau.java + javac $(CFLAGS) plateau.java + +observateurCase.class : observateurCase.java + javac $(CFLAGS) observateurCase.java + +paintMenuJeu.class: paintMenuJeu.java + javac $(CFLAGS) paintMenuJeu.java + +observateurSAV.class: observateurSAV.java + javac $(CFLAGS) observateurSAV.java + +observateurFenetre.class: observateurFenetre.java + javac $(CFLAGS) observateurFenetre.java + +# Chapitre 4 : Dependances + +main_ex.class: $(OFILES) main_ex.java + javac $(CFLAGS) main_ex.java + +paintChoix.class: paintChoix.java + javac $(CFLAGS) paintChoix.java + +observateurChoix.class: observateurChoix.java + javac $(CFLAGS) observateurChoix.java + +observateurButtonEtText.class: observateurButtonEtText.java + javac $(CFLAGS) observateurButtonEtText.java + +#Chapitre 5: nettoyage des fichiers generes + +clean : + -rm -f $(OFILES) main_ex.class + +run : + java main_ex +#chapitre 6 : buts factices + +.PHONY : but clean + +.PHONY : but run diff --git a/main_ex.class b/main_ex.class new file mode 100644 index 0000000..1cd341f Binary files /dev/null and b/main_ex.class differ diff --git a/main_ex.java b/main_ex.java new file mode 100644 index 0000000..56aa116 --- /dev/null +++ b/main_ex.java @@ -0,0 +1,17 @@ +// Tom Monint et Clément Martins +// main_ex V4 +// Classe ayant pour but d'être executer + +//importons les packages necessaires +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..2308285 Binary files /dev/null and b/observateurButtonEtText.class differ diff --git a/observateurButtonEtText.java b/observateurButtonEtText.java new file mode 100644 index 0000000..c5f4402 --- /dev/null +++ b/observateurButtonEtText.java @@ -0,0 +1,173 @@ +//Clément Martins et Tom Monin +//Class utiliser pour observateur avec plusieur action possible (en fonction de sa fonction défini a la création) +import java.awt.event.*; +import javax.swing.*; +import java.awt.*; + +public class observateurButtonEtText implements ActionListener { + private plateau plat; //le plateau de jeu + private int fonction; //la fonction de l'observateur + private JTextField zone; // la zone de texte a modifier + + //constructeur + //@params (le plateau, la fonction, la zone de texte) + public observateurButtonEtText(plateau plat0, int fonction0, JTextField zone0){ + //on initialise les attributs + this.plat=plat0; + this.fonction=fonction0; + this.zone=zone0; + } + @Override + public void actionPerformed(ActionEvent evenement){ + //si fonction 1 on va adapter la zone de texte en fonction de son contenu + if(this.fonction==1){ + int nombre=0; + //try catch pour le parseInt pour voir si le format correspond + //tant que le format est bon: + try{ + //on met le fond du texte en blanc + this.zone.setBackground(new Color(255,255,255)); + //on recupere le nombre contenu dans le text + nombre=Integer.parseInt(evenement.getActionCommand()); + //si il est inferieur a 0 + if(nombre<0){ + //je le met sur 0 (min de bombe) + nombre=0; + } + //si les collonnes et les ligne ne sont pas encore selectionner + //vu par les valeur sentinnelles (-1) + if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1){ + //si il y a plus de bombe que de case + if(nombre>this.plat.getLigne()*this.plat.getCollonne()){ + //on repositionne le nombre de bombe au maximun + nombre=this.plat.getLigne()*this.plat.getCollonne(); + } + //on affiche le nombre dans la zone de text + this.zone.setText(String.valueOf(nombre)); + }else{ + //si les ligne et les collonnes ne sont pas encore selectionner + //fond e rouge + this.zone.setBackground(Color.red); + //on précise a l'utilisateur se que l'ont veut + this.zone.setText("Selectionner Ligne et Collonne Avant"); + //on précisera au plateau que le choix des bombes n'est plus bon + //par une valeur sentinnelles + //pour eviter de garder l'ancien nombre si il y en avait un + nombre=-1; + } + //on dis au plateau le nombre de bombe + this.plat.setBombe(nombre); + }catch(NumberFormatException e1){ + //si le format n'est pas bon + //fond en rouge + this.zone.setBackground(Color.red); + //on précise a l'utilisateur l'erreur + this.zone.setText("rentrer un entier"); + //on précisera au plateau que le choix des bombes n'est plus bon + //par une valeur sentinnelles + //pour eviter de garder l'ancien nombre si il y en avait un + this.plat.setBombe(-1); + } + } + //si la fonction est 2 + if(this.fonction==2){ + int nombre=0; + //try catch pour les format pas bon + //tant que il n'y a pas d'Exception + try{ + //fond en blanc + this.zone.setBackground(new Color(255,255,255)); + //le nombre est = au nombre dans la zone de texte + nombre=Integer.parseInt(this.zone.getText()); + //si inferieur a 0 + if(nombre<0){ + //nombre a 0 (min de bombe) + nombre=0; + } + //si collonne et ligne deja existant + if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1){ + //si ce nombre > nb de Case + if(nombre>this.plat.getLigne()*this.plat.getCollonne()){ + //nombre = nombre max de bombe + nombre=this.plat.getLigne()*this.plat.getCollonne(); + } + //on précise au plateau le nombre de bombe + this.plat.setBombe(nombre); + //si il tout est deja initialiser (ligne, collonne et bombe) + if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1 && this.plat.getBombe()!=-1){ + //on lance la nouvelle partie + this.plat.newGame(); + }else{ + //autrement + if(this.plat.getBombe()==-1){ + this.zone.setBackground(Color.red); + this.zone.setText("Rentrer un nombre de Bombe"); + } + } + }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 entier"); + this.plat.setBombe(-1); + } + } + if(this.fonction==3){ + //si fonction 3 donc boutons + + //plusoumoins avec comme argument +1 + this.plusoumoins(1); + } + if(this.fonction==4){ + //si fonction 4 donc boutons - + //plus ou moins avec argument -1 + this.plusoumoins(-1); + } + } + private void plusoumoins(int n){ + int nombre=0; + //try catch pour les gestion de format non conforme + //tant que il n'y a pas d'exception + try{ + //fond en blanc + this.zone.setBackground(new Color(255,255,255)); + //le nombre = nombre deja présent + l'argument + nombre=Integer.parseInt(this.zone.getText())+n; + //si le nombre <0 nombre = au minimum + if(nombre<0){ + nombre=0; + } + //si les collonnes et les lignes existe deja + if(this.plat.getLigne()!=-1 && this.plat.getCollonne()!=-1){ + //si le nomnbre > au nombre de case + // nombre = nombre de case + if(nombre>this.plat.getLigne()*this.plat.getCollonne()){ + nombre=this.plat.getLigne()*this.plat.getCollonne(); + } + //on indique a l'utilisateur le nouveau nombre + this.zone.setText(String.valueOf(nombre)); + }else{ + //si pas de ligne et de collonnes + //fond en rouge + this.zone.setBackground(Color.red); + //on indique a l'utilisateur les précondition avant de remplir ce champs + this.zone.setText("Selectionner Ligne et Collonne Avant"); + //on indique au plateau que le choix n'est toujours pas fait + nombre=-1; + } + //on précise au plateau le nombre de bombe choisit + this.plat.setBombe(nombre); + }catch(NumberFormatException e1){ + //si format inchohérent + //fond en rouge + this.zone.setBackground(Color.red); + //on précise ce que l'ont veut + this.zone.setText("rentrer un entier"); + //on indique au plateau que le choix n'est toujours pas fait + this.plat.setBombe(-1); + } + } +} \ No newline at end of file diff --git a/observateurCase.class b/observateurCase.class new file mode 100644 index 0000000..0fbe163 Binary files /dev/null and b/observateurCase.class differ diff --git a/observateurCase.java b/observateurCase.java new file mode 100644 index 0000000..1b7284b --- /dev/null +++ b/observateurCase.java @@ -0,0 +1,170 @@ +//Tom Monin et Clément Martins +// observateurChoix V4 +//Class de l'observateur des Cases +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.time.*; + +public class observateurCase implements MouseListener{ + private int ligne, collonne; + private Case[][] tableau; + private plateau plat; + public observateurCase(int ligne0, int collonne0, Case[][] tableau0, plateau plat0){ + this.ligne=ligne0; + this.collonne=collonne0; + this.tableau=tableau0; + this.plat=plat0; + } + @Override + public void mouseClicked(MouseEvent evenement){ + //si on clique gauche + if(evenement.getButton() == MouseEvent.BUTTON1){ + //si la case n'est pas suspecter(d'etre une bombe ou je sais pas) et que elle n'est pas visible + if(this.tableau[this.ligne][this.collonne].getSuspition()==0 && this.tableau[this.ligne][this.collonne].getVisibiliter()==false){ + //nous la rendons visible et la reafichons + this.tableau[this.ligne][this.collonne].setVisibiliter(true); + this.tableau[this.ligne][this.collonne].repaint(); + //si elle n'a pas de voisin nous pouvons afficher les case aux alentours qui serons évidentes a cliquer + if(this.tableau[this.ligne][this.collonne].getVoisin()==0 && this.tableau[this.ligne][this.collonne].getBombe()==false){ + this.cliqueEvident(this.ligne, this.collonne); + } + } + } + //si clique droit + if(evenement.getButton() == MouseEvent.BUTTON3){ + //nous modifions la suspitions de la case et la reafichons si la case n'est pas visible + if(this.tableau[this.ligne][this.collonne].getVisibiliter()==false){ + this.tableau[this.ligne][this.collonne].suspition(); + this.tableau[this.ligne][this.collonne].repaint(); + } + //nous testons si le joeur a gagner/perdu + if(this.tableau[this.ligne][this.collonne].getSuspition()==1){ + plat.setScore(-1); + }if(this.tableau[this.ligne][this.collonne].getSuspition()==2){ + plat.setScore(+1); + } + + } + //nous testons si le joueur a gagner/perdu + //si perdu + if(plat.etatDeVictoire()==-1){ + //on precise quelle case a exploser + this.tableau[this.ligne][this.collonne].setSuspition(4); + } + //si gagner + if(plat.etatDeVictoire()==1){ + //on initialise le nombre de minute a 0 + int min=0; + //on regarde si le joueur a passer plus de 1h + if(LocalTime.now(ZoneId.systemDefault()).getHour()-this.plat.getTemps().getHour()>0){ + //si oui on recupere ses minutes avec h*60 plus n minute + min+=LocalTime.now(ZoneId.systemDefault()).getHour()-this.plat.getTemps().getHour()*60; + } + //le score sera calculer de cette manière: + //frequence de bombe par rapport au nombre de case *10 000 / le temps en min passer a le résoudre + //temps en minute: + float resultatTemps=LocalTime.now(ZoneId.systemDefault()).getMinute()+this.plat.getMinute()-this.plat.getTemps().getMinute()+1; + //fréquence des bombe + float frequenceBombe=(this.plat.getBombe()*10000)/(this.plat.getLigne()*this.plat.getCollonne()); + //score final= frequenceBombe/resultatTemps + //on affiche au joueur son score + JOptionPane.showMessageDialog(this.plat.getFenetre(), "Vous avez gagné! \n Votre score est de "+frequenceBombe/resultatTemps); + } + } + @Override // un bouton cliqué + public void mouseEntered(MouseEvent evenement){ + + } + @Override // debut du survol + public void mouseExited(MouseEvent evenement){ + } + @Override // fin du survol + public void mousePressed(MouseEvent evenement){ + + } + @Override // un bouton appuyé + public void mouseReleased(MouseEvent evenement){ + + } + + //--------------------------------fonction permettant d'afficher toutes les case n'ayant pas de voisin adjacente utilisant plusieur fonction récursive----------------------------- + + + private void cliqueEvident(int ligneDelta, int collonneDelta){ + //nous affichons la case si elle n'est pas suspecter (pour laisser l'erreur au joueur) + if(this.tableau[ligneDelta][collonneDelta].getSuspition()==0){ + this.tableau[ligneDelta][collonneDelta].setVisibiliter(true); + this.tableau[ligneDelta][collonneDelta].repaint(); + } + //nous affichons les cases possédants des voisins + this.affichageVoisinEvident(ligneDelta, collonneDelta); + //si la case du haut existe et n'est pas visible et n'a pas de voisin et n'est pas une bombe + if(ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta].getVoisin()==0 && this.tableau[ligneDelta-1][collonneDelta].getBombe()==false){ + //on utilise la fonction recurisve sur la case du haut + this.cliqueEvident(ligneDelta-1, collonneDelta); + } + //la même chose pour les 8 cases possible donc recursivite possible (voir principe en haut) + if(collonneDelta>0 && ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta-1].getVoisin()==0 && this.tableau[ligneDelta-1][collonneDelta-1].getBombe()==false){ + this.cliqueEvident(ligneDelta-1, collonneDelta-1); + } + if(ligneDelta0 && this.tableau[ligneDelta][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta][collonneDelta-1].getVoisin()==0 && this.tableau[ligneDelta][collonneDelta-1].getBombe()==false){ + this.cliqueEvident(ligneDelta, collonneDelta-1); + } + if(collonneDelta>0 && ligneDelta0 && this.tableau[ligneDelta-1][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta+1].getVoisin()==0 && this.tableau[ligneDelta-1][collonneDelta+1].getBombe()==false){ + this.cliqueEvident(ligneDelta-1, collonneDelta+1); + } + if(collonneDelta0 && this.tableau[ligneDelta-1][collonneDelta].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta].getVoisin()>0 && this.tableau[ligneDelta-1][collonneDelta].getSuspition()==0){ + this.tableau[ligneDelta-1][collonneDelta].setVisibiliter(true); + this.tableau[ligneDelta-1][collonneDelta].repaint(); + } + if(ligneDelta0 && this.tableau[ligneDelta+1][collonneDelta].getSuspition()==0){ + this.tableau[ligneDelta+1][collonneDelta].setVisibiliter(true); + this.tableau[ligneDelta+1][collonneDelta].repaint(); + } + if(collonneDelta0 && this.tableau[ligneDelta][collonneDelta+1].getSuspition()==0){ + this.tableau[ligneDelta][collonneDelta+1].setVisibiliter(true); + this.tableau[ligneDelta][collonneDelta+1].repaint(); + } + if(collonneDelta>0 && this.tableau[ligneDelta][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta][collonneDelta-1].getVoisin()>0 && this.tableau[ligneDelta][collonneDelta-1].getSuspition()==0){ + this.tableau[ligneDelta][collonneDelta-1].setVisibiliter(true); + this.tableau[ligneDelta][collonneDelta-1].repaint(); + } + if(collonneDelta>0 && ligneDelta>0 && this.tableau[ligneDelta-1][collonneDelta-1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta-1].getVoisin()>0 && this.tableau[ligneDelta-1][collonneDelta-1].getSuspition()==0){ + this.tableau[ligneDelta-1][collonneDelta-1].setVisibiliter(true); + this.tableau[ligneDelta-1][collonneDelta-1].repaint(); + } + if(collonneDelta>0 && ligneDelta0 && this.tableau[ligneDelta+1][collonneDelta-1].getSuspition()==0){ + this.tableau[ligneDelta+1][collonneDelta-1].setVisibiliter(true); + this.tableau[ligneDelta+1][collonneDelta-1].repaint(); + } + if(collonneDelta0 && this.tableau[ligneDelta-1][collonneDelta+1].getVisibiliter()==false && this.tableau[ligneDelta-1][collonneDelta+1].getVoisin()>0 && this.tableau[ligneDelta-1][collonneDelta+1].getSuspition()==0){ + this.tableau[ligneDelta-1][collonneDelta+1].setVisibiliter(true); + this.tableau[ligneDelta-1][collonneDelta+1].repaint(); + } + if(collonneDelta0 && this.tableau[ligneDelta+1][collonneDelta+1].getSuspition()==0){ + this.tableau[ligneDelta+1][collonneDelta+1].setVisibiliter(true); + this.tableau[ligneDelta+1][collonneDelta+1].repaint(); + } + } +} \ No newline at end of file diff --git a/observateurChoix.class b/observateurChoix.class new file mode 100644 index 0000000..3671ba1 Binary files /dev/null and b/observateurChoix.class differ diff --git a/observateurChoix.java b/observateurChoix.java new file mode 100644 index 0000000..46af6f7 --- /dev/null +++ b/observateurChoix.java @@ -0,0 +1,95 @@ +//Tom Monin et Clément Martins +// observateurChoix V1 +//Class pour la selection du nombre de collone et ligne et de Mine a la souris +//ainsi que pour le choix du premier menu +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.io.*; + +public class observateurChoix implements MouseListener{ + //le composant qui est observer ainsi que le premier (pour les ligne de choix du 2ème menu) + private paintChoix pinceau, premier; + //le texte des ligne et collonne + private JLabel texte; + //le plateau + private plateau plat; + //constructeur + private boolean fonction; // attribut utiliser que pour le logo + //@params (le composant, le premier composant de la ligne, le texte, le plateau) + public observateurChoix(paintChoix pinceau0, paintChoix premier0, JLabel texte0, plateau plat0){ + this.pinceau=pinceau0; + this.premier=premier0; + this.texte=texte0; + this.plat=plat0; + this.fonction=false; + } + public void setFonction(boolean fonction0){ + this.fonction=fonction0; + } + @Override + public void mouseClicked(MouseEvent evenement){ + //on connaîtra la fonction desirer par le composant grâce a sa fonction + //et donc réagir en conséquence + //si la fonction est hors 8 et 10 + //c'est alors que l'observateur est destiner au deuxième menu + if(this.pinceau.getFonction()==1 || this.pinceau.getFonction()==2){ + //on remet tous en false a partir du premier composant + this.premier.setClique(false); + //on les remet en true a partir de celui qui est cliquer + this.pinceau.setClique(true); + //si la fonction est de 1 (pour les ligne) + if(this.pinceau.getFonction()==1){ + //nous repositionons le nombre de ligne en foction de la position du composant + this.texte.setText("<=== Ligne: "+String.valueOf(this.pinceau.getN())); + //nous precisions au plateau le nombre de ligne selectionner + this.plat.setLigne(this.pinceau.getN()); + } + //si la fonction est de 2 (pour les collonnes) + if(this.pinceau.getFonction()==2){ + //nous repositionons le nombre de collonne en fonction de la position du composant + this.texte.setText("Collonne: "+String.valueOf(this.pinceau.getN()+" ===>")); + //nous precisions au plateau le nombre de collonne selectionner + this.plat.setCollonne(this.pinceau.getN()); + } + // pour les autres fonction (premier menu) + }else{ + //fonction 9 (pour nouvelle partie) + if(this.pinceau.getFonction()==9){ + this.plat.menuChoixLCB(); + } + //fonction 10 (pour reprendre une partie) + if(this.pinceau.getFonction()==10){ + try{ + FileInputStream fichier = new FileInputStream("./sauvegarde.data"); + this.plat.reprendrePartie(fichier); + }catch(FileNotFoundException e1){ + JOptionPane.showMessageDialog(this.plat.getFenetre(), "sauvegarde introuvable"); + } + } + //fonction 8 (pour quitter la partie) + if(this.pinceau.getFonction()==8){ + this.plat.getFenetre().dispose(); + } + } + } + @Override // un bouton cliqué + public void mouseEntered(MouseEvent evenement){ + //on precise au composant que ont est en train de le survoler + this.pinceau.selectionner(true); + } + @Override // debut du survol + public void mouseExited(MouseEvent evenement){ + //on precise au composant que on ne le survol plus + this.pinceau.selectionner(false); + } + @Override // fin du survol + public void mousePressed(MouseEvent evenement){ + + } + @Override // un bouton appuyé + public void mouseReleased(MouseEvent evenement){ + + } + +} \ No newline at end of file diff --git a/observateurFenetre.class b/observateurFenetre.class new file mode 100644 index 0000000..b4c149c Binary files /dev/null and b/observateurFenetre.class differ diff --git a/observateurFenetre.java b/observateurFenetre.java new file mode 100644 index 0000000..680aaa0 --- /dev/null +++ b/observateurFenetre.java @@ -0,0 +1,37 @@ +//Fonction permettant d'observer les action realiser sur la fenetre et notament pour +//sauvegarder avant la fermeture de celle-di +import java.awt.event.*; + +public class observateurFenetre implements WindowListener{ + private plateau plat; + public observateurFenetre(plateau plat0){ + this.plat=plat0; + } + + public void windowActivated(WindowEvent evenement){ + + } // premier plan + public void windowClosed(WindowEvent evenement){ + + } // après fermeture + public void windowClosing(WindowEvent evenement){ + //si le joueur veut fermer la fenetre + //si la partie n'est pas encore fini + if(this.plat.etatDeVictoire()==0){ + //on sauvegarde + this.plat.save(); + } + } // avant fermeture + public void windowDeactivated(WindowEvent evenement){ + + } // arrière-plan + public void windowDeiconified(WindowEvent evenement){ + + } // restauration + public void windowIconified(WindowEvent evenement){ + + } // minimisation + public void windowOpened(WindowEvent evenement){ + + } // après ouverture +} \ No newline at end of file diff --git a/observateurSAV.class b/observateurSAV.class new file mode 100644 index 0000000..d82c6d1 Binary files /dev/null and b/observateurSAV.class differ diff --git a/observateurSAV.java b/observateurSAV.java new file mode 100644 index 0000000..413b714 --- /dev/null +++ b/observateurSAV.java @@ -0,0 +1,49 @@ +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; + +//classe de l'observateur pour la sauvegarde + +public class observateurSAV implements MouseListener{ + private plateau plat; //le plateau + private paintMenuJeu button; //notre boutons de sauvegarde + private boolean fonction; //la fonction + public observateurSAV(paintMenuJeu button0, plateau plat0){ + this.button=button0; + this.plat=plat0; + this.fonction=false; // par default a false (mode sauvegarde) + } + public void setFonction(boolean fonction0){ + this.fonction=fonction0; //pour modifier la fonction plus tard + } + @Override + public void mouseClicked(MouseEvent evenement){ + //si fonction false (mode sauvegarde) + if(this.fonction==false){ + plat.save(); + } + //sinp=on mode rejouer + if(this.fonction==true){ + plat= new plateau(plat.getFenetre()); + plat.menuChoixTypePartie(); + } + } + @Override // un bouton cliqué + public void mouseEntered(MouseEvent evenement){ + //on indique au composant le survol + this.button.setSurvol(true); + } + @Override // debut du survol + public void mouseExited(MouseEvent evenement){ + //on indique au composant la fin du survol + this.button.setSurvol(false); + } + @Override // fin du survol + public void mousePressed(MouseEvent evenement){ + + } + @Override // un bouton appuyé + public void mouseReleased(MouseEvent evenement){ + + } +} \ No newline at end of file diff --git a/paintChoix.class b/paintChoix.class new file mode 100644 index 0000000..c836b1c Binary files /dev/null and b/paintChoix.class differ diff --git a/paintChoix.java b/paintChoix.java new file mode 100644 index 0000000..becf4f6 --- /dev/null +++ b/paintChoix.java @@ -0,0 +1,116 @@ + +// Tom Monin et Clément Martins +// paintChoix V1 +// class pour l'affichage de la selection des lignes, collonnes et nombre de mines + +import java.awt.*; +import javax.swing.*; +import javax.swing.JComponent; + +public class paintChoix extends JComponent{ + private boolean selectionner; //si la case est survoler + private paintChoix pinceau; //le composant suivant + private boolean clique; //si la casse a été cliquer + private int x; //sa position + private int fonction; //sa fonction (pour éviter le surplus de classe inutiles) + public paintChoix(int x0, int fonction0){ + this.clique=false; //de base le composant n'est pas cliquer + this.pinceau=null; //il n'a pas de suivant + this.selectionner=false; //il n'est pas selectionner + this.x=30-x0; //sa position est la différence de 30 - celle donner (car ordre decroisant) + this.fonction=fonction0; + //de base ce n'est pas selectionner + } + + // fonction permetant positionner la case et ses voisoins sur selectionner + public void selectionner(boolean verif){ + //on postionne la case en selectionner = @params + this.selectionner=verif; + //si il a un suivant + if(this.pinceau!=null){ + //on lui transmet le message + this.pinceau.selectionner(verif); + } + //on repaint la case + this.repaint(); + } + public void setPaintChoix(paintChoix pinceau0){ + //pour positionner le composant suivant + this.pinceau=pinceau0; + } + public void setClique(boolean verif){ + //même principe que selectionner + this.clique=verif; + if(this.pinceau!=null){ + this.pinceau.setClique(verif); + } + this.repaint(); + } + public int getFonction(){ + return this.fonction; + } + public int getN(){ + return this.x; + } + @Override + protected void paintComponent(Graphics pinceau) { + // obligatoire : on crée un nouveau pinceau pour pouvoir le modifier plus tard + Graphics secondPinceau = pinceau.create(); + // obligatoire : si le composant n'est pas censé être transparent + if (this.isOpaque()) { + // obligatoire : on repeint toute la surface avec la couleur de fond + secondPinceau.setColor(this.getBackground()); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + //si cliquer + if(this.clique==true){ + //carrer bleu + secondPinceau.setColor(new Color(0, 127, 255)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + //si selectionner + if(selectionner==true){ + //carrer orange + secondPinceau.setColor(new Color(255, 127, 0)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + //autrement carrer blanc + secondPinceau.setColor(new Color(0,0,0)); + secondPinceau.drawRect(0, 0, this.getWidth(), this.getHeight()); + //si la fonction est de 8 (pour les premier menu) + if(this.fonction==8){ + //fond blanc + secondPinceau.setColor(new Color(255, 255, 255)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + //on dessinne l'image correspondante + Image nouveau=Toolkit.getDefaultToolkit().getImage("./IMAGE/nouveau.jpg"); + if(this.selectionner==true){ + //si elle est survoler un l'agrandi pour une mailleur visibilite + secondPinceau.drawImage(nouveau, 0, 0, this.getWidth(), this.getHeight(), this); + }else{ + secondPinceau.drawImage(nouveau, this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18, this); + } + } + //même principe pour les autre if suivant + if(this.fonction==9){ + secondPinceau.setColor(new Color(255, 255, 255)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + Image quitter=Toolkit.getDefaultToolkit().getImage("./IMAGE/quitter.jpg"); + if(this.selectionner==true){ + secondPinceau.drawImage(quitter, 0, 0, this.getWidth(), this.getHeight(), this); + }else{ + secondPinceau.drawImage(quitter, this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18, this); + } + } + if(this.fonction==10){ + secondPinceau.setColor(new Color(255, 255, 255)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + Image reprendre=Toolkit.getDefaultToolkit().getImage("./IMAGE/reprendre.png"); + if(this.selectionner==true){ + secondPinceau.drawImage(reprendre, 0, 0, this.getWidth(), this.getHeight(), this); + }else{ + secondPinceau.drawImage(reprendre, this.getWidth()/20, this.getHeight()/20, this.getWidth()/20*18, this.getHeight()/20*18, this); + } + } + } +} \ No newline at end of file diff --git a/paintMenuJeu.class b/paintMenuJeu.class new file mode 100644 index 0000000..5c1ad00 Binary files /dev/null and b/paintMenuJeu.class differ diff --git a/paintMenuJeu.java b/paintMenuJeu.java new file mode 100644 index 0000000..ebe067a --- /dev/null +++ b/paintMenuJeu.java @@ -0,0 +1,175 @@ +import java.awt.*; +import javax.swing.*; +import javax.swing.JComponent; + +//Classe pour l'affichage du menu en haut du jeu avec notament le score et les logo +public class paintMenuJeu extends JComponent{ + private int choix; //pour préciser le but du composant + private int scoreMax, score; //le score maximum et le score actuel + private boolean survol; //si la case est survoler + public paintMenuJeu(int choix0, int score0, int scoreMax0){ + this.choix=choix0; + this.score=score0; + this.scoreMax=scoreMax0; + this.survol=false; + } + //----------------------getteur et Setter------------------------------ + public void setChoix(int choix0){ + this.choix=choix0; + this.repaint(); + } + public void setScore(int score0){ + this.score=score0; + this.repaint(); + } + public int getScore(){ + return this.score; + } + public void setSurvol(boolean survol0){ + this.survol=survol0; + this.repaint(); + } + public int getScoreMax(){ + return this.scoreMax; + } + public int getFonction(){ + return this.choix; + } + + + @Override + protected void paintComponent(Graphics pinceau) { + // obligatoire : on crée un nouveau pinceau pour pouvoir le modifier plus tard + Graphics secondPinceau = pinceau.create(); + // obligatoire : si le composant n'est pas censé être transparent + if (this.isOpaque()) { + // obligatoire : on repeint toute la surface avec la couleur de fond + secondPinceau.setColor(this.getBackground()); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + //On paint ce que l'on veut maintenant + //par default on remplis de noir + secondPinceau.setColor(new Color(0,0,0)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + //si le choix est de 1 (chiffre des centaines) + if(this.choix==1){ + //le score correspond au chiffre des centaine + int nombre=this.score/100; + //on affiche le chiffre correspondant + this.paintNombre(secondPinceau, nombre); + } + //si le choix est de 1 (chiffre des dixaines) + if(this.choix==2){ + //le score correspond au chiffre des dixaine + int nombre=this.score; + if(nombre>=100){ + nombre=this.score-100*(this.score/100); + } + nombre=nombre/10; + //on affiche le chiffre correspondant + this.paintNombre(secondPinceau, nombre); + } + //si le choix de 3 (chiffre des untité) + if(this.choix==3){ + //le score correspond au chiffre des uité + int nombre=this.score; + if(nombre>=100){ + nombre=this.score-100*(this.score/100); + } + if(nombre>=10){ + nombre=this.score-10*(this.score/10); + } + //on affiche le chiffre correspondant + this.paintNombre(secondPinceau, nombre); + } + //si le choix est de (logo sauvegarde) + if(this.choix==4){ + //si survoler + if(this.survol==true){ + //fond en vert + secondPinceau.setColor(new Color(0,255,0)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + //on affiche l'image + Image sav=Toolkit.getDefaultToolkit().getImage("./IMAGE/sav.png"); + secondPinceau.drawImage(sav, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + //si choix est de 5 (lorsque le joueur perd) + if(this.choix==5){ + //on affiche des bonhomes pas content pour montrer que il a perdu + Image lose=Toolkit.getDefaultToolkit().getImage("./IMAGE/lose.png"); + secondPinceau.drawImage(lose, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + //si choix de 6 (gagner) + if(this.choix==6){ + //bonhomme content + Image win=Toolkit.getDefaultToolkit().getImage("./IMAGE/win.png"); + secondPinceau.drawImage(win, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + //si choix de 7 (logo replay) + if(this.choix==7){ + //et survol + if(this.survol==true){ + //fond en vert + secondPinceau.setColor(new Color(0,255,0)); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + // on affiche le logo replay + Image replay=Toolkit.getDefaultToolkit().getImage("./IMAGE/replay.png"); + secondPinceau.drawImage(replay, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + + } + + //----------------------fonction pour afficher le nombre donner----------------------- + private void paintNombre(Graphics secondPinceau, int nombre){ + //si le nombre est positif + if(this.score>=0){ + //on regarde les 10 chiffre possible et l'affichons en conséquences + if(nombre==1){ + Image un=Toolkit.getDefaultToolkit().getImage("./IMAGE/unD.png"); + secondPinceau.drawImage(un, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==2){ + Image deux=Toolkit.getDefaultToolkit().getImage("./IMAGE/deuxD.png"); + secondPinceau.drawImage(deux, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==3){ + Image trois=Toolkit.getDefaultToolkit().getImage("./IMAGE/troisD.png"); + secondPinceau.drawImage(trois, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==4){ + Image quatre=Toolkit.getDefaultToolkit().getImage("./IMAGE/quatreD.png"); + secondPinceau.drawImage(quatre, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==5){ + Image cinq=Toolkit.getDefaultToolkit().getImage("./IMAGE/cinqD.png"); + secondPinceau.drawImage(cinq, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==6){ + Image six=Toolkit.getDefaultToolkit().getImage("./IMAGE/sixD.png"); + secondPinceau.drawImage(six, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==7){ + Image sept=Toolkit.getDefaultToolkit().getImage("./IMAGE/septD.png"); + secondPinceau.drawImage(sept, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==8){ + Image huit=Toolkit.getDefaultToolkit().getImage("./IMAGE/huitD.png"); + secondPinceau.drawImage(huit, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==9){ + Image neuf=Toolkit.getDefaultToolkit().getImage("./IMAGE/neufD.png"); + secondPinceau.drawImage(neuf, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + if(nombre==0){ + Image zero=Toolkit.getDefaultToolkit().getImage("./IMAGE/zeroD.png"); + secondPinceau.drawImage(zero, this.getWidth()/6, this.getHeight()/6, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + }else{ + Image err=Toolkit.getDefaultToolkit().getImage("./IMAGE/err.png"); + secondPinceau.drawImage(err, this.getWidth()/20*5, this.getHeight()/20*5, this.getWidth()/6*4, this.getHeight()/6*4 ,this); + } + + } +} \ No newline at end of file diff --git a/plateau.class b/plateau.class new file mode 100644 index 0000000..511cf07 Binary files /dev/null and b/plateau.class differ diff --git a/plateau.java b/plateau.java new file mode 100644 index 0000000..aaea069 --- /dev/null +++ b/plateau.java @@ -0,0 +1,566 @@ +//Tom Monin et Clément Martins +//Class pour des fonctiononalité générale de jeu +//V4 +import java.io.*; +import java.util.*; +import java.awt.event.*; +import java.io.ObjectOutputStream; +import java.awt.*; +import javax.swing.*; +import java.time.*; + +public class plateau{ + //atribut représentant le haut a droite du menu + private paintMenuJeu logo; + + //attribut de la fenetre + private JFrame fenetre; + + //attribut de l'observateur du logo + private observateurSAV observateur; + + //attribut représentant le nombre de ligne, collonne, bombe et minute + private int ligne, collonne, bombe, minute; + + //attribut représentant les 3 case et haut a gauche du menu avec le score + private paintMenuJeu[] tabScore= new paintMenuJeu[3]; + + //notre tableau de Case correspondant a l'ensemble des Case du jeu + private Case[][] tableau; + + //date a laquel cette partie a été lancer/relancer + private LocalTime temps; + + //constructeur + //@params (la fenetre) + public plateau(JFrame fenetre0){ + this.fenetre=fenetre0; //on récupere la fenetre deja crée + this.ligne=-1; //initialement a -1 (valeur sentinelle) + this.collonne=-1; //initialement a -1 (valeur sentinelle) + this.bombe=-1; //initialement a -1 (valeur sentinelle) + } + + + //-------------------> Debut Seter et Getteur <------------------------- + public int getLigne(){ + return this.ligne; + } + public int getCollonne(){ + return this.collonne; + } + public int getBombe(){ + return this.bombe; + } + public JFrame getFenetre(){ + return this.fenetre; + } + public void setCollonne(int n){ + this.collonne=n; + } + public void setLigne(int n){ + this.ligne=n; + } + public void setBombe(int n){ + this.bombe=n; + } + public LocalTime getTemps(){ + return this.temps; + } + public int getMinute(){ + return this.minute; + } + //-------------------------> fin Setter et Getteur <----------------------------- + + //-------------------------Fonction plaçant les bombes aléatoirement------------------------ + + private void setAllBombe(){ + Random rand = new Random(); + //on répète le nombre de fois le nombre de bombe a placer + for(int i=0; i0){ + if(this.tableau[i-1][t].getBombe()==true){ + //si elle le sont alors nous augmentons le nombre de voisin + voisin++; + } + if(t>0){ + if(this.tableau[i-1][t-1].getBombe()==true){ + voisin++; + } + } + if(t0){ + if(this.tableau[i+1][t-1].getBombe()==true){ + voisin++; + } + } + if(t0){ + if(this.tableau[i][t-1].getBombe()==true){ + voisin++; + } + } + if(t0){ + //on retourne 0 ici comme une valleur null + return 0; + } + // le joueur a gagner + this.removeListener(); + this.gagner(); + //sinon le joueur a donc gagner on renvoie 1 + return 1; + } + //-----------------------------------Fonction après victoire/defaite pour enlever les observateur a chaque Case-------------------------------- + + private void removeListener(){ + //on parcour le tableau du jeu + 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 <------------------------- + +/* + +Mettre les bloc try catch au bon endroit +*/ + + + + public void save(){ + //si la fonction est appeler et donc + int resultat=JOptionPane.showConfirmDialog(this.fenetre, "Voulez vous sauvegarder?"); + if(resultat!=JOptionPane.YES_OPTION){ + if(resultat==JOptionPane.NO_OPTION){ + this.fenetre.dispose(); + } + }else{ + //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")); + try{ + //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; i0){ + //on multiplie le nombre d'heure par 60 et ajoutons son nombre de minutes dans celle-ci + oos.writeInt(LocalTime.now(ZoneId.systemDefault()).getHour()-this.temps.getHour()*60+this.temps.getMinute()); + }else{ + oos.writeInt(this.temps.getMinute()); + } + + //nous fermons la sauvegardes + try{ + oos.close(); + //si erreur dans la fermuture donc lors de l'ecriture final + }catch(IOException e){ + //nous affichons un pop-up pour pevenir l'utilisateur + JOptionPane.showMessageDialog(this.fenetre, "erreur lors de l'ecriture final de la sauvegarde"); + this.fenetre.dispose(); + } + //si erreur lors de l'ecriture + }catch(IOException e){ + //nous affichons un pop-up pour pevenir l'utilisateur + JOptionPane.showMessageDialog(this.fenetre, "erreur lors de l'ecriture de la sauvegarde"); + this.fenetre.dispose(); + } + //si fichier introuvable et donc (dossier du même nom, problème de droit d'accès...) + }catch(FileNotFoundException e1){ + //nous affichons un pop-up pour pevenir l'utilisateur + JOptionPane.showMessageDialog(this.fenetre, "erreur impossible d'accèder au fichier de sauvegarde"); + this.fenetre.dispose(); + } + //autrement, nous fermons la fenetre et donc arrêtons l'applications et indiquons au joueur que tout c'est bien dérouler + JOptionPane.showMessageDialog(this.fenetre, "Partie sauvegarder"); + this.fenetre.dispose(); + } + + + + } + public void reprendrePartie(FileInputStream file){ + //initialisation de la variable score + int score=0; + //les fonctions vont lever des Exeption nous devons donc mettre un try Catch + try{ + //initialisation des collonnes avec le fichier + try{ + //création de l'objet pour lire le fichier donner + ObjectInputStream ois = new ObjectInputStream(file); + this.ligne=ois.readInt(); + this.collonne=ois.readInt(); + //on crée le tableau de Case avec les bonnes dimention + this.tableau=new Case[this.ligne][this.collonne]; + //on parcoure celui-ci et remettons les Case avec la sauvegarde + for(int i=0; i Fonction pour Lancer une partie <-------------------------------------- + + private void launchGame(int score){ + //nous sauvegardons la date du lancement avec l'attribut temps + this.temps=LocalTime.now(ZoneId.systemDefault()); + //on ferme l'ancienne fenetre + this.fenetre.dispose(); + //on en crée une nouvelles + this.fenetre=new JFrame("démineur"); + // 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)); + this.fenetre.setBackground(new Color(0,0,0)); + //nous découpons la fentre en 2 partie grâce au JPanel + //le paneau du jeu + JPanel panJeu = new JPanel(); + //le paneau du menu + JPanel panMenu = new JPanel(); + panJeu.setBackground(new Color(0,0,0)); + panMenu.setBackground(new Color(0,0,0)); + //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 + panJeu.setLayout(new GridLayout(this.ligne,this.collonne)); + //pour le menu la mise en page ne dépend pas de la partie + panMenu.setLayout(new GridLayout(1, 15)); + //on met en place le menu du haut et donc toute la première ligne + for(int i=0; i<15; i++){ + paintMenuJeu menu= new paintMenuJeu(0, score, bombe); + //nous mettons des dimensions convenable pour des Case + menu.setPreferredSize(new Dimension(50,50)); + //les 3 premières case serons consacrés au score + if(i==0){ + this.tabScore[0]=menu; + menu.setChoix(1); + } + if(i==1){ + this.tabScore[1]=menu; + menu.setChoix(2); + } + if(i==2){ + this.tabScore[2]=menu; + menu.setChoix(3); + } + //et la derniere au logo + if(i==14){ + menu.setChoix(4); + this.logo=menu; + observateurSAV observateur=new observateurSAV(menu, this); + menu.addMouseListener(observateur); + this.observateur=observateur; + } + //sinon le composant sera juste sobre + panMenu.add(menu); + } + //on ajoute ensuite toutes les Case a la fenetre + 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.setSize(1600, 1000); + this.fenetre.setVisible(true); + this.fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + //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(""); + //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); + 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==26){ + //si c'est la dernière ligne, boutons valider + JButton valider = new JButton("valider"); + valider.addActionListener(new observateurButtonEtText(this, 2, nbombe)); + this.fenetre.add(valider); + }if(i==17){ + //boutons plus + JButton plus = new JButton("+"); + plus.addActionListener(new observateurButtonEtText(this, 3, nbombe)); + this.fenetre.add(plus); + }if(i==18){ + //texteArea qui représente le nombre de bombe + nbombe.setHorizontalAlignment(JLabel.CENTER); + nbombe.addActionListener(new observateurButtonEtText(this, 1, nbombe)); + this.fenetre.add(nbombe); + }if(i==19){ + //boutons moins + JButton moins = new JButton("-"); + moins.addActionListener(new observateurButtonEtText(this, 4, nbombe)); + 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); + } + } + //-----------------------------------------> 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.setSize(1600, 1000); + this.fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + //nous séparons la fenetre en 3 collonne + this.fenetre.setLayout(new GridLayout(1,3)); + //pour chaque colonne nous lui ajouterons un paint choix + paintChoix men1=new paintChoix(0, 8); //pour quitter la partie + paintChoix men2=new paintChoix(0, 9); //pour faire une nouvelle partie + paintChoix men3=new paintChoix(0, 10); //pour reprendre la partie + + //nous ajoutons ces composant + this.fenetre.add(men3); + this.fenetre.add(men2); + this.fenetre.add(men1); + + //nous ajoutons des observateurs a nos composant + men1.addMouseListener(new observateurChoix(men1, null, null, this)); + men3.addMouseListener(new observateurChoix(men3, null, null, this)); + men2.addMouseListener(new observateurChoix(men2, null, null, this)); + this.fenetre.setVisible(true); + } +} \ No newline at end of file