//Tom Monin et Clément Martins //Class pour des fonction static 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{ private paintMenuJeu logo; private JFrame fenetre; private observateurSAV observateur; private int ligne, collonne, bombe, minute; private paintMenuJeu[] tabScore= new paintMenuJeu[3]; private Case[][] tableau; private LocalTime temps; public plateau(JFrame fenetre0){ this.fenetre=fenetre0; this.ligne=-1; this.collonne=-1; this.bombe=-1; } //-------------------> Debut Seter et Getteur <------------------------- public void setLogo(paintMenuJeu logo0){ this.logo=logo0; } public void setObservateur(observateurSAV observateur0){ this.observateur=observateur0; } 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; } //-------------------------> 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(){ 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){ 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(); }catch(IOException e){ JOptionPane.showMessageDialog(this.fenetre, "erreur lors de l'ecriture final de la sauvegarde"); this.fenetre.dispose(); } }catch(IOException e){ JOptionPane.showMessageDialog(this.fenetre, "erreur lors de l'ecriture de la sauvegarde"); this.fenetre.dispose(); } }catch(FileNotFoundException e1){ JOptionPane.showMessageDialog(this.fenetre, "erreur impossible d'accèder au fichier de sauvegarde"); this.fenetre.dispose(); } //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){ 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)); JPanel panJeu = new JPanel(); 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)); 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.setLogo(menu); observateurSAV observateur=new observateurSAV(menu, this); menu.addMouseListener(observateur); this.setObservateur(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)); 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 observateurButtonEtText(this, 1, nbombe, this.fenetre)); 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); } } //-----------------------------------------> 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); this.fenetre.setLayout(new GridLayout(1,3)); paintChoix men1=new paintChoix(0, 8); paintChoix men2=new paintChoix(0, 9); paintChoix men3=new paintChoix(0, 10); this.fenetre.add(men3); this.fenetre.add(men2); this.fenetre.add(men1); 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); } }