cours0708/G5a/Puissance4/fr/blankoworld/plateau/IhmPuissance4.java

481 lines
14 KiB
Java

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;
}
}
}
/**
* <p>Action du bouton Quitter du menu Jeu</p>
*
*/
private void menuJeuQuitter(){
System.exit(0);
}
/**
* <p>Action du bouton Nouveau du menu Jeu</p>
* @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();
}
/**
* <p>Action du bouton Apropos du menu Aide</p>
* @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);
}
/**
* <p>Action sur la grille du plateau de jeu</p>
* @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();
}
/**
* <p>Met le bouton choisi en surbrillance</p>
* @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();
}
/**
* <p>Enleve la surbrillance</p>
* @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);
}
}