Compare commits

..

33 Commits

Author SHA1 Message Date
65ffea7efa amélioration menu choix joueur : nom d'un joueur ne peut plus seulement contenir des espaces 2022-11-27 16:21:46 +01:00
d271b422fb changement de titre au reset 2022-11-26 11:38:35 +01:00
a945a9dac0 Bug affichage modal 2022-11-26 11:30:16 +01:00
8557cf27cd Mauvais titre : joueur 2 -> joueur 3 2022-11-21 12:42:36 +01:00
712a4f644c Import inutile 2022-11-21 12:10:29 +01:00
2221d1b5d6 Bug prochain joueur 2022-11-21 09:07:57 +01:00
1988d63733 Merge branch 'master' of https://dwarves.iut-fbleau.fr/gitiut/justiney/FIprojetAgile2022Groupe3B 2022-11-21 08:59:47 +01:00
martins
9e68723f91 commentaire Menu et Easter Egg 2022-11-17 12:40:29 +01:00
28d9248fc7 Couleur par défaut 2022-11-17 11:04:13 +01:00
700d7f2c52 Merge branch 'master' of https://dwarves.iut-fbleau.fr/gitiut/justiney/FIprojetAgile2022Groupe3B 2022-11-17 09:51:53 +01:00
c3711f917f Fin MAJ Javadoc dossier Puissance4 2022-11-17 09:49:52 +01:00
c9658f4c08 UTF8 2022-11-17 09:31:19 +01:00
d97c0b9e2d Bug couleur 2022-11-17 09:24:06 +01:00
ff568ee6f5 MAJ erreurs javadoc 2022-11-17 09:13:53 +01:00
99944c5bb3 Ajout bouton annuler pour le choix de la couleur 2022-11-17 09:06:22 +01:00
863f19f94c Merge branch 'master' of https://dwarves.iut-fbleau.fr/gitiut/justiney/FIprojetAgile2022Groupe3B 2022-11-12 17:28:43 +01:00
martins
1a368fda17 correction bug JOption dialog mauvais JContainer 2022-11-12 17:27:37 +01:00
martins
7efd94d3b1 ajout changement titre nb joeur 2022-11-12 17:25:09 +01:00
martins
58f3a9b722 changement affichage victoire Puissance3 2022-11-12 17:15:24 +01:00
a4fb1ee2c6 Utilisation des fonctions déjà existantes pour éviter la duplication de code 2022-11-12 13:09:09 +01:00
7cda7fdbdc Ajout possibilite de supprimer le survol en changeant la variable static Constants.DRAW_POSITION 2022-11-11 20:55:14 +01:00
01182a7f64 Lancement du jeu en arrière plan avec make run 2022-11-11 20:43:23 +01:00
2ced1215d8 Vérification des noms + un peu de javadoc 2022-11-11 20:40:36 +01:00
400e2e8f58 Vérification des couleurs choisies (fonction pas push jeudi et écrasée) 2022-11-11 20:23:40 +01:00
6672ba61ff Fix bug : mauvais comptage des points (ajout de point dans la fonction verifyWin supprimé) 2022-11-11 20:06:41 +01:00
d0a002d512 Mauvais nom dans makefile 2022-11-11 20:01:23 +01:00
d1ad747521 Fusion makefile 2022-11-11 20:00:08 +01:00
e688fb131a Vérification après la première victoire + regroupement de code dans fonctions 2022-11-11 19:59:23 +01:00
martins
35782200f8 Makefile 2022-11-11 18:31:08 +01:00
7a1d8aadac Merge branch 'master' of https://dwarves.iut-fbleau.fr/gitiut/justiney/FIprojetAgile2022Groupe3B 2022-11-10 18:55:09 +01:00
martins
ed281c2d75 Make 2022-11-10 14:24:12 +01:00
martins
f8e2cc7294 ok 2022-11-10 13:38:05 +01:00
d39148970e Bug changement de couleur 2022-11-10 13:09:41 +01:00
31 changed files with 604 additions and 241 deletions

View File

@ -1,5 +1,5 @@
@JAVAC_OPT = -implicit:none \
-d build -classpath "build" -sourcepath src
@JAVAC_OPT = -implicit:none -encoding UTF-8\
-d build -classpath "build:res/mariadb-client.jar" -sourcepath src
PACKAGE = fr.iutfbleau.projetAgile
PACKAGE_PATH = fr/iutfbleau/projetAgile
@ -24,7 +24,8 @@ Controller = build/$(PACKAGE_PATH)/Puissance4/Controller/GrilleMouseListener.cla
build/$(PACKAGE_PATH)/Puissance4/Controller/ResetGame.class
#BUT PAR DEFAUT
ArgileGames.jar : build/$(PACKAGE_PATH)/Main.class
ArgileGames.jar : build \
build/$(PACKAGE_PATH)/Main.class
@echo "Creating jar..."
@jar cfme ArgileGames.jar Manifest.txt $(PACKAGE_PATH).Main res/ -C build fr
@echo "Finished"
@ -51,7 +52,7 @@ build/$(PACKAGE_PATH)/Puissance4/Event/PlayerEvent.class : src/$(PACKAGE_PATH)/P
#------- Controleur ------
build/$(PACKAGE_PATH)/Menu/Controleur/ObservateurAccueil.class : src/$(PACKAGE_PATH)/Menu/Controller/ObservateurAccueil.java
build/$(PACKAGE_PATH)/Menu/Controller/ObservateurAccueil.class : src/$(PACKAGE_PATH)/Menu/Controller/ObservateurAccueil.java
@javac $(@JAVAC_OPT) $<
build/$(PACKAGE_PATH)/Puissance4/Controller/ResetGame.class : src/$(PACKAGE_PATH)/Puissance4/Controller/ResetGame.java
@ -131,9 +132,9 @@ build/$(PACKAGE_PATH)/Menu/View/BoutonsMenu.class : src/$(PACKAGE_PATH)/Menu/Vie
build/$(PACKAGE_PATH)/Menu/View/Menu.class : src/$(PACKAGE_PATH)/Menu/View/Menu.java \
build/$(PACKAGE_PATH)/Menu/Controller/ObservateurMenuSouris.class \
build/$(PACKAGE_PATH)/Menu/View/BoutonsMenu.class \
build/$(PACKAGE_PATH)/Menu/Controleur/ObservateurAccueil.class \
build/$(PACKAGE_PATH)/Menu/Controller/ObservateurFenetre.class \
build/$(PACKAGE_PATH)/Puissance4/LancementPuissance4.class
build/$(PACKAGE_PATH)/Menu/Controller/ObservateurAccueil.class \
build/$(PACKAGE_PATH)/Puissance4/LancementPuissance4.class
@javac $(@JAVAC_OPT) $<
@ -150,9 +151,18 @@ build/$(PACKAGE_PATH)/Puissance4/LancementPuissance4.class : src/$(PACKAGE_PATH)
build/$(PACKAGE_PATH)/Puissance4/Model/GrilleModel.class
@javac -implicit:none -d build -classpath "build:res/mariadb-client.jar" -sourcepath src $<
build/$(PACKAGE_PATH)/Jeu.class : src/$(PACKAGE_PATH)/Jeu.java
@javac $(@JAVAC_OPT) $<
build :
@mkdir build
@echo "Creating Folder"
# BUT FACTICES:
.PHONY: clear doc run
@ -162,8 +172,7 @@ doc :
@echo "Finished"
run: ArgileGames.jar
@java -jar ArgileGames.jar
@java -jar ArgileGames.jar&
clean :
@rm -rf build/*

View File

@ -1,10 +1,28 @@
package fr.iutfbleau.projetAgile;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.Color;
import fr.iutfbleau.projetAgile.Menu.View.Menu;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
public class Main {
public static void main(String[] args) {
UIManager.put("Button.background", Constants.RED);
UIManager.put("Button.foreground", Color.WHITE);
UIManager.put("OptionPane.background", Constants.BACKGROUND_COLOR);
UIManager.put("Panel.background", Constants.BACKGROUND_COLOR);
UIManager.put("Panel.foreground", Color.WHITE);
UIManager.put("Label.background", Constants.BACKGROUND_COLOR);
UIManager.put("Label.foreground", Color.WHITE);
UIManager.put("TextPane.foreground", Color.WHITE);
UIManager.put("OptionPane.messageForeground", Color.WHITE);
UIManager.put("RadioButton.background", Constants.BACKGROUND_COLOR);
UIManager.put("RadioButton.foreground", Color.WHITE);
UIManager.put("Button.focus", Constants.RED);
UIManager.put("Button.border", new EmptyBorder(5,10,5,10));
JFrame frame = Menu.getFrame();
JPanel menu=Menu.InitMenu();
frame.add(menu, Menu.MENU);

View File

@ -1,18 +1,26 @@
package fr.iutfbleau.projetAgile.Menu.Controller;
import java.awt.event.*;
import java.awt.Component;
import javax.swing.JOptionPane;
import fr.iutfbleau.projetAgile.Menu.View.Menu;
/**
* Class de l'observateur du Bouton Acceuil des Jeux
*/
public class ObservateurAccueil implements ActionListener{
private Component comp;
public ObservateurAccueil(Component parent){
this.comp=parent;
}
/**
* Fonction lors du clique
* retourne au menu après confirmation
*/
@Override
public void actionPerformed(ActionEvent evenement){
int confirmation = JOptionPane.showConfirmDialog(this.comp, "Etes-vous sûr de vouloir retourner au menu ?", "Menu", JOptionPane.YES_NO_OPTION);
if(confirmation == 1) return;
Menu.show(Menu.MENU);
//On affiche la confirmation en bloquant la fentre
int confirmation = JOptionPane.showConfirmDialog(null, "Etes-vous sûr de vouloir retourner au menu ?", "Menu", JOptionPane.YES_NO_OPTION);
//si c'est ok on retourne au Menu
if(confirmation == JOptionPane.YES_OPTION){
Menu.show(Menu.MENU);
}
}
}

