package fr.blankoworld.plateau; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.border.BevelBorder; /** * * @author olivier * */ /** * Classe permettant d'interfacer le plateau de jeu du Puissance 4 */ public class IhmPuissance4 extends JFrame { private static final long serialVersionUID = 1L; /** Un nouveau plateau de jeu ? */ private PlateauPuissance4 p4 = new PlateauPuissance4(); /** Un joueur de base que nous utiliserons dans le programme */ private Joueurs joueur; /** Nombre de pions dans le jeu */ private int comptePion = 0; /** Largeur fenetre */ int largeurFenetre = 800; /** Le champ texte de la barre de statut */ private JLabel LabelStatut = new JLabel("Veuillez selectionner une action dans le menu."); /** Le second champ texte de la barre de statut */ private JLabel LabelInfos = new JLabel("Aucun Joueur"); /** Le paneau centre */ JPanel Panneau_Centre; /** Nos degrades de couleur */ GradientPaint degradeRouge; GradientPaint degradeJaune; /** Y a t il un gagnant au depart ? */ private boolean aucunGagnant = true; /** * @param args */ /** * Constructeur de l'IHM */ private IhmPuissance4(){ // Creation du menu Jeu JMenu MenuJeu = new JMenu("Jeu"); JMenuItem MenuJeu_Nouveau = new JMenuItem("Nouveau"); JMenuItem MenuJeu_Quitter = new JMenuItem("Quitter"); MenuJeu.add(MenuJeu_Nouveau); MenuJeu.addSeparator(); MenuJeu.add(MenuJeu_Quitter); // Creation du menu Aide JMenu MenuAide = new JMenu("Aide"); JMenuItem MenuAide_Apropos = new JMenuItem("A propos"); MenuAide.add(MenuAide_Apropos); // Creation de la barre de menus JMenuBar MenuPrincipal = new JMenuBar(); MenuPrincipal.add(MenuJeu); MenuPrincipal.add(MenuAide); MenuPrincipal.setBorder(new BevelBorder(BevelBorder.RAISED)); // Panel au centre Panneau_Centre = new JPanel(); Panneau_Centre.setBackground(Color.WHITE); Panneau_Centre.setBorder(new BevelBorder(BevelBorder.RAISED)); // Creation de la barre de status JPanel PanneauStatut = new JPanel(); PanneauStatut.setLayout(new BorderLayout()); PanneauStatut.add(LabelStatut, BorderLayout.WEST); PanneauStatut.add(LabelInfos, BorderLayout.EAST); PanneauStatut.setBorder(new BevelBorder(BevelBorder.RAISED)); // Construction de la maquette this.getContentPane().setLayout(new BorderLayout()); this.add(PanneauStatut, BorderLayout.SOUTH); this.add(Panneau_Centre, BorderLayout.CENTER); this.add(MenuPrincipal, BorderLayout.NORTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(largeurFenetre,(int) ((largeurFenetre * 3) / 4)); this.setLocation(200,200); this.setResizable(false); this.setTitle("Blankuissance 4"); // ***************************************************** // // menu Jeu - bouton Nouveau MenuJeu_Nouveau.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev){ menuJeuNouveau(); } }); // menu Jeu - bouton Quitter MenuJeu_Quitter.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev){ menuJeuQuitter(); } }); // menu Apropos - bouton MenuAide_Apropos.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev){ menuApropos(); } }); } /** * * @author olivier * */ /** * On etend la classe JButton a une classe BoutonBlanko pour dessiner des boutons differents */ class BoutonBlanko extends JButton { public static final long serialVersionUID = 1L; /** * Degrade noir */ private GradientPaint degrade = new GradientPaint(100,100,Color.WHITE,170, 0,Color.BLACK); /** * Et la couleur B qui va avec (blanche) */ private String couleur = new String("B"); /** * Redefinition de la methode paintComponent pour dessiner le bouton */ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); // Calcuel dynamiquement les informations de taille (pris de JavaDoc) Dimension size = getSize(); // diametre int d; int x; int y; // On enleve les bordures des boutons this.setBorderPainted(false); // puis le fait que lorsque nous cliquons sur le bouton il y ait un carre gris de selection this.setEnabled(false); // Calcul des donnees du cercle fonce d = (int) ( Math.min(size.width, size.height) * .80 * 1.10); x = (size.width - d)/2; y = (size.height - d)/2; g2.setColor(new Color(17,53,188)); g2.fillOval(x ,y ,d ,d); // Calcul des donnees du cercle intermediaire d = (int) ( Math.min(size.width, size.height) * .80 * 1.05); x = (size.width - d)/2; y = (size.height - d)/2; g2.setColor(Color.BLACK); g2.fillOval(x ,y ,d ,d); // Calcul des donnees du cercle interieur blanc d = (int) ( Math.min(size.width, size.height) * .80 ); x = (size.width - d)/2; y = (size.height - d)/2; // dessine le cercle blanc g2.setPaint(degrade); g2.fillOval(x, y, d, d); } /** * * @param couleurChoisie - Couleur que nous voulons (normalement une lettre) * @param gp - Degrade de peinture * @return La couleur a ete correctement mise ou pas ? */ /** * On ajoute une couleur au bouton et on verifie si elle a bien ete appliquee */ public boolean setCouleur(String couleurChoisie, GradientPaint gp){ if(!couleur.equals("R") && !couleur.equals("J")){ if(couleur.equals("R")){ this.couleur = "R"; } else { this.couleur = "J"; } degrade = gp; return true; } else { couleur.equals("B"); return false; } } } /** *

Action du bouton Quitter du menu Jeu

* */ private void menuJeuQuitter(){ System.exit(0); } /** *

Action du bouton Nouveau du menu Jeu

* @param args */ private void menuJeuNouveau(){ // On initialise le plateau de jeu p4.initialiser(); // Creation d'un joueur generique joueur = new Joueurs("joueur de base", " "); // On alterne de joueur, on recupere donc le joueur en cours joueur = p4.alterneJoueur((Joueurs)p4.getJoueurs().get(1), (Joueurs)p4.getJoueurs().get(2)); // On remet le nombre de pions à 0 comptePion = 0; aucunGagnant = true; this.remove(Panneau_Centre); Panneau_Centre = new JPanel(); Panneau_Centre.setLayout(new GridLayout(p4.nbreLignes,p4.nbreColonnes)); for(int i = 0; i < p4.nbreLignes; i++){ for(int j = 0; j < p4.nbreColonnes; j++){ BoutonBlanko moi = new BoutonBlanko(); moi.setBackground(Color.GRAY); // menu Fichier - bouton Quitter moi.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent ev) { actionGrille(ev); } public void mouseExited(MouseEvent ev) { enleveSurbrillance(ev); } public void mouseReleased(MouseEvent ev){ } public void mousePressed(MouseEvent ev){ } public void mouseEntered(MouseEvent ev){ surbrillanceCellule(ev); } }); Panneau_Centre.add(moi); } } Panneau_Centre.setBorder(new BevelBorder(BevelBorder.RAISED)); this.add(Panneau_Centre, BorderLayout.CENTER); LabelStatut.setText("Selectionnez une colonne puis cliquez dessus."); this.validate(); } /** *

Action du bouton Apropos du menu Aide

* @param args */ private void menuApropos(){ JOptionPane.showMessageDialog(null, "Blankuissance4\n\n" + "Version 0.5\n" + "Developpe par Blankoworld\n\n", "A propos de Blankuissance4", JOptionPane.QUESTION_MESSAGE); } /** *

Action sur la grille du plateau de jeu

* @param ev */ private void actionGrille(MouseEvent ev){ boolean resultat; String couleur; // Degrades de couleurs rouges et jaunes degradeRouge = new GradientPaint(100,100,Color.RED,(int) (this.getHeight() * 0.15), 0,Color.WHITE); degradeJaune = new GradientPaint(100,100,Color.YELLOW,(int) (this.getHeight() * 0.15), 0,Color.WHITE); // Un nouveau bouton pour travailler dessus BoutonBlanko bb = new BoutonBlanko(); BoutonBlanko bbModif = new BoutonBlanko(); // On recupere le bouton sur lequel nous travaillons bb = (BoutonBlanko) ev.getSource(); // Definition de la colonne dans laquelle nous nous trouvons int colonne = (int) (bb.getX() / bb.getWidth()) + 1; // Definition de la ligne ou nous nous trouvons // int ligne = (int) (bb.getY() / bb.getHeight()) + 1; // Definition et calcul du numero du pion sur lequel nous venons de cliquez dans le tableau GRAPHIQUE // int numeroPosAct = ((ligne - 1) * p4.nbreColonnes) + (colonne - 1); // On defini la position reelle pour placer notre pion int PositionColonne = p4.getPosition(colonne - 1); if(aucunGagnant && PositionColonne < p4.nbreLignes && comptePion < p4.nbreColonnes * p4.nbreLignes) { int numeroPlacement = (((p4.nbreLignes - 1 - PositionColonne) * p4.nbreColonnes) + (colonne - 1)); // LabelStatut.setText("Colonne: " + colonne + " Ligne: " + ligne + " Numero: " + // numeroPosAct + " Position de la colonne: " + PositionColonne + " Numero à placer: " + numeroPlacement); LabelStatut.setText("Le " + joueur.getNom() + " a jete son pion dans la colonne " + colonne); // On veut donner le prochain joueur, le programme etant mal fichu, il faut alterner puis revenir en arriere p4.setAlternanceJoueur(); joueur = p4.alterneJoueur((Joueurs)p4.getJoueurs().get(1), (Joueurs)p4.getJoueurs().get(2)); LabelInfos.setText(joueur.getNom() + ", c'est a vous !"); p4.setAlternanceJoueur(); joueur = p4.alterneJoueur((Joueurs)p4.getJoueurs().get(1), (Joueurs)p4.getJoueurs().get(2)); bbModif = (BoutonBlanko) Panneau_Centre.getComponent(numeroPlacement); if(joueur.donneJeton().getCouleur().equals("R")){ couleur = "R"; resultat = bbModif.setCouleur(couleur, degradeRouge); } else{ couleur = "J"; resultat = bbModif.setCouleur(couleur, degradeJaune); } if(p4.getPosition(colonne - 1) < p4.nbreLignes){ // On ajoute le pion au tableau du plateau p4.ajoutPion(colonne - 1, couleur); // // Affichage en console de la grille pour verification // p4.afficherGrille(); } bbModif.repaint(); if(resultat){ // On ajoute un pion au nombre de pions utilises comptePion++; // On confirme que le joueur a joue et qu'on change de joueur p4.setAlternanceJoueur(); joueur = p4.alterneJoueur((Joueurs)p4.getJoueurs().get(1), (Joueurs)p4.getJoueurs().get(2)); } // Mise a niveau de la colonne vis a vis de la structure Java (commence à 0) colonne --; if(comptePion > 5 && p4.gagnant(colonne, p4.getPosition(colonne) - 1)){ comptePion = 41; // On alterne de joueur (oui programme mal fichu !) p4.setAlternanceJoueur(); joueur = p4.alterneJoueur((Joueurs)p4.getJoueurs().get(1), (Joueurs)p4.getJoueurs().get(2)); JOptionPane.showMessageDialog(null, "Le " + joueur.getNom() + " gagne !", "Message", JOptionPane.INFORMATION_MESSAGE); aucunGagnant = false; LabelInfos.setText("Aucun joueur"); LabelStatut.setText("Merci aux participants !"); } } else if(comptePion >= 41){ LabelStatut.setText("Jeu fini !"); } else { LabelStatut.setText("Vous ne pouvez plus jouer dans cette colonne. Choisissez une autre colonne."); } // Repeinte du champ de texte nomme Statut LabelStatut.repaint(); // Idem avec Infos LabelInfos.repaint(); } /** *

Met le bouton choisi en surbrillance

* @param ev - Evenement lie au clic de souris */ public void surbrillanceCellule(MouseEvent ev){ // Un nouveau bouton pour travailler dessus BoutonBlanko bb = new BoutonBlanko(); BoutonBlanko bbModif = new BoutonBlanko(); // On recupere le bouton sur lequel nous travaillons bb = (BoutonBlanko) ev.getSource(); // Definition de la colonne dans laquelle nous nous trouvons int colonne = (int) (bb.getX() / bb.getWidth()) + 1; for(int i = 0; i < p4.nbreLignes; i++){ int numeroPlacement = (((p4.nbreLignes - 1 - i) * p4.nbreColonnes) + (colonne - 1)); bbModif = (BoutonBlanko) Panneau_Centre.getComponent(numeroPlacement); bbModif.setBackground(new Color(213,213,213,125)); bbModif.repaint(); } LabelInfos.setText(joueur.getNom() + " est sur colonne " + colonne + "."); LabelStatut.repaint(); } /** *

Enleve la surbrillance

* @param ev - Evenement lie au clic de souris */ public void enleveSurbrillance(MouseEvent ev){ // Un nouveau bouton pour travailler dessus BoutonBlanko bb = new BoutonBlanko(); BoutonBlanko bbModif = new BoutonBlanko(); // On recupere le bouton sur lequel nous travaillons bb = (BoutonBlanko) ev.getSource(); // Definition de la colonne dans laquelle nous nous trouvons int colonne = (int) (bb.getX() / bb.getWidth()) + 1; for(int i = 0; i < p4.nbreLignes; i++){ int numeroPlacement = (((p4.nbreLignes - 1 - i) * p4.nbreColonnes) + (colonne - 1)); bbModif = (BoutonBlanko) Panneau_Centre.getComponent(numeroPlacement); bbModif.setBackground(Color.GRAY); bbModif.repaint(); } } /** * Methode principale MAIN * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new IhmPuissance4().setVisible(true); } }