436 lines
14 KiB
Java
436 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 DOSSMANN
|
|
*/
|
|
/** Interface Homme Machine du Blankuissance 4.
|
|
* Classe principale du paquet fr.blankoworld.plateau qui assure l'utilisation complète du jeu
|
|
*/
|
|
public class IhmPuissance4 extends JFrame {
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
/** <p>Un nouveau plateau de jeu ?</p> */
|
|
private PlateauPuissance4 p4 = new PlateauPuissance4();
|
|
|
|
/** <p>Un joueur de base que nous utiliserons dans le programme</p> */
|
|
private Joueurs joueur;
|
|
|
|
/** <p>Nombre de pions dans le jeu</p> */
|
|
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
|
|
*/
|
|
|
|
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();
|
|
}
|
|
});
|
|
}
|
|
|
|
class BoutonBlanko extends JButton {
|
|
|
|
public static final long serialVersionUID = 1L;
|
|
|
|
private GradientPaint degrade = new GradientPaint(100,100,Color.WHITE,170, 0,Color.BLACK);
|
|
private String couleur = new String("B");
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
// TODO Auto-generated method stub
|
|
new IhmPuissance4().setVisible(true);
|
|
|
|
}
|
|
|
|
}
|