This commit is contained in:
Justine Yannis 2022-11-21 08:59:47 +01:00
commit 1988d63733
22 changed files with 369 additions and 77 deletions

View File

@ -1,4 +1,4 @@
@JAVAC_OPT = -implicit:none \
@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

View File

@ -1,10 +1,30 @@
package fr.iutfbleau.projetAgile;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import java.awt.Color;
import java.util.Enumeration;
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,14 +1,26 @@
package fr.iutfbleau.projetAgile.Menu.Controller;
import java.awt.event.*;
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{
public ObservateurAccueil(){}
/**
* Fonction lors du clique
* retourne au menu après confirmation
*/
@Override
public void actionPerformed(ActionEvent evenement){
//On affiche la confirmation en bloquant la fentre
int confirmation = JOptionPane.showConfirmDialog(Menu.getFrame(), "Etes-vous sûr de vouloir retourner au menu ?", "Menu", JOptionPane.YES_NO_OPTION);
if(confirmation == 1) return;
Menu.show(Menu.MENU);
//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

@ -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,6 +4,7 @@ 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.*;
@ -11,24 +12,37 @@ 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;
@ -38,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);
@ -58,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);
@ -71,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));
@ -82,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
@ -103,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);
}
@ -130,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)
@ -153,21 +179,39 @@ public abstract class Menu{
}
}
/**
* 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

@ -1,7 +1,7 @@
package fr.iutfbleau.projetAgile.Puissance4.Controller;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
import fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@ -20,22 +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()) {
if(this.dialog.isNameValid()) {
this.dialog.setConfirm(true);
this.dialog.setVisible(false);
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 {
Constants.resetColor();
this.dialog.repaint();
this.dialog.setConfirm(false);
this.dialog.setVisible(false);
}
}
}

View File

@ -16,15 +16,20 @@ public class ColorChooserListener implements ChangeListener {
private int player;
/**
*
* @param c
* @param 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) {

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,6 +34,9 @@ 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 playerWin(PlayerEvent e){
this.panel.playerWin(e.getJ());

View File

@ -135,6 +135,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

@ -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,6 +66,10 @@ public abstract class AbstractGridInitiater {
}
}
/**
* 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()) {
@ -72,6 +77,5 @@ public abstract class AbstractGridInitiater {
event= new PlayerEvent(playerRemove);
listener.playerWin(event);
}
}
}

View File

@ -6,9 +6,20 @@ package fr.iutfbleau.projetAgile.Puissance4.Event;
public class PlayerEvent {
private int J;
/**
* Créer un évènement
* @param j0
*/
public PlayerEvent(int j0){
this.J=j0;
}
/**
* Retourne le joueur
* @return le joueur
*/
public int getJ() {
return J;
}

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;
@ -43,7 +45,7 @@ public class LancementPuissance4 implements Jeu{
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");
}
@ -53,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();
@ -92,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

@ -23,8 +23,10 @@ public class GrilleModel extends AbstractGridInitiater{
private int playerThreeScore;
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();
@ -58,6 +60,9 @@ public class GrilleModel extends AbstractGridInitiater{
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);
@ -67,6 +72,11 @@ public class GrilleModel extends AbstractGridInitiater{
}
}
/**
* 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);
@ -96,6 +106,9 @@ public class GrilleModel extends AbstractGridInitiater{
}
}
/**
* Supprime de la liste le joueur qui vient de gagner
*/
private void removePlayer(){
this.increaseScore();
this.removePlayerPion();
@ -105,6 +118,9 @@ public class GrilleModel extends AbstractGridInitiater{
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();
@ -119,6 +135,10 @@ public class GrilleModel extends AbstractGridInitiater{
}
}
/**
* 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--) {
@ -172,13 +192,13 @@ public class GrilleModel extends AbstractGridInitiater{
/**
* ReplayersListne 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 ReplayersListne 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;
@ -202,6 +222,9 @@ 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);
@ -228,7 +251,9 @@ public class GrilleModel extends AbstractGridInitiater{
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++;
@ -252,6 +277,11 @@ public class GrilleModel extends AbstractGridInitiater{
}
}
/**
* 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){
@ -266,7 +296,7 @@ public class GrilleModel extends AbstractGridInitiater{
// ----------------------- Getter et Setter --------------------------
/**
* ReplayersListne le playersList du joueur
* renvoie le playersList du joueur
* @return Le playersList du joueur
*/
public int getPlayerTurn() {
@ -274,7 +304,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne 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() {
@ -282,7 +312,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne le nombre de colonne de la grille
* renvoie le nombre de colonne de la grille
* @return Le nombre de colonne
*/
public int getColumn() {
@ -290,7 +320,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne le nombre de ligne de la grille
* renvoie le nombre de ligne de la grille
* @return Le nombre de ligne
*/
public int getRow() {
@ -298,7 +328,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne le nom du joueur 1
* renvoie le nom du joueur 1
* @return Un string du nom du joueur 1
*/
public String getPlayerOneName() {
@ -306,7 +336,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne le nom du joueur 2
* renvoie le nom du joueur 2
* @return Un string du nom du joueur 2
*/
public String getPlayerTwoName() {
@ -314,7 +344,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne le nom du joueur 3
* renvoie le nom du joueur 3
* @return Un string du nom du joueur 2
*/
public String getPlayerThreeName() {
@ -323,7 +353,7 @@ public class GrilleModel extends AbstractGridInitiater{
/**
* ReplayersListne le score du joueur 1
* renvoie le score du joueur 1
* @return Le score du joueur 1
*/
public int getPlayerOneScore() {
@ -331,7 +361,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne le score du joueur 2
* renvoie le score du joueur 2
* @return Le score du joueur 2
*/
public int getPlayerTwoScore() {
@ -339,7 +369,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne le score du joueur 3
* renvoie le score du joueur 3
* @return Le score du joueur 3
*/
public int getPlayerThreeScore() {
@ -347,7 +377,7 @@ public class GrilleModel extends AbstractGridInitiater{
}
/**
* ReplayersListne 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() {

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"
*/
@ -67,11 +72,19 @@ 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);

View File

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

View File

@ -8,12 +8,14 @@ import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Frame;
import java.awt.Color;
import fr.iutfbleau.projetAgile.Puissance4.Controller.ColorActionListener;
@ -28,16 +30,19 @@ 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 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 +64,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));
@ -172,7 +191,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,7 +201,7 @@ 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() {
@ -196,11 +215,11 @@ public class ColorChooserDialog extends JDialog{
JOptionPane.showMessageDialog(this,"Les deux couleurs sont trop proches (1,2)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
if(distanceBetweenP1AndP3 < 150f) {
if(playerNumber == 3 && distanceBetweenP1AndP3 < 150f) {
JOptionPane.showMessageDialog(this,"Les deux couleurs sont trop proches (1,3)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
if(distanceBetweenP2AndP3 < 150f) {
if(playerNumber == 3 && distanceBetweenP2AndP3 < 150f) {
JOptionPane.showMessageDialog(this,"Les deux couleurs sont trop proches (2,3)","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
@ -212,7 +231,7 @@ public class ColorChooserDialog extends JDialog{
JOptionPane.showMessageDialog(this,"La couleur du joueur 2 est trop sombre","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
else if(distanceBetweenP3AndEmpty < 150f) {
else if(playerNumber == 3 && distanceBetweenP3AndEmpty < 150f) {
JOptionPane.showMessageDialog(this,"La couleur du joueur 3 est trop sombre","Erreur ", JOptionPane.ERROR_MESSAGE);
return false;
}
@ -288,7 +307,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

@ -138,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

@ -39,6 +39,7 @@ 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(String title) {
GridBagLayout gbl = new GridBagLayout();
@ -127,12 +128,12 @@ public class Puissance4Panel extends JPanel{
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));
@ -202,6 +203,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);
@ -231,6 +233,10 @@ public class Puissance4Panel extends JPanel{
this.changeScore(playerOneScore, playerTwoScore, playerThreeScore);
}
/**
* Envoie un popup avec un message de victoire
* @param player joueur
*/
public void playerWin(int player){
switch(player){
case 1:
@ -264,7 +270,7 @@ 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;