View File

@ -5,32 +5,74 @@ import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.event.WindowEvent;
/**
* Class de l'observateur de la fenetre
* Utiliser pour avoir une fentre modal pour confirmer la fermeture
*/
public class ObservateurFenetre implements WindowListener{
//il doit connaitre la fenetre pour faire une fenetre modale
private JFrame fenetre;
/**
* Constructeur
* @param fenetre0 la fentre qui va instancier la fentre modale
*/
public ObservateurFenetre(JFrame fenetre0){
this.fenetre=fenetre0;
}
/**
* fentre au premier plan
* */
@Override
public void windowActivated(WindowEvent evenement){
} // premier plan
}
/**
* Aprèes fermeture de la fentre
* */
@Override
public void windowClosed(WindowEvent evenement){
} // après fermeture
}
/**
* Avant fermeture de la fentre
* On affiche la fentre Modale
*/
@Override
public void windowClosing(WindowEvent evenement){
//On demande la Confirmation avec un JOptionPane
int confirmation = JOptionPane.showConfirmDialog(this.fenetre.getContentPane(), "Etes-vous sûr de vouloir fermer la fenetre ?", "Quitter", JOptionPane.YES_NO_OPTION);
if(confirmation != JOptionPane.OK_OPTION) return;
this.fenetre.dispose();
} // avant fermeture
//Si c'est ok
if(confirmation == JOptionPane.OK_OPTION){
//on ferme la fentre
this.fenetre.dispose();
}
}
/**
* Passage en arrière plan
*/
@Override
public void windowDeactivated(WindowEvent evenement){
} // arrière-plan
}
/**
* Restauration de la fentre
*/
@Override
public void windowDeiconified(WindowEvent evenement){
} // restauration
}
/**
* Minimisation de la fentre
*/
@Override
public void windowIconified(WindowEvent evenement){
} // minimisation
}
/**
* Après Ouverture de la fentre
*/
@Override
public void windowOpened(WindowEvent evenement){
} // après ouverture
}
}

View File

@ -5,34 +5,74 @@ import java.awt.event.*;
import fr.iutfbleau.projetAgile.Menu.View.*;
/**
* Observateur des Boutons du Menu
* Observateur des Boutons du Menu (des Jeu)
*/
public class ObservateurMenuSouris implements MouseListener{
/**
* Constructeur
* Fonction s'effectuant au clique
* lance le Jeu si il est Dispnnible
*/
public ObservateurMenuSouris(){
}
@Override
public void mouseClicked(MouseEvent evenement){
//on incrémente le nombre de clique
Menu.addClique();
//On récupère le Composant
BoutonsMenu bout=(BoutonsMenu) (evenement.getComponent());
//Si c'est le jeu PUISSANCE 4
if(bout.getPath()==Menu.PUISSANCE_4){
//On dis au Menu de'afficher le Jeu PUISSANCE 4
Menu.show(Menu.PUISSANCE_4);
return;
}
} // un bouton cliqué
//Les autre jeu suiverons le même fonctionnement que PUISSANCE 4
}
/**
* Fonction quand la souris etre dans la zone du JComponent
* pour inquer au joueur le survol
*/
@Override
public void mouseEntered(MouseEvent evenement){
//On récupere le composant
BoutonsMenu bout=(BoutonsMenu) (evenement.getComponent());
//on lui indique le survol
bout.setSurvol(true);
} // debut du survol
}
/**
* Fonction quand la souris quite la zone du JComponent
* pour inquer au joueur le survol
*/
@Override
public void mouseExited(MouseEvent evenement){
//on récupère le Composant
BoutonsMenu bout=(BoutonsMenu) (evenement.getComponent());
//on lui inqique le survol
bout.setSurvol(false);
} // fin du survol
}
/**
* Fonction lorsque on reste appuyer sur la Souris
* donne l'impression de clique
*/
@Override
public void mousePressed(MouseEvent evenement){
//On récupère le Composant
BoutonsMenu bout=(BoutonsMenu) (evenement.getComponent());
//Pour augmenter l'impression de clique
//On met le survol a false
//pour diminuer la taille du Composant
bout.setSurvol(false);
} // un bouton appuyé
}
/**
* Fonction lorsque on relache la Souris
* donne l'impression de clique
* */
@Override
public void mouseReleased(MouseEvent evenement){
//On récupère le Composant
BoutonsMenu bout=(BoutonsMenu) (evenement.getComponent());
//Pour augmenter l'impression de clique
//On met le survol a false
//pour diminuer la taille du Composant
bout.setSurvol(true);
} // un bouton relâché
}
}

View File

@ -0,0 +1,5 @@
/**
* fr.iutfbleau.projetAgile.Menu groupe toutes les classes qui controllent le menu (Listener)
*/
package fr.iutfbleau.projetAgile.Menu.Controller;
//Fichier vide pour la javadoc

View File

@ -53,26 +53,36 @@ public class BoutonsMenu extends JComponent{
}
// maintenant on dessine ce que l'on veut
String dispo;
//Si le jeu est disponnible
if(this.disponibiliter==true){
//on met la couleur et le String Correspondant
secondPinceau.setColor(new Color(255,0,0,200));
dispo="Disponible";
//Autrement
}else{
//on met une autre couleur et le String Correspondant
secondPinceau.setColor(new Color(100,100,100,200));
dispo="Indisponible";
}
//Si le Menu est survoler:
if(this.survol==false){
//On draw l'image un peu plus Gros pour augmenter le resentis de survol
secondPinceau.drawImage(this.img, 5, 5, this.getWidth()-10, this.getHeight()-10, this);
secondPinceau.fillRoundRect(5, 5, this.getWidth()-10, this.getHeight()-10, this.getWidth()/100*9, this.getHeight()/100*29);
//Autrement
}else{
//On draw l'image plus petite
secondPinceau.drawImage(this.img, 0, 0, this.getWidth(), this.getHeight(), this);
secondPinceau.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), this.getWidth()/100*9, this.getHeight()/100*29);
}
//On met du blanc pour le titre
secondPinceau.setColor(new Color(255, 255, 255));
//On draw le titre du jeu dans une taille assez grosse et centrer
secondPinceau.setFont(new Font(Font.SANS_SERIF, Font.BOLD, (this.getWidth()/10)));
FontMetrics metrics = secondPinceau.getFontMetrics(secondPinceau.getFont());
secondPinceau.drawString(this.path.toUpperCase(), (this.getWidth()/2-metrics.stringWidth(this.path.toUpperCase())/2), (this.getHeight()-metrics.getHeight())/3+metrics.getAscent());
//DISPO OU PAS
//DISPO OU PAS: On l'affiche aussi
secondPinceau.setFont(new Font(Font.SANS_SERIF, Font.BOLD, (this.getWidth()/20)));
metrics = secondPinceau.getFontMetrics(secondPinceau.getFont());
secondPinceau.drawString(dispo, (this.getWidth()/2-metrics.stringWidth(dispo)/2), (this.getHeight()-metrics.getHeight())/3*2+metrics.getAscent());

View File

@ -4,30 +4,45 @@ import java.awt.*;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import fr.iutfbleau.projetAgile.Jeu;
import fr.iutfbleau.projetAgile.Menu.Controller.*;
import fr.iutfbleau.projetAgile.Puissance4.LancementPuissance4;
import java.awt.event.WindowListener;
import java.util.concurrent.CancellationException;
/**
* Class Abstraite mais static
* Pouvant donc etre utiliser sans être connu
* elle permet de créer le Menu
*/
public abstract class Menu{
public static String PUISSANCE_4="puissance4";
public static String MENU="Menu";
/* Chaque Jeu aura sa variable final static ainsi que le menu
Ces variables sont utiliser pour changer de jeu ou retourner au menu avec la foction
show*/
public final static String PUISSANCE_4="puissance4";
public final static String MENU="Menu";
private static JFrame frame=new JFrame("Argile");
private static CardLayout cd=new CardLayout();
private static String JEU="Jeu";
private static int cliqueCount=0;
/**
* methode static pour avoir le JPanel Affichant le Menu
* @return un JPanel instancier avec les composant du menu
*
*/
public static JPanel InitMenu(){
//On initialise le JPanel
JPanel p=new JPanel();
p.setBackground(new Color(31,31,31));
GridBagLayout gbl=new GridBagLayout();
p.setLayout(gbl);
//On utilisera un GridBagLayout pour plus de liberter dans le positionnement
//des éléments du menu
GridBagConstraints gbc=new GridBagConstraints();
//On positionne le titre
gbc.gridx=0;
gbc.gridy=0;
gbc.gridwidth=3;
@ -37,14 +52,18 @@ public abstract class Menu{
gbc.weightx=2;
gbc.weighty=0;
gbc.insets=new Insets(0,10,0,10);
//on créer le titre
JLabel titre=new JLabel("ARGILE GAMES");
titre.setHorizontalAlignment(JLabel.CENTER);
titre.setForeground(new Color(255,255,255));
titre.setBackground(new Color(55,55,55));
titre.setFont(new Font("Serif" ,Font.BOLD, 50));
//on set sa préferedSize car le GridBagLayout en tiendra compte
titre.setPreferredSize(new Dimension(400,200));
//On ajoute le titre
p.add(titre, gbc);
//On créer les élément du jeu(JComponent)
BoutonsMenu puissance_4=new BoutonsMenu(Menu.PUISSANCE_4, true);
BoutonsMenu echecs=new BoutonsMenu("echecs", false);
BoutonsMenu dames=new BoutonsMenu("dames", false);
@ -57,6 +76,7 @@ public abstract class Menu{
BoutonsMenu minecraft=new BoutonsMenu("minigolf", false);
BoutonsMenu puzzle=new BoutonsMenu("puzzle", false);
//On y ajoute leurs observateurs
ObservateurMenuSouris obser=new ObservateurMenuSouris();
puissance_4.addMouseListener(obser);
echecs.addMouseListener(obser);
@ -70,6 +90,8 @@ public abstract class Menu{
minecraft.addMouseListener(obser);
puzzle.addMouseListener(obser);
//on les ajoute au panneau en précisant leurs positions avec le GridBagConstraints
p.add(puissance_4, Menu.GridBagConstraintsRetour(0, 1));
p.add(echecs, Menu.GridBagConstraintsRetour(1, 1));
p.add(dames, Menu.GridBagConstraintsRetour(2, 1));
@ -81,12 +103,15 @@ public abstract class Menu{
p.add(CoD, Menu.GridBagConstraintsRetour(0, 3));
p.add(minecraft, Menu.GridBagConstraintsRetour(1, 3));
p.add(puzzle, Menu.GridBagConstraintsRetour(2, 3));
//On a fini, on retourne le panneau
return p;
}
/**
* methode priver pour calculer la positions des composants
*
* comme il se répartisent en ligne et collonne les arguments devant être connu sont donc
* la ligne et la collonne du composant
* @return le GridBagConstraints correspondants aux arguments
* @param collonne sa place dans la collonne
* @param ligne sa ligne
@ -102,6 +127,7 @@ public abstract class Menu{
gbc.weightx=1;
gbc.weighty=1;
Insets marge=new Insets(0,0,0,0);
//La Marge est différente en Fonction de la position du composant
if(collonne==0){
marge.set(5, 50, 5, 5);
}
@ -129,6 +155,7 @@ public abstract class Menu{
*
* @param g
* le string de la carte correspondant
* devant être un String de la class Menu
*/
public static void show(String g)
@ -141,32 +168,50 @@ public abstract class Menu{
if(g==Menu.PUISSANCE_4){
try{
jeu = new LancementPuissance4(Menu.frame);
}catch(Exception e){
}catch(CancellationException e){
return;
}
}
jeu.accueilButton(new ObservateurAccueil(jeu.getPanel()));
jeu.accueilButton(new ObservateurAccueil());
Menu.frame.add(jeu.getPanel(), Menu.JEU);
Menu.cd.show(Menu.frame.getContentPane(), Menu.JEU);
}
}
}
/**
* getter pouvant initialiser la JFrame
* getter pouvant initialiser la JFrame si elle n'a jamais été utiliser
*
* @return
* la fenetre
*/
public static JFrame getFrame(){
//Si la JFrame n'a pas le layout désirer
//Elle n'a donc pas été initialiser
if(Menu.frame.getLayout()!=Menu.cd){
//On l'initialise
Menu.frame.setLayout(Menu.cd);
Menu.frame.setMinimumSize(new Dimension(1280,720));
Menu.frame.setLocation(200,200);
}
//Si la fenetre n'as pas de WindowListeners
WindowListener[] wl=Menu.frame.getWindowListeners();
if(wl.length==0){
//On l'initalise
Menu.frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
Menu.frame.addWindowListener(new ObservateurFenetre(Menu.frame));
}
//finalement on retourne la Fenetre
return Menu.frame;
}
/**
* Methode comptant les clique effectuer sur les Composant du menu (Jeu)
* elle est juste un petit easterEgg affichant un bravo tout les 100 clique
*/
public static void addClique(){
Menu.cliqueCount++;
if(Menu.cliqueCount%100==0){
JOptionPane.showMessageDialog(frame, "Bravo vous avez cliquer "+String.valueOf(Menu.cliqueCount)+" fois", "Bravo !", JOptionPane.INFORMATION_MESSAGE);
}
}
}

View File

@ -0,0 +1,5 @@
/**
* fr.iutfbleau.projetAgile.Menu groupe toutes les classes de la vue du menu
*/
package fr.iutfbleau.projetAgile.Menu.View;
//Fichier vide pour la javadoc

View File

@ -1,6 +1,7 @@
package fr.iutfbleau.projetAgile.Puissance4.Controller;
import fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@ -19,16 +20,28 @@ public class ColorActionListener implements ActionListener{
}
/**
* Exécuté lors de l'appuie sur le bouton confirmé. Vérifie si les entrées de l'utilisateur sont valides, puis valide sont choix
* Exécuté lors de l'appuie sur le bouton confirmé. Vérifie si les entrées de l'utilisateur sont valides, puis valide son choix
* @see fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog#isNameValid()
* @see fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog#isColorValid()
* @see fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog#setConfirm(boolean b)
*/
@Override
public void actionPerformed(ActionEvent e) {
if(this.dialog.isColorValid() && this.dialog.isNameValid()) {
this.dialog.setConfirm(true);
if(e.getActionCommand().equals(Constants.CONFIRM)) {
if(this.dialog.isColorValid()) {
if(this.dialog.isNameValid()) {
this.dialog.setConfirm(true);
this.dialog.setVisible(false);
}
}
else {
this.dialog.repaint();
}
}
else {
this.dialog.setConfirm(false);
this.dialog.setVisible(false);
}
}
}

View File

@ -8,25 +8,35 @@ import javax.swing.event.ChangeListener;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
/**
* Classe inutile, peut être remplacée par l'appuie sur le bouton confirmé (A changer Jeudi)
* Listener des changements de couleurs pour chaque joueur d'un {@link fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog ColorChooserDialog}
*/
public class ColorChooserListener implements ChangeListener {
private JComponent composant;
private int player;
/**
* Constructeur
* @param c le composant à repaint
* @param player le joueur dont la couleur doit être changé
*/
public ColorChooserListener(JComponent c, int player) {
this.composant = c;
this.player = player;
}
/**
* Couleur du pion du joueur change en fonction de la couleur sélectionnée
* @param e
* @see #ColorChooserListener(JComponent, int)
*/
@Override
public void stateChanged(ChangeEvent e) {
if(e.getSource() instanceof ColorSelectionModel) {
ColorSelectionModel chooser = (ColorSelectionModel) e.getSource();
if(this.player == Constants.PLAYER_ONE)
Constants.PLAYER_ONE_COLOR = chooser.getSelectedColor();
else if(this.player == Constants.PLAYER_THREE)
else if(this.player == Constants.PLAYER_TWO)
Constants.PLAYER_TWO_COLOR = chooser.getSelectedColor();
else
Constants.PLAYER_THREE_COLOR = chooser.getSelectedColor();

View File

@ -24,8 +24,10 @@ public class GrilleMouseListener extends MouseInputAdapter{
*/
@Override
public void mouseMoved(MouseEvent e) {
if(Constants.DRAW_POSITION)
if(Constants.DRAW_POSITION) {
this.controller.hoverGrille(e.getX());
}
}
/**

View File

@ -9,20 +9,24 @@ public class ModelEventListener implements GridChangedListener {
/**
* Constructeur
* @param p
* @param p le panneau du puissance 4
* @see fr.iutfbleau.projetAgile.Puissance4.View.Puissance4Panel
*/
public ModelEventListener(Puissance4Panel p) {
this.panel = p;
}
/**
* Ajoute un pion à l'emplacement modifié dans la grille
* Modifie la vue du pion à l'emplacement modifié dans la grille
*/
@Override
public void gridChanged(GridEvent e) {
this.panel.addPlayerPiece(e.getColumn(), e.getRow(), e.getPlayer());
}
/**
* Modifie la vue lorsque le status de la partie change
*/
@Override
public void statusChanged(StatusEvent e) {
this.panel.changeLabel(e.getPlayerTurn());
@ -30,8 +34,11 @@ public class ModelEventListener implements GridChangedListener {
this.panel.setGameStatus(e.getStatus(), e.getPlayerTurn(), e.getPlayerOneScore(), e.getPlayerTwoScore(), e.getPlayerThreeScore());
}
/**
* Modifie la vue lorsque un joueur gagne (seulement si le nombre de joueur est supérieur à 2)
*/
@Override
public void playerRemove(PlayerEvent e){
this.panel.RemovePlayer(e.getJ(), e.getGrille());
public void playerWin(PlayerEvent e){
this.panel.playerWin(e.getJ());
}
}

View File

@ -43,11 +43,18 @@ public class Puissance4Controller {
* @see fr.iutfbleau.projetAgile.Puissance4.Controller.Puissance4Controller#changeName(String, String)
*/
public void initPanel() {
this.panel.init();
this.panel.setPlayerNumber(this.modele.getPlayerNumber());
if(this.modele.getPlayerThreeName()!=null){
//Cas ou il y a trois joeur ou initialise le jeu en lui précisant bien le titre
this.panel.init("PUISSANCE 3");
}else{
this.panel.init("PUISSANCE 4");
}
this.panel.changeHoverColor(this.modele.getPlayerTurn());
this.panel.changeLabel(this.modele.getPlayerTurn());
this.panel.changeScore(this.modele.getPlayerOneScore(), this.modele.getPlayerTwoScore(), this.modele.getPlayerThreeScore());
if(this.modele.getPlayerNumber() == 2)
this.panel.changeScore(this.modele.getPlayerOneScore(), this.modele.getPlayerTwoScore());
else
this.panel.changeScore(this.modele.getPlayerOneScore(), this.modele.getPlayerTwoScore(), this.modele.getPlayerThreeScore());
}
/**
@ -65,6 +72,7 @@ public class Puissance4Controller {
this.modele.reset();
this.panel.changeHoverColor(this.modele.getPlayerTurn());
this.panel.changeLabel(this.modele.getPlayerTurn());
this.panel.resetTitle();
}
/**
@ -73,7 +81,7 @@ public class Puissance4Controller {
* @see fr.iutfbleau.projetAgile.Puissance4.Model.GrilleModel#verifyColumn(int)
*/
public void verifyColumn(int x) {
if(this.modele.getGameStatus() == GameStatus.PLAYING || this.modele.getGameStatus() == GameStatus.FIRST) {
if(this.modele.getGameStatus() == GameStatus.PLAYING) {
int column = (x * this.modele.getColumn() / grille.getWidth());
this.modele.verifyColumn(column);
}
@ -85,7 +93,7 @@ public class Puissance4Controller {
* Si x est égal à -1 efface le survol
*/
public void hoverGrille(int x) {
if(this.modele.getGameStatus() == GameStatus.PLAYING || this.modele.getGameStatus() == GameStatus.FIRST) {
if(this.modele.getGameStatus() == GameStatus.PLAYING) {
if(x == -1) {
this.grille.hover(-1); //Clean
return;
@ -128,6 +136,7 @@ public class Puissance4Controller {
* Change le nom des joueurs dans le modèle et la vue
* @param J1 le nom du joueur 1
* @param J2 le nom du joueur 2
* @param J3 le nom du joueur 3
*/
public void changeName(String J1, String J2, String J3) {
this.modele.setPlayerOneName(J1);

View File

@ -9,10 +9,21 @@ public class ResetGame implements ActionListener {
*/
private Puissance4Controller controller;
/**
* Création du listener du bouton reset
* @param p
*/
public ResetGame(Puissance4Controller p){
this.controller = p;
}
/**
* Appelle la fonction ResetGame
* @param e
* @see #ResetGame(Puissance4Controller)
*/
@Override
public void actionPerformed(ActionEvent e) {
this.controller.reset();

View File

@ -0,0 +1,5 @@
/**
* fr.iutfbleau.projetAgile.Puissance4.Controller groupe toutes les classes qui controllent les évènements (Listeners) du Puissance 4
*/
package fr.iutfbleau.projetAgile.Puissance4.Controller;
//Fichier vide pour la javadoc

View File

@ -55,6 +55,7 @@ public abstract class AbstractGridInitiater {
* @param playerTurn Le tour du joueur
* @param playerOneScore Le score du joueur 1
* @param playerTwoScore Le score du joueur 2
* @param playerThreeScore Le score du joueur 3
*/
protected void fireStatusChanged(GameStatus status, int playerTurn, int playerOneScore, int playerTwoScore, int playerThreeScore) {
StatusEvent event = null;
@ -65,13 +66,16 @@ public abstract class AbstractGridInitiater {
}
}
protected void firePlayerChanged(int playerRemove, int[][] grille){
/**
* Notifie tous les listeners lorsqu'un joueur gagne (supérieur à 2 joueurs)
* @param playerRemove le joueur qui a gagné
*/
protected void firePlayerWin(int playerRemove){
PlayerEvent event=null;
for(GridChangedListener listener : getGridListeners()) {
if(event == null)
event= new PlayerEvent(playerRemove, grille);
listener.playerRemove(event);
event= new PlayerEvent(playerRemove);
listener.playerWin(event);
}
}
}

View File

@ -19,9 +19,9 @@ public interface GridChangedListener extends EventListener{
void statusChanged(StatusEvent e);
/**
* Méthode invoqué lors de la suppréssion d'un joueur
* Méthode invoqué lorsqu'un joueur gagne
* @param e evenement du joueur a supprimé
*/
void playerRemove(PlayerEvent e);
void playerWin(PlayerEvent e);
}

View File

@ -5,17 +5,22 @@ package fr.iutfbleau.projetAgile.Puissance4.Event;
*/
public class PlayerEvent {
private int J;
private int[][] grille;
public PlayerEvent(int j0, int[][] grille0){
/**
* Créer un évènement
* @param j0
*/
public PlayerEvent(int j0){
this.J=j0;
this.grille=grille0;
}
/**
* Retourne le joueur
* @return le joueur
*/
public int getJ() {
return J;
}
public int[][] getGrille() {
return grille;
}
}

View File

@ -0,0 +1,5 @@
/**
* fr.iutfbleau.projetAgile.Puissance4.Event groupe toutes les classes représentant un évènement personnalisé du Puissance 4
*/
package fr.iutfbleau.projetAgile.Puissance4.Event;
//Fichier vide pour la javadoc

View File

@ -5,10 +5,11 @@ import fr.iutfbleau.projetAgile.Puissance4.Controller.Puissance4Controller;
import fr.iutfbleau.projetAgile.Puissance4.View.Grille;
import fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog;
import fr.iutfbleau.projetAgile.Puissance4.Model.GrilleModel;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import org.mariadb.jdbc.*;
import java.sql.Statement;
import java.util.concurrent.CancellationException;
@ -30,6 +31,7 @@ public class LancementPuissance4 implements Jeu{
* @throws CancellationException Renvoie une exception si les utilisateurs annule le lancement de la partie
*/
public LancementPuissance4(JFrame fenetre) throws CancellationException{
String J1 = null;
String J2 = null;
String J3 = null;
@ -39,10 +41,11 @@ public class LancementPuissance4 implements Jeu{
ButtonGroup buttons = new ButtonGroup();
buttons.add(twoPlayer);
buttons.add(threePlayer);
buttons.setSelected(twoPlayer.getModel(), true);
Object[] message = {
"Combien de joueurs ?", twoPlayer, threePlayer
};
int choix = JOptionPane.showConfirmDialog(fenetre, message, "Entrez le nombre de joueur", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
int choix = JOptionPane.showConfirmDialog(fenetre, message, "Entrez le nombre de joueurs", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if(choix != JOptionPane.OK_OPTION) {
throw new CancellationException("User cancelled");
}
@ -52,6 +55,7 @@ public class LancementPuissance4 implements Jeu{
else
playerNumber = 3;
Constants.resetColor();
ColorChooserDialog chooser = new ColorChooserDialog(fenetre, true, playerNumber);
if (chooser.getChoice()) {
J1 = chooser.getPlayerOneName();
@ -91,7 +95,11 @@ public class LancementPuissance4 implements Jeu{
return this.P4.getPanel();
}
public void sendToDatabase(int playerNumber) {
/**
* Met à joueur le nombre de joueur choisi dans la base de données
* @param playerNumber le nombre de joueur choisi
*/
private void sendToDatabase(int playerNumber) {
try {
Class.forName("org.mariadb.jdbc.Driver"); //Verification du pilote

View File

@ -21,10 +21,12 @@ public class GrilleModel extends AbstractGridInitiater{
private int playerOneScore;
private int playerTwoScore;
private int playerThreeScore;
private LinkedList<Integer> tour;
private LinkedList<Integer> playersList;
private int playerNumber;
/**
* Crée le modèle et l'initialise avec des cases vides
* @param playerNumber le nombre de joueurs
*/
public GrilleModel(int playerNumber) {
super();
@ -33,34 +35,11 @@ public class GrilleModel extends AbstractGridInitiater{
this.grille = new int[this.column][this.row];
this.playerOneScore = 0;
this.playerTwoScore = 0;
this.playerThreeScore = 0;
this.tour = new LinkedList<Integer>();
this.tour.add(Constants.PLAYER_ONE);
this.tour.add(Constants.PLAYER_TWO);
if(playerNumber==3){
this.tour.add(Constants.PLAYER_THREE);
}
this.playerNumber=playerNumber;
this.reset();
}
/**
* Crée le modèle et l'initialise avec des les cases du tableau donné en arguments
*/
public GrilleModel(int[][] tab, int playerNumber) {
//Faire un test pour le nombre de colonnes/lignes
super();
this.column = Constants.COLUMN_COUNT;
this.row = Constants.ROW_COUNT;
this.grille = tab;
this.playerOneScore = 0;
this.playerTwoScore = 0;
this.playerThreeScore = 0;
this.tour=new LinkedList<Integer>();
this.tour.add(Constants.PLAYER_ONE);
this.tour.add(Constants.PLAYER_TWO);
if(playerNumber==3){
this.tour.add(Constants.PLAYER_THREE);
this.playerThreeScore = -1;
this.playersList = new LinkedList<Integer>();
this.resetList();
if(playerNumber == 3){
this.playerThreeScore = 0;
}
this.playerNumber=playerNumber;
this.reset();
@ -75,17 +54,29 @@ public class GrilleModel extends AbstractGridInitiater{
this.grille[i][j] = Constants.EMPTY_PLAYER;
}
}
this.tour.clear();
this.tour.add(Constants.PLAYER_ONE);
this.tour.add(Constants.PLAYER_TWO);
if(this.playerNumber==3){
this.tour.add(Constants.PLAYER_THREE);
}
this.resetList();
this.switchPlayer();
this.piecePlayed = 0;
this.setPartyStatus(GameStatus.PLAYING);
}
/**
* Remet la liste des joueurs dans l'ordre d'origine
*/
private void resetList() {
this.playersList.clear();
this.playersList.add(Constants.PLAYER_ONE);
this.playersList.add(Constants.PLAYER_TWO);
if(this.playerNumber==3){
this.playersList.add(Constants.PLAYER_THREE);
}
}
/**
* Ajoute un pion dans la grille
* @param column colonne de la grille
* @param row ligne de la grille
*/
private void addPiece(int column, int row) {
grille[column][row] = this.playerTurn;
fireGridChanged(column, row, this.playerTurn);
@ -93,16 +84,22 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Ajoute un pion dans une colonne si elle n'est pas complète, met à jour le status de la partie et change le tour du joueur si nécessaire
* Ajoute un pion dans une colonne si elle n'est pas complète, met à jour le status de la partie et change le playersList du joueur si nécessaire
* @param column La colonne dans laquelle ajouter le pion
*/
public void verifyColumn(int column) {
for (int row = this.row - 1; row >= 0; row--) {
if (grille[column][row] == Constants.EMPTY_PLAYER) {
this.addPiece(column, row);
if(!this.verifyWin(column, row)){
this.switchPlayer();
if(this.verifyWin(column, row, this.playerTurn)){
if(this.playersList.size() > 2){
this.removePlayer();
} else{
this.setPartyStatus(GameStatus.WIN);
}
return;
}
this.switchPlayer();
this.verifyDraw();
return;
}
@ -110,22 +107,62 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Supprime de la liste le joueur qui vient de gagner
*/
private void removePlayer(){
this.increaseScore();
this.removePlayerPion();
this.firePlayerWin(this.playerTurn);
this.playersList.pollLast();
this.switchPlayer();
this.verifyNewWin();
}
/**
* Vérifie si tous les joueurs ont gagnés lors du passage de 3 à 2 joueurs
*/
private void verifyNewWin() {
boolean verifyFirstWin = this.verifyWinAll(this.playerTurn);
this.switchPlayer();
boolean verifySecondWin = this.verifyWinAll(this.playerTurn);
if(verifyFirstWin && verifySecondWin) {
this.setPartyStatus(GameStatus.DRAW);
}
else if(verifyFirstWin || verifySecondWin) {
if(verifyFirstWin)
switchPlayer();
this.setPartyStatus(GameStatus.WIN);
}
switchPlayer();
}
/**
* Vérifie la grille en fonction de la couleur du pion
* @param playerColor joueur associé à une couleur
*/
public boolean verifyWinAll(int playerColor) {
for(int y = 0; y < this.column; y++) {
for(int x = this.row - 1; x >= 0; x--) {
if(this.grille[y][x] == playerColor)
if(verifyWin(y, x, playerColor))
return true;
}
}
return false;
}
/**
* Vérifie si le jeton qui vient d'être joué termine la partie
* @param column La colonne du pion qui vient d'être joué
* @param row La ligne du pion qui vient d'être joué
* @return Retourne true si le jeu est fini
* @return retourne true si le jeu est fini
*/
private boolean verifyWin(int column, int row) {
int playerColor = this.playerTurn;
private boolean verifyWin(int column, int row, int playerColor) {
int diagonalColumn = column;
int diagonalRow = row;
//Vérification horizontal et vertical
if(verifyAlignedPiece(column, 0, 0, 1, playerColor) || verifyAlignedPiece(0, row, 1, 0, playerColor)) {
if(this.tour.size()==3){
this.Player3();
}else{
this.setPartyStatus(GameStatus.WIN);
}
return true;
}
@ -135,11 +172,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
//Vérification diagonale haut à gauche -> bas à droite
if(verifyAlignedPiece(diagonalColumn, diagonalRow, 1, 1, playerColor)) {
if(this.tour.size()==3){
this.Player3();
}else{
this.setPartyStatus(GameStatus.WIN);
}
return true;
}
@ -152,52 +185,27 @@ public class GrilleModel extends AbstractGridInitiater{
//Vérification diagonale haut à droite -> bas à gauche
if(verifyAlignedPiece(diagonalColumn, diagonalRow, -1, 1, playerColor)) {
if(this.tour.size()==3){
this.Player3();
}else{
this.setPartyStatus(GameStatus.WIN);
}
return true;
}
return false;
}
private void Player3(){
switch(this.playerTurn){
case Constants.PLAYER_ONE:
this.playerOneScore++;
break;
case Constants.PLAYER_TWO:
this.playerTwoScore++;
break;
case Constants.PLAYER_THREE:
this.playerThreeScore++;
break;
}
this.fireStatusChanged(GameStatus.FIRST, playerTurn, playerOneScore, playerTwoScore, playerThreeScore);
this.removePlayerPion();
this.firePlayerChanged(this.playerTurn, this.grille);
this.tour.pollLast();
this.switchPlayer();
}
/**
* Retourne true si 4 jetons de la même couleur ou plus sont alignés
* renvoie true si 4 jetons de la même couleur ou plus sont alignés
* @param numColumn La colonne commencer
* @param numRow La ligne commencer
* @param columnOffset l'offset de déplacement vertical
* @param rowOffset l'offset de déplacement horizontal
* @param playerColor La couleur du joueur (entier)
* @return Retourne true si 4 jetons ou plus sont alignés
* @return renvoie true si 4 jetons ou plus sont alignés
*/
private boolean verifyAlignedPiece(int numColumn, int numRow, int columnOffset, int rowOffset, int playerColor) {
int couleur = playerColor;
int max = 0;
int compteur = 0;
if(this.tour.size() == 2)
if(this.playersList.size() == 2)
max = Constants.ALIGNED_NUMBER_TWO;
else
max = Constants.ALIGNED_NUMBER_THREE;
@ -215,20 +223,23 @@ public class GrilleModel extends AbstractGridInitiater{
return false;
}
/**
* Vérifie s'il y a une égalité
*/
private void verifyDraw() {
if(this.piecePlayed >= this.column * this.row)
this.setPartyStatus(GameStatus.DRAW);
}
/**
* Change le tour du joueur et notifie tous les listeners
* Change le playersList du joueur et notifie tous les listeners
*/
public void switchPlayer() {
this.playerTurn=(int)this.tour.pollFirst();
this.tour.add((Integer)this.playerTurn);
this.playerTurn=(int)this.playersList.remove();
this.playersList.add((Integer)this.playerTurn);
fireStatusChanged(this.gameStatus, this.playerTurn, this.playerOneScore, this.playerTwoScore, this.playerThreeScore);
}
/**
* Change le status de la partie et notifie tous les listeners
* @param gameStatus le status de la partie
@ -236,51 +247,65 @@ public class GrilleModel extends AbstractGridInitiater{
public void setPartyStatus(GameStatus gameStatus) {
this.gameStatus = gameStatus;
if(gameStatus == GameStatus.WIN) {
if(this.playerTurn == Constants.PLAYER_ONE)
playerOneScore++;
else if(this.playerTurn == Constants.PLAYER_TWO)
playerTwoScore++;
else
playerThreeScore++;
this.increaseScore();
}
fireStatusChanged(this.gameStatus, this.playerTurn, this.playerOneScore, this.playerTwoScore, this.playerThreeScore);
}
/**
* Augmente le score du joueur victorieux
*/
private void increaseScore() {
if(this.playerTurn == Constants.PLAYER_ONE)
playerOneScore++;
else if(this.playerTurn == Constants.PLAYER_TWO)
playerTwoScore++;
else
playerThreeScore++;
}
/**
* retire les pions du joueur qui viens de gagner
*/
private void removePlayerPion(){
for(int i=0; i<this.grille.length; i++){
for(int t=0; t<this.grille[i].length; t++){
if(this.grille[i][t] == this.playerTurn ){
this.dropColumn(this.grille[i], t);
if(this.grille[i][t] == this.playerTurn){
this.dropColumn(i, t);
this.piecePlayed--;
}
}
}
}
private void dropColumn(int[] col, int ligne){
/**
* Fait tomber les pions de la colonne à partir de la ligne sélectionnée
* @param col colonne de la grille
* @param ligne ligne de la grille
*/
private void dropColumn(int col, int ligne){
for(int i=ligne; i>=0; i--){
if(i>0){
col[i]=col[i-1];
this.grille[col][i]=this.grille[col][i-1];
}else{
col[0]=Constants.EMPTY_PLAYER;
this.grille[col][0]=Constants.EMPTY_PLAYER;
}
this.fireGridChanged(col, i, this.grille[col][i]);
}
}
// ----------------------- Getter et Setter --------------------------
/**
* Retourne le tour du joueur
* @return Le tour du joueur
* renvoie le playersList du joueur
* @return Le playersList du joueur
*/
public int getPlayerTurn() {
return this.playerTurn;
}
/**
* Retourne le tableau d'entier qui représente l'état de la grille
* renvoie le tableau d'entier qui représente l'état de la grille
* @return Le tableau d'entier
*/
public int[][] getTab() {
@ -288,7 +313,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le nombre de colonne de la grille
* renvoie le nombre de colonne de la grille
* @return Le nombre de colonne
*/
public int getColumn() {
@ -296,7 +321,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le nombre de ligne de la grille
* renvoie le nombre de ligne de la grille
* @return Le nombre de ligne
*/
public int getRow() {
@ -304,7 +329,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le nom du joueur 1
* renvoie le nom du joueur 1
* @return Un string du nom du joueur 1
*/
public String getPlayerOneName() {
@ -312,7 +337,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le nom du joueur 2
* renvoie le nom du joueur 2
* @return Un string du nom du joueur 2
*/
public String getPlayerTwoName() {
@ -320,7 +345,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le nom du joueur 3
* renvoie le nom du joueur 3
* @return Un string du nom du joueur 2
*/
public String getPlayerThreeName() {
@ -329,7 +354,7 @@ public class GrilleModel extends AbstractGridInitiater{
/**
* Retourne le score du joueur 1
* renvoie le score du joueur 1
* @return Le score du joueur 1
*/
public int getPlayerOneScore() {
@ -337,7 +362,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le score du joueur 2
* renvoie le score du joueur 2
* @return Le score du joueur 2
*/
public int getPlayerTwoScore() {
@ -345,7 +370,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le score du joueur 3
* renvoie le score du joueur 3
* @return Le score du joueur 3
*/
public int getPlayerThreeScore() {
@ -353,7 +378,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* Retourne le {@link fr.iutfbleau.projetAgile.Puissance4.Utils.GameStatus status} de la partie
* renvoie le {@link fr.iutfbleau.projetAgile.Puissance4.Utils.GameStatus status} de la partie
* @return Le status de la partie
*/
public GameStatus getGameStatus() {
@ -361,7 +386,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
public int getPlayerNumber() {
return this.tour.size();
return this.playersList.size();
}
/**

View File

@ -0,0 +1,5 @@
/**
* fr.iutfbleau.projetAgile.Puissance4.Model groupe toutes les classes du modèle du Puissance 4
*/
package fr.iutfbleau.projetAgile.Puissance4.Model;
//Fichier vide pour la javadoc

View File

@ -9,15 +9,15 @@ public class Constants {
/**
* La couleur du joueur 1
*/
public static Color PLAYER_ONE_COLOR = new Color(252,21,21);
public static Color PLAYER_ONE_COLOR;
/**
* La couleur du joueur 2
*/
public static Color PLAYER_TWO_COLOR = new Color(241,205,15);
public static Color PLAYER_TWO_COLOR;
/**
* La couleur du joueur 3
*/
public static Color PLAYER_THREE_COLOR = new Color(15,20,241);
public static Color PLAYER_THREE_COLOR;
/**
* La couleur d'un pion "vide"
*/
@ -26,6 +26,11 @@ public class Constants {
* La couleur de fond du panneau
*/
public final static Color BACKGROUND_COLOR = new Color(31,31,31);
/**
* La couleur des boutons
*/
public final static Color RED = new Color(255,64,64);
/**
* L'entier qui représente un pion "vide"
*/
@ -45,7 +50,7 @@ public class Constants {
/**
* Le survol du pion est activé ?
*/
public static final boolean DRAW_POSITION = true;
public static boolean DRAW_POSITION = true;
/**
* La marge d'un pion
*/
@ -67,13 +72,22 @@ public class Constants {
*/
public final static int ALIGNED_NUMBER_THREE = 3;
public final static String CONFIRM = "Confirmation";
public final static String DENY = "Annulation";
private Constants() {
}
/**
* Remet les couleurs des pions des joueurs par défaut
*/
public static void resetColor() {
Constants.PLAYER_ONE_COLOR = new Color(252,21,21);
Constants.PLAYER_TWO_COLOR = new Color(241,205,15);
Constants.PLAYER_THREE_COLOR = new Color(15,20,241);
}
}

View File

@ -4,7 +4,6 @@ package fr.iutfbleau.projetAgile.Puissance4.Utils;
* Enumeration du status d'une partie (En cours, gagné, égalité)
*/
public enum GameStatus {
FIRST,
/**
* Status d'une partie en cours
*/

View File

@ -0,0 +1,5 @@
/**
* fr.iutfbleau.projetAgile.Puissance4.View groupe toutes les classes des paramètres/constantes du jeu
*/
package fr.iutfbleau.projetAgile.Puissance4.Utils;
//Fichier vide pour la javadoc

View File

@ -21,23 +21,26 @@ import fr.iutfbleau.projetAgile.Puissance4.Controller.ColorChooserListener;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
/**
* JDialog personnalisé permettant de choisir un nom et une couleur pour deux joueur
* JDialog personnalisé permettant de choisir un nom et une couleur pour le puissance 4
*/
public class ColorChooserDialog extends JDialog{
private JTextField field1;
private JTextField field2;
private JTextField field3;
private int playerNumber;
private boolean confirm = false;
/**
* Crée une fenêtre modale avec pour nom "Choisissez vos noms et couleurs"
* @param owner la {@code Frame} depuis laquelle la fenetre modale est affichée
* @param owner la {@code Frame} depuis laquelle la fenetre modale est affichée
* @param modal specifie si la fenêtre modale bloque les interactions avec les fenêtres mères
* @param playerNumber Nombre de joueurs
* @see javax.swing.JDialog#JDialog(Frame, boolean)
*/
public ColorChooserDialog(Frame owner, boolean modal, int playerNumber) {
super(owner, "Choisissez vos noms et couleurs",modal);
this.playerNumber = playerNumber;
this.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
@ -59,11 +62,25 @@ public class ColorChooserDialog extends JDialog{
playerThreeChooser.removeChooserPanel(panelsP3[i]);
}
JButton bouton = new JButton("Confirmer");
JButton confirmButton = new JButton("Confirmer");
confirmButton.setFocusPainted(false);
confirmButton.setActionCommand(Constants.CONFIRM);
JButton denyButton = new JButton("Annuler");
denyButton.setFocusPainted(false);
denyButton.setActionCommand(Constants.DENY);
JPanel panelButton = new JPanel();
panelButton.setOpaque(false);
panelButton.add(confirmButton);
panelButton.add(denyButton);
Pion pionP1 = new Pion(Constants.PLAYER_ONE);
Pion pionP2 = new Pion(Constants.PLAYER_TWO);
Pion pionP3 = new Pion(Constants.PLAYER_THREE);
bouton.addActionListener(new ColorActionListener(this));
ColorActionListener cl = new ColorActionListener(this);
confirmButton.addActionListener(cl);
denyButton.addActionListener(cl);
pionP1.setPreferredSize(new Dimension(50,50));
pionP2.setPreferredSize(new Dimension(50,50));
pionP3.setPreferredSize(new Dimension(50,50));
@ -87,7 +104,7 @@ public class ColorChooserDialog extends JDialog{
playerTwoChooser.getSelectionModel().addChangeListener(new ColorChooserListener(pionP2, Constants.PLAYER_TWO));
playerThreeChooser.getSelectionModel().addChangeListener(new ColorChooserListener(pionP2, Constants.PLAYER_THREE));
playerThreeChooser.getSelectionModel().addChangeListener(new ColorChooserListener(pionP3, Constants.PLAYER_THREE));
JPanel panelP1 = new JPanel(new GridBagLayout());
@ -95,7 +112,7 @@ public class ColorChooserDialog extends JDialog{
JPanel panelP3 = new JPanel(new GridBagLayout());
JLabel labelP1 = new JLabel("Nom et couleur du joueur 1");
JLabel labelP2 = new JLabel("Nom et couleur du joueur 2");
JLabel labelP3 = new JLabel("Nom et couleur du joueur 2");
JLabel labelP3 = new JLabel("Nom et couleur du joueur 3");
this.field1 = new JTextField("Joueur 1");
this.field2 = new JTextField("Joueur 2");
this.field3 = new JTextField("Joueur 3");
@ -172,7 +189,7 @@ public class ColorChooserDialog extends JDialog{
gbc.weighty = 0;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.EAST;
this.add(bouton,gbc);
this.add(panelButton,gbc);
this.pack();
this.setResizable(false);
@ -182,15 +199,26 @@ public class ColorChooserDialog extends JDialog{
/**
* Vérifie si les couleurs choisies ne sont vont pas être confondues
* @return true si les couleurs choisies ne sont pas trop similaires les unes des unes, false sinon
* @return true si les couleurs choisies ne sont pas trop similaires renvoie true, sinon false
* @see <a href="https://en.wikipedia.org/wiki/Color_difference">Wikipedia</a>
*/
public boolean isColorValid() {
double distanceBetweenP1AndP2 = Math.sqrt(Math.pow(Constants.PLAYER_TWO_COLOR.getRed() - Constants.PLAYER_ONE_COLOR.getRed(), 2) + Math.pow(Constants.PLAYER_TWO_COLOR.getGreen() - Constants.PLAYER_ONE_COLOR.getGreen(), 2) + Math.pow(Constants.PLAYER_TWO_COLOR.getBlue() - Constants.PLAYER_ONE_COLOR.getBlue(), 2));
double distanceBetweenP1AndP3 = Math.sqrt(Math.pow(Constants.PLAYER_TWO_COLOR.getRed() - Constants.PLAYER_THREE_COLOR.getRed(), 2) + Math.pow(Constants.PLAYER_TWO_COLOR.getGreen() - Constants.PLAYER_THREE_COLOR.getGreen(), 2) + Math.pow(Constants.PLAYER_TWO_COLOR.getBlue() - Constants.PLAYER_THREE_COLOR.getBlue(), 2));
double distanceBetweenP2AndP3 = Math.sqrt(Math.pow(Constants.PLAYER_TWO_COLOR.getRed() - Constants.PLAYER_THREE_COLOR.getRed(), 2) + Math.pow(Constants.PLAYER_TWO_COLOR.getGreen() - Constants.PLAYER_THREE_COLOR.getGreen(), 2) + Math.pow(Constants.PLAYER_TWO_COLOR.getBlue() - Constants.PLAYER_THREE_COLOR.getBlue(), 2));
double distanceBetweenP1AndEmpty = Math.sqrt(Math.pow(Constants.EMPTY_COLOR.getRed() - Constants.PLAYER_ONE_COLOR.getRed(), 2) + Math.pow(Constants.EMPTY_COLOR.getGreen() - Constants.PLAYER_ONE_COLOR.getGreen(), 2) + Math.pow(Constants.EMPTY_COLOR.getBlue() - Constants.PLAYER_ONE_COLOR.getBlue(), 2));
double distanceBetweenP2AndEmpty = Math.sqrt(Math.pow(Constants.EMPTY_COLOR.getRed() - Constants.PLAYER_TWO_COLOR.getRed(), 2) + Math.pow(Constants.EMPTY_COLOR.getGreen() - Constants.PLAYER_TWO_COLOR.getGreen(), 2) + Math.pow(Constants.EMPTY_COLOR.getBlue() - Constants.PLAYER_TWO_COLOR.getBlue(), 2));
double distanceBetweenP3AndEmpty = Math.sqrt(Math.pow(Constants.EMPTY_COLOR.getRed() - Constants.PLAYER_THREE_COLOR.getRed(), 2) + Math.pow(Constants.EMPTY_COLOR.getGreen() - Constants.PLAYER_THREE_COLOR.getGreen(), 2) + Math.pow(Constants.EMPTY_COLOR.getBlue() - Constants.PLAYER_THREE_COLOR.getBlue(), 2));
if(distanceBetweenP1AndP2 < 150f) {
JOptionPane.showMessageDialog(this,"Les deux couleurs sont trop proches","Erreur ", JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(this,"Les deux couleurs sont trop proches (1,2)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
if(playerNumber == 3 && distanceBetweenP1AndP3 < 150f) {
JOptionPane.showMessageDialog(this,"Les deux couleurs sont trop proches (1,3)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
if(playerNumber == 3 && distanceBetweenP2AndP3 < 150f) {
JOptionPane.showMessageDialog(this,"Les deux couleurs sont trop proches (2,3)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
else if(distanceBetweenP1AndEmpty < 150f) {
@ -201,6 +229,10 @@ public class ColorChooserDialog extends JDialog{
JOptionPane.showMessageDialog(this,"La couleur du joueur 2 est trop sombre","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
else if(playerNumber == 3 && distanceBetweenP3AndEmpty < 150f) {
JOptionPane.showMessageDialog(this,"La couleur du joueur 3 est trop sombre","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
@ -211,8 +243,10 @@ public class ColorChooserDialog extends JDialog{
public boolean isNameValid() {
String J1 = null;
String J2 = null;
String J3 = null;
J1 = field1.getText();
J2 = field2.getText();
J3 = field3.getText();
if(J1.length() > 10) {
J1 = J1.substring(0, 9);
this.field1.setText(J1);
@ -220,13 +254,25 @@ public class ColorChooserDialog extends JDialog{
if(J2.length() > 10) {
J2 = J2.substring(0, 9);
this.field2.setText(J2);
}
if(J1.isEmpty() || J2.isEmpty()) {
}
if(J3.length() > 10) {
J3 = J3.substring(0, 9);
this.field3.setText(J3);
}
if(J1.replaceAll("\\s", "").isEmpty() || J2.replaceAll("\\s", "").isEmpty() || J3.replaceAll("\\s", "").isEmpty()) {
JOptionPane.showMessageDialog(this,"Un des noms est vides","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
else if(J1.compareTo(J2) == 0) {
JOptionPane.showMessageDialog(this,"Les deux noms sont identiques","Erreur ", JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(this,"Les deux noms sont identiques (1,2)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
else if(J1.compareTo(J3) == 0) {
JOptionPane.showMessageDialog(this,"Les deux noms sont identiques (1,3)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
else if(J2.compareTo(J3) == 0) {
JOptionPane.showMessageDialog(this,"Les deux noms sont identiques (2,3)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
@ -259,7 +305,8 @@ public class ColorChooserDialog extends JDialog{
/**
* Permet de confirmer la choix de l'utilisateur
* Permet de confirmer le choix de l'utilisateur
* @param b le booléen
*/
public void setConfirm(boolean b) {
this.confirm = b;

View File

@ -79,19 +79,7 @@ public class Grille extends JPanel{
}
}
this.repaint();
}
public void RemovePlayer(int Joueur, int[][] j){
for (int x = 0; x < this.column; x++) {
for (int y = 0; y < this.row; y++) {
this.grille[x][y].setPlayer(j[x][y]);
this.grille[x][y].setHover(false);
}
}
this.repaint();
}
}
/**
* Change la couleur de survol des pions selon le tour du joueur
@ -150,7 +138,4 @@ public class Grille extends JPanel{
}
}
public void removePlayerPion(int Joueur){
}
}

View File

@ -76,6 +76,9 @@ public class Pion extends JComponent{
Pion.HIGHLIGHT_COLOR = c;
}
/**
* Paint le pion
*/
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();

View File

@ -21,7 +21,8 @@ public class Puissance4Panel extends JPanel{
private String playerOneName;
private String playerTwoName;
private String playerThreeName;
private int playerNumber;
private JLabel titre;
private String title;
/**
* Crée un panneau avec la grille
@ -39,8 +40,10 @@ public class Puissance4Panel extends JPanel{
/**
* Ajoute tous les composants autres que la grille au panneau (Bouton recommencer, accueil, le nom du joueur qui joue, le score)
* Il faut appeler cette fonction après avoir initialisé les différents variables du jeu (noms des joueurs)
* @param title Nom du JLabel
*/
public void init() {
public void init(String title) {
this.title = title;
GridBagLayout gbl = new GridBagLayout();
this.setLayout(gbl);
GridBagConstraints gbc = new GridBagConstraints();
@ -58,9 +61,9 @@ public class Puissance4Panel extends JPanel{
this.add(this.menu, gbc);
JLabel titre = new JLabel("PUISSANCE 4");
titre.setForeground(Color.WHITE);
titre.setFont(new Font("",Font.BOLD, 40));
this.titre = new JLabel(title);
this.titre.setForeground(Color.WHITE);
this.titre.setFont(new Font("",Font.BOLD, 40));
gbc.gridx = 1;
gbc.gridy = 0;
@ -72,7 +75,7 @@ public class Puissance4Panel extends JPanel{
gbc.weighty = 0;
gbc.insets = new Insets(0, 0, 0, 0);
this.add(titre, gbc);
this.add(this.titre, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
@ -125,13 +128,14 @@ public class Puissance4Panel extends JPanel{
gbc.insets = new Insets(10, 0, 0, 0);
this.add(this.reset, gbc);
reset.setBackground(new Color(255,64,64));
reset.setBackground(Constants.RED);
reset.setForeground(Color.WHITE);
reset.setFocusPainted(false);
reset.setBorder(new EmptyBorder(5,10,5,10));
menu.setBackground(new Color(255,64,64));
menu.setBackground(Constants.RED);
menu.setForeground(Color.WHITE);
menu.setFocusPainted(false);
menu.setBorder(new EmptyBorder(5,10,5,10));
@ -154,7 +158,6 @@ public class Puissance4Panel extends JPanel{
case Constants.PLAYER_ONE:
this.playerTurn.setText("Tour de : " + this.playerOneName);
break;
case Constants.PLAYER_TWO:
this.playerTurn.setText("Tour de : " + this.playerTwoName);
break;
@ -202,6 +205,7 @@ public class Puissance4Panel extends JPanel{
* @param playerTurn le tour du joueur actuel
* @param playerOneScore le score du joueur 1
* @param playerTwoScore le score du joueur 2
* @param playerThreeScore le score du joueur 3
*/
public void setGameStatus(GameStatus status, int playerTurn, int playerOneScore, int playerTwoScore, int playerThreeScore) {
this.grille.hover(-1);
@ -221,24 +225,37 @@ public class Puissance4Panel extends JPanel{
this.playerTurn.setText("Egalité");
break;
case FIRST:
JOptionPane.showMessageDialog(this, "Victoire de : " + (playerTurn == Constants.PLAYER_ONE ? this.playerOneName : this.playerTwoName), "Victoire", JOptionPane.DEFAULT_OPTION);
break;
default:
this.changeLabel(playerTurn);
break;
}
if(this.playerNumber == 2)
if(playerThreeScore == -1)
this.changeScore(playerOneScore, playerTwoScore);
else
this.changeScore(playerOneScore, playerTwoScore, playerThreeScore);
}
public void RemovePlayer(int Player, int[][] grille){
this.grille.RemovePlayer(Player, grille);
this.changeHoverColor(Player);
this.changeLabel(Player);
/**
* Envoie un popup avec un message de victoire
* @param player joueur
*/
public void playerWin(int player){
switch(player){
case 1:
JOptionPane.showMessageDialog(this, "Le joueur "+this.playerOneName+" a gagné");
break;
case 2:
JOptionPane.showMessageDialog(this, "Le joueur "+this.playerTwoName+" a gagné");
break;
case 3:
JOptionPane.showMessageDialog(this, "Le joueur "+this.playerThreeName+" a gagné");
break;
}
this.titre.setText("PUISSANCE 4");
}
public void resetTitle() {
this.titre.setText(title);
}
/**
@ -259,16 +276,12 @@ public class Puissance4Panel extends JPanel{
/**
* Permet de définir le nom du joueur 3
* @param playerTwoName le nom du joueur
* @param playerThreeName le nom du joueur
*/
public void setPlayerThreeName(String playerThreeName) {
this.playerThreeName = playerThreeName;
}
public void setPlayerNumber(int playerNumber) {
this.playerNumber = playerNumber;
}
/**
* Retourne la grille du Puissance 4
* @return La grille du Puissance 4
@ -292,5 +305,6 @@ public class Puissance4Panel extends JPanel{
public void accueilButton(ActionListener l){
this.menu.addActionListener(l);
}
}

View File

@ -0,0 +1,5 @@
/**
* fr.iutfbleau.projetAgile.Puissance4.View groupe toutes les classes de la vue du Puissance 4
*/
package fr.iutfbleau.projetAgile.Puissance4.View;
//Fichier vide pour la javadoc