diff --git a/src/Main.java b/src/Main.java index 87abb23..ebe86d7 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,72 +1,76 @@ - import controleur.ControleurPartie; - import controleur.ControleurReseau; - import modele.Couleur; - import modele.ModeDeJeu; - import modele.Partie; - import modele.joueur.Joueur; - import modele.joueur.JoueurHumain; - import vue.Vue; - import vue.VueConsole; - import vue.VueGraphiqueSwing; +import controleur.ControleurPartie; +import controleur.ControleurReseau; +import modele.Couleur; +import modele.ModeDeJeu; +import modele.Partie; +import modele.joueur.Joueur; +import modele.joueur.JoueurHumain; +import vue.Vue; +import vue.VueConsole; +import vue.VueGraphiqueSwing; - public class Main { - public static void main(String[] args) { - // Déclaration des variables nécessaires - Vue vue; - Joueur joueurBlanc; - Joueur joueurNoir; - ModeDeJeu modeDeJeu; - ControleurReseau controleurReseau = null; // À initialiser si tu utilises le réseau +public class Main { + public static void main(String[] args) { + // Déclaration des variables nécessaires + Vue vue; + Joueur joueurBlanc; + Joueur joueurNoir; + ModeDeJeu modeDeJeu; + ControleurReseau controleurReseau = null; // À initialiser si tu utilises le réseau - int choixMode = 1; // à remplacer par Scanner plus tard - int choixAffichage = 3; // 1: Console, 2: JavaFX, 3: Swing - String stylePlateau = "BOIS_CLAIR"; // Style de plateau, à remplacer par une entrée utilisateur + int choixMode = 1; // à remplacer par Scanner plus tard + int choixAffichage = 3; // 1: Console, 2: JavaFX, 3: Swing + String stylePlateau = "BOIS_CLAIR"; // Style du plateau, à remplacer par une entrée utilisateur - switch (choixMode) { - case 1 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN; - case 2 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_IA; - case 3 -> modeDeJeu = ModeDeJeu.IA_VS_IA; - default -> { - modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN; - } - } + // === Choix du mode de jeu === + switch (choixMode) { + case 1: + modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN; + break; + case 2: + modeDeJeu = ModeDeJeu.HUMAIN_VS_IA; + break; + case 3: + modeDeJeu = ModeDeJeu.IA_VS_IA; + break; + default: + modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN; + } - // Initialisation des joueurs et du mode de jeu - vue = new VueConsole(); - joueurBlanc = new JoueurHumain(Couleur.BLANC, vue, false, "Mathis"); - joueurNoir = new JoueurHumain(Couleur.NOIR, vue, false, "Pellel"); + // === Initialisation des joueurs === + vue = new VueConsole(); // Valeur par défaut + joueurBlanc = new JoueurHumain(Couleur.BLANC, vue, false, "Mathis"); + joueurNoir = new JoueurHumain(Couleur.NOIR, vue, false, "Pellel"); - Partie partie = new Partie(joueurBlanc, joueurNoir, stylePlateau); + Partie partie = new Partie(joueurBlanc, joueurNoir, stylePlateau); - switch (choixAffichage) { - case 1 -> vue = new VueConsole(); - case 2 -> { + // === Choix du type d'affichage === + switch (choixAffichage) { + case 1: + vue = new VueConsole(); + break; + case 2: // vue = new VueGraphiqueJavaFX(); - } - case 3 -> vue = new VueGraphiqueSwing(partie); - default -> { + break; + case 3: + vue = new VueGraphiqueSwing(partie); + break; + default: System.out.println("Type d'affichage non reconnu. Console par défaut utilisée."); vue = new VueConsole(); - } - } - - // Recalification de la vue pour chaque joueur humain - if(joueurBlanc instanceof JoueurHumain jb) jb.setVue(vue); - if(joueurNoir instanceof JoueurHumain jb) jb.setVue(vue); - - // if (joueurNoir instanceof JoueurHumain) { - // JoueurHumain jb = (JoueurHumain) joueurBlanc; - // jb.setVue(vue); - // } - // if (joueurNoir instanceof JoueurHumain) { - // JoueurHumain jn = (JoueurHumain) joueurNoir; - // jn.setVue(vue); - // } - - - // lancement de la partie - var controleurPartie = new ControleurPartie(partie, vue, controleurReseau, modeDeJeu); - controleurPartie.lancerPartie(); } + + // Réaffecter la vue si les joueurs sont humains + if (joueurBlanc instanceof JoueurHumain jb) { + jb.setVue(vue); + } + if (joueurNoir instanceof JoueurHumain jn) { + jn.setVue(vue); + } + + // === Lancement de la partie === + var controleurPartie = new ControleurPartie(partie, vue, controleurReseau, modeDeJeu); + controleurPartie.lancerPartie(); } +} diff --git a/src/controleur/ControleurPartie.java b/src/controleur/ControleurPartie.java index 6745396..a876d2f 100644 --- a/src/controleur/ControleurPartie.java +++ b/src/controleur/ControleurPartie.java @@ -4,6 +4,7 @@ import modele.Coup; import modele.ModeDeJeu; import modele.Partie; import modele.joueur.*; +import reseau.TypeMessage; import vue.Vue; @@ -25,17 +26,15 @@ public class ControleurPartie { System.out.println("BIENVENUE AU JEU D'ÉCHECS"); System.out.println("===============================\n"); - System.out.println("DEbug"); + vue.afficherMessage(TypeMessage.SYSTEME,"Mode de jeu : " + modeDeJeu); + vue.afficherMessage(TypeMessage.SYSTEME,"Joueurs : " + partie.getJoueurBlanc().getNom() + " (Blancs) vs " + partie.getJoueurNoir().getNom() + " (Noirs)"); + vue.afficherMessage(TypeMessage.SYSTEME,"Les pions Noirs sont en bas. Les pions Blancs sont en haut. \n"); - vue.afficherMessage("Mode de jeu : " + modeDeJeu); - vue.afficherMessage("Joueurs : " + partie.getJoueurBlanc().getNom() + " (Blancs) vs " + partie.getJoueurNoir().getNom() + " (Noirs)"); - vue.afficherMessage("Les pions Noirs sont en bas. Les pions Blancs sont en haut. \n"); - - vue.afficherMessage("------- La Partie commence ! -------"); + vue.afficherMessage(TypeMessage.SYSTEME,"------- La Partie commence ! -------"); vue.afficherPlateau(partie.getPlateau()); //System.out.print("\n"); - vue.afficherMessage("C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); + vue.afficherMessage(TypeMessage.SYSTEME,"C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); boucleDeJeu(); } @@ -50,19 +49,20 @@ public class ControleurPartie { vue.afficherPlateau(partie.getPlateau()); if(dernierCoup != null) { - vue.afficherMessage("Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); + vue.afficherMessage(TypeMessage.SYSTEME,"Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); } - vue.afficherMessage("\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); + vue.afficherMessage(TypeMessage.SYSTEME,"\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); + vue.setTour(partie.getJoueurActif().getNom()); } catch (IllegalArgumentException e) { - vue.afficherMessage("> Erreur : " + e.getMessage()); + vue.afficherMessage(TypeMessage.SYSTEME,"> Erreur : " + e.getMessage()); } } - vue.afficherMessage("La partie est terminée !"); - vue.afficherMessage("Si vous souhaitez rejouer, relancez le programme."); - vue.afficherMessage("Si vous souhaitez voir l'historique des coups taper 1. Si vous souhaitez voir les captures taper 2."); - vue.afficherMessage("Merci d'avoir joué !"); + vue.afficherMessage(TypeMessage.SYSTEME,"La partie est terminée !"); + vue.afficherMessage(TypeMessage.SYSTEME,"Si vous souhaitez rejouer, relancez le programme."); + vue.afficherMessage(TypeMessage.SYSTEME,"Si vous souhaitez voir l'historique des coups taper 1. Si vous souhaitez voir les captures taper 2."); + vue.afficherMessage(TypeMessage.SYSTEME,"Merci d'avoir joué !"); } } diff --git a/src/modele/Coup.java b/src/modele/Coup.java index 0f58583..3fb7f57 100644 --- a/src/modele/Coup.java +++ b/src/modele/Coup.java @@ -1,42 +1,3 @@ -// package modele; -// import java.awt.Point; -// public class Coup { -// private int xDepart; -// private int xArrivee; -// private int yDepart; -// private int yArrivee; - -// public Coup(int xDepart, int yDepart, int xArrivee, int yArrivee) { -// this.colDepart = colDepart; -// this.yDepart = yDepart; -// this.xArrivee = xArrivee; -// this.yArrivee = yArrivee; -// } - -// public Point getOrigine(){ -// return new Point(xDepart, yDepart); -// } -// public Point getDestination(){ -// return new Point(xArrivee, yArrivee); -// } - -// @Override -// public String toString() { -// Point origine = getOrigine(); -// Point destination = getDestination(); - -// char colOrigine = (char) ('a' + origine.y); // y = colonne -// int ligneOrigine = 8 - origine.x; // x = ligne - -// char colDest = (char) ('a' + destination.y); // y = colonne -// int ligneDest = 8 - destination.x; // x = ligne - -// return " " + colOrigine + ligneOrigine + " -> " + colDest + ligneDest; -// } - - -// } - package modele; import java.awt.Point; @@ -67,6 +28,6 @@ public class Coup { char colOrigineChar = (char) ('a' + colDepart); char colDestChar = (char) ('a' + colArrivee); - return " " + colOrigineChar + ligneDepart + " -> " + colDestChar + ligneArrivee; + return " " + colOrigineChar + ligneDepart + " -- " + colDestChar + ligneArrivee; } } diff --git a/src/modele/Partie.java b/src/modele/Partie.java index 8469d9b..4807579 100644 --- a/src/modele/Partie.java +++ b/src/modele/Partie.java @@ -49,7 +49,7 @@ public class Partie{ throw new IllegalArgumentException("Ce n'est pas votre pièce."); } if(!piece.estDeplacementValide(coup, plateau)) { - System.out.println("ICI"); + //System.out.println("ICI"); throw new IllegalArgumentException("Déplacement invalide."); } // System.out.println("sortie dans partie"); diff --git a/src/modele/joueur/JoueurHumain.java b/src/modele/joueur/JoueurHumain.java index 9e2bd5a..a85ca57 100644 --- a/src/modele/joueur/JoueurHumain.java +++ b/src/modele/joueur/JoueurHumain.java @@ -1,13 +1,13 @@ package modele.joueur; -import vue.Vue; import modele.Couleur; import modele.Coup; import modele.Plateau; +import vue.Vue; public class JoueurHumain extends Joueur { private Vue vue; - private boolean reseau; + private final boolean reseau; public JoueurHumain(Couleur couleur, Vue vue, boolean reseau, String nom) { super(couleur, nom); diff --git a/src/modele/piece/Fou.java b/src/modele/piece/Fou.java index a9c2c12..e975307 100644 --- a/src/modele/piece/Fou.java +++ b/src/modele/piece/Fou.java @@ -1,4 +1,6 @@ package modele.piece; +import java.awt.Point; +import modele.Case; import modele.Couleur; import modele.Coup; import modele.Plateau; @@ -15,7 +17,42 @@ public class Fou extends Piece{ @Override public boolean estDeplacementValide(Coup coup, Plateau plateau) { - // Implémentation de la validation du déplacement pour le fou - return false; - } -} + Point origine = coup.getOrigine(); + Point destination = coup.getDestination(); + + // Conventions : Point.x = ligne, Point.y = colonne + int ligneOrigine = origine.x; + int colOrigine = origine.y; + int ligneDest = destination.x; + int colDest = destination.y; + + // bornes de plateau + if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false; + + int deltaLigne = Math.abs(ligneDest - ligneOrigine); // c'est le k + int deltaCol = Math.abs(colDest - colOrigine); // c'est le k + + //Vérifie que le déplacement est bien en diagonale, mouvement en "L" aussi pour un deplacement à droite (x,y)= (x0 + k, y0 + k) et a gauche (x0 + k, y0 - k) vers bas c'est positif +k et le haut c'est negatif -k + if (deltaLigne != deltaCol) return false; + + // Verification si le chemin est libre pour ne pas que le fou saute par dessus une piece + // Direction du mouvement + int pasligne = (ligneDest - ligneOrigine) / deltaLigne; // +1 ou -1 + int pascol = (colDest - colOrigine) / deltaCol; // +1 ou -1 + // Vérification des cases intermédiaires + for (int i = 1; i < deltaLigne; i++) { + Case caseInter = plateau.getCase(ligneOrigine + i * pasligne, colOrigine + i * pascol); + if (!caseInter.estVide()){ + System.out.println("Le chemin est bloqué par une pièce en (" + (ligneOrigine + i * pasligne) + ", " + (colOrigine + i * pascol) + ")"); + return false; // une pièce bloque le passage + } + } + + // Etat de la case de destination + Case caseDest = plateau.getCase(ligneDest, colDest); + if (caseDest.estVide()) return true; + + // si la case est occupée + return caseDest.getPiece().getCouleur() != this.getCouleur(); + } +} \ No newline at end of file diff --git a/src/modele/piece/Reine.java b/src/modele/piece/Reine.java index 6b947f3..426d110 100644 --- a/src/modele/piece/Reine.java +++ b/src/modele/piece/Reine.java @@ -1,4 +1,6 @@ package modele.piece; +import java.awt.Point; +import modele.Case; import modele.Couleur; import modele.Coup; import modele.Plateau; @@ -16,7 +18,50 @@ public class Reine extends Piece{ @Override public boolean estDeplacementValide(Coup coup, Plateau plateau) { - // Implémentation de la validation du déplacement pour la reine - return false; + Point origine = coup.getOrigine(); + Point destination = coup.getDestination(); + + // Conventions : Point.x = ligne, Point.y = colonne + int ligneOrigine = origine.x; + int colOrigine = origine.y; + int ligneDest = destination.x; + int colDest = destination.y; + + // bornes de plateau + if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false; + + int deltaLigne = Math.abs(ligneDest - ligneOrigine); + int deltaCol = Math.abs(colDest - colOrigine); + + //Vérifie que le déplacement est bien en diagonale ou en ligne droite + if (!(deltaLigne == 0 || deltaCol == 0 || deltaLigne == deltaCol)) return false; // + + // Verification si le chemin est libre pour ne pas que la reine saute par dessus une piece + // Direction du mouvement et le pas + int pasLigne = 0; + if (ligneDest > ligneOrigine) pasLigne = 1; + else if (ligneDest < ligneOrigine) pasLigne = -1; + + int pasCol = 0; + if (colDest > colOrigine) pasCol = 1; + else if (colDest < colOrigine) pasCol = -1; + // Vérification des cases intermédiaires + int nbPas = Math.max(deltaLigne, deltaCol); + for (int i = 1; i < nbPas; i++) { + int l = ligneOrigine + i * pasLigne; + int c = colOrigine + i * pasCol; + Case caseInter = plateau.getCase(l, c); + if (!caseInter.estVide()) { + System.out.println("Le chemin est bloqué par une pièce en (" + l + ", " + c + ")"); + return false; + } + } + + // Etat de la case de destination + Case caseDest = plateau.getCase(ligneDest, colDest); + if (caseDest.estVide()) return true; + + // si la case est occupée + return caseDest.getPiece().getCouleur() != this.getCouleur(); } } diff --git a/src/modele/piece/Roi.java b/src/modele/piece/Roi.java index 6534784..04c0539 100644 --- a/src/modele/piece/Roi.java +++ b/src/modele/piece/Roi.java @@ -1,17 +1,38 @@ package modele.piece; + import modele.Couleur; import modele.Coup; import modele.Plateau; +import java.awt.Point; +import modele.Case; -public class Roi extends Piece{ +public class Roi extends Piece { public Roi(Couleur couleur) { super(couleur); - this.symbole = (couleur == Couleur.BLANC) ? "BO" : "NO"; // Symbole pour le roi blanc et noir + this.symbole = (couleur == Couleur.BLANC) ? "BO" : "NO"; } - @Override + @Override public boolean estDeplacementValide(Coup coup, Plateau plateau) { - // Implémentation de la validation du déplacement pour le roi - return false; - } + Point origine = coup.getOrigine(); + Point destination = coup.getDestination(); + + int ligneOrigine = origine.x; + int colOrigine = origine.y; + int ligneDest = destination.x; + int colDest = destination.y; + + // bornes de plateau + if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false; + + int deltaLigne = Math.abs(ligneDest - ligneOrigine); + int deltaCol = Math.abs(colDest - colOrigine); + + // Le roi se déplace d'une seule case (horizontale, verticale ou diagonale) + if (deltaLigne > 1 || deltaCol > 1) return false; + + // Vérifie la case de destination + Case caseDest = plateau.getCase(ligneDest, colDest); + return caseDest.estVide() || caseDest.getPiece().getCouleur() != this.getCouleur(); + } } diff --git a/src/modele/piece/Tour.java b/src/modele/piece/Tour.java index c565123..0cea6d2 100644 --- a/src/modele/piece/Tour.java +++ b/src/modele/piece/Tour.java @@ -2,6 +2,8 @@ package modele.piece; import modele.Couleur; import modele.Coup; import modele.Plateau; +import java.awt.Point; +import modele.Case; public class Tour extends Piece{ public Tour(Couleur couleur) { @@ -13,9 +15,52 @@ public class Tour extends Piece{ } } - @Override + @Override public boolean estDeplacementValide(Coup coup, Plateau plateau) { - // Implémentation de la validation du déplacement pour la tour - return false; - } + Point origine = coup.getOrigine(); + Point destination = coup.getDestination(); + + // Conventions : Point.x = ligne, Point.y = colonne + int ligneOrigine = origine.x; + int colOrigine = origine.y; + int ligneDest = destination.x; + int colDest = destination.y; + + // bornes de plateau + if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false; + + int deltaLigne = Math.abs(ligneDest - ligneOrigine); + int deltaCol = Math.abs(colDest - colOrigine); + + //Vérifie que le déplacement est bien en diagonale ou en ligne droite + if (!(deltaLigne == 0 || deltaCol == 0)) return false; + + // Verification si le chemin est libre pour ne pas que la tour saute par dessus une piece + // Direction du mouvement et le pas + int pasLigne = 0; + if (ligneDest > ligneOrigine) pasLigne = 1; + else if (ligneDest < ligneOrigine) pasLigne = -1; + + int pasCol = 0; + if (colDest > colOrigine) pasCol = 1; + else if (colDest < colOrigine) pasCol = -1; + // Vérification des cases intermédiaires + int nbPas = Math.max(deltaLigne, deltaCol); + for (int i = 1; i < nbPas; i++) { + int l = ligneOrigine + i * pasLigne; + int c = colOrigine + i * pasCol; + Case caseInter = plateau.getCase(l, c); + if (!caseInter.estVide()) { + System.out.println("Le chemin est bloqué par une pièce en (" + l + ", " + c + ")"); + return false; + } + } + + // Etat de la case de destination + Case caseDest = plateau.getCase(ligneDest, colDest); + if (caseDest.estVide()) return true; + + // si la case est occupée + return caseDest.getPiece().getCouleur() != this.getCouleur(); + } } diff --git a/src/out/Main.class b/src/out/Main.class index c27376b..d217969 100644 Binary files a/src/out/Main.class and b/src/out/Main.class differ diff --git a/src/out/controleur/ControleurPartie.class b/src/out/controleur/ControleurPartie.class index b8373b8..71d4547 100644 Binary files a/src/out/controleur/ControleurPartie.class and b/src/out/controleur/ControleurPartie.class differ diff --git a/src/out/modele/Coup.class b/src/out/modele/Coup.class index dc826b0..0a82ef7 100644 Binary files a/src/out/modele/Coup.class and b/src/out/modele/Coup.class differ diff --git a/src/out/modele/Partie.class b/src/out/modele/Partie.class index 63cba0a..e29d440 100644 Binary files a/src/out/modele/Partie.class and b/src/out/modele/Partie.class differ diff --git a/src/out/modele/joueur/JoueurHumain.class b/src/out/modele/joueur/JoueurHumain.class index 9e43293..b763a8b 100644 Binary files a/src/out/modele/joueur/JoueurHumain.class and b/src/out/modele/joueur/JoueurHumain.class differ diff --git a/src/out/modele/piece/Fou.class b/src/out/modele/piece/Fou.class index ece9d31..c279df4 100644 Binary files a/src/out/modele/piece/Fou.class and b/src/out/modele/piece/Fou.class differ diff --git a/src/out/modele/piece/Reine.class b/src/out/modele/piece/Reine.class index 9c2b03c..05f711f 100644 Binary files a/src/out/modele/piece/Reine.class and b/src/out/modele/piece/Reine.class differ diff --git a/src/out/modele/piece/Roi.class b/src/out/modele/piece/Roi.class index 6a7e538..16bd726 100644 Binary files a/src/out/modele/piece/Roi.class and b/src/out/modele/piece/Roi.class differ diff --git a/src/out/modele/piece/Tour.class b/src/out/modele/piece/Tour.class index 7d22e55..d3b58d5 100644 Binary files a/src/out/modele/piece/Tour.class and b/src/out/modele/piece/Tour.class differ diff --git a/src/out/reseau/TypeMessage.class b/src/out/reseau/TypeMessage.class index e104126..d0e8e72 100644 Binary files a/src/out/reseau/TypeMessage.class and b/src/out/reseau/TypeMessage.class differ diff --git a/src/out/vue/CaseSwingUI.class b/src/out/vue/CaseSwingUI.class index 50e3888..dba6549 100644 Binary files a/src/out/vue/CaseSwingUI.class and b/src/out/vue/CaseSwingUI.class differ diff --git a/src/out/vue/Vue.class b/src/out/vue/Vue.class index 3a85e1f..28ab326 100644 Binary files a/src/out/vue/Vue.class and b/src/out/vue/Vue.class differ diff --git a/src/out/vue/VueConsole.class b/src/out/vue/VueConsole.class index d8256f1..09a8f4d 100644 Binary files a/src/out/vue/VueConsole.class and b/src/out/vue/VueConsole.class differ diff --git a/src/out/vue/VueGraphiqueSwing$1.class b/src/out/vue/VueGraphiqueSwing$1.class new file mode 100644 index 0000000..468f66b Binary files /dev/null and b/src/out/vue/VueGraphiqueSwing$1.class differ diff --git a/src/out/vue/VueGraphiqueSwing.class b/src/out/vue/VueGraphiqueSwing.class index f90e876..72bae30 100644 Binary files a/src/out/vue/VueGraphiqueSwing.class and b/src/out/vue/VueGraphiqueSwing.class differ diff --git a/src/reseau/TypeMessage.java b/src/reseau/TypeMessage.java index 62ddff2..1529f9b 100644 --- a/src/reseau/TypeMessage.java +++ b/src/reseau/TypeMessage.java @@ -1,7 +1,11 @@ package reseau; public enum TypeMessage { - DEMANDE_DE_PARTIE, - MOUVEMENT, - FIN_DE_PARTIE + DEMANDE_DE_PARTIE, // Un joueur veut lancer une partie + MOUVEMENT, // Transmission d'un coup + FIN_DE_PARTIE, // Signal de fin + + SYSTEME, // Message système (erreur, info serveur, etc.) + CHAT // Message chat entre joueurs } + \ No newline at end of file diff --git a/src/vue/CaseSwingUI.java b/src/vue/CaseSwingUI.java index 89c89d8..536c2c6 100644 --- a/src/vue/CaseSwingUI.java +++ b/src/vue/CaseSwingUI.java @@ -209,21 +209,21 @@ public class CaseSwingUI extends JPanel implements MouseListener{ // Conversion du symbole en caractère Unicode if (piece == null) return ""; String symbole = piece.getSymbole(); - return switch (symbole) { - case "BP" -> "♟"; - case "BC" -> "♞"; - case "BF" -> "♝"; - case "BT" -> "♜"; - case "BR" -> "♛"; - case "BO" -> "♚"; - case "NP" -> "♟"; - case "NC" -> "♞"; - case "NF" -> "♝"; - case "NT" -> "♜"; - case "NR" -> "♛"; - case "NO" -> "♚"; - default -> symbole; - }; + switch (symbole) { + case "BP": return "♟"; + case "BC": return "♞"; + case "BF": return "♝"; + case "BT": return "♜"; + case "BR": return "♛"; + case "BO": return "♚"; + case "NP": return "♟"; + case "NC": return "♞"; + case "NF": return "♝"; + case "NT": return "♜"; + case "NR": return "♛"; + case "NO": return "♚"; + default: return symbole; + } } diff --git a/src/vue/Vue.java b/src/vue/Vue.java index cf6d119..a358852 100644 --- a/src/vue/Vue.java +++ b/src/vue/Vue.java @@ -2,10 +2,13 @@ package vue; import modele.Coup; import modele.Plateau; +import reseau.TypeMessage; public interface Vue { Coup demanderCoup(Plateau plateau); // Demande un coup au joueur void afficherPlateau(Plateau plateau); // Affiche le plateau actuel - void afficherMessage(String message); // Affiche un message (texte) + void afficherMessage(TypeMessage type, String message); // Affiche un message (texte) void setDernierCoup(Coup coup); // Met à jour le dernier coup joué + void setTour(String tour); + void setScore(String score); } diff --git a/src/vue/VueConsole.java b/src/vue/VueConsole.java index c6cc3f9..8c202a5 100644 --- a/src/vue/VueConsole.java +++ b/src/vue/VueConsole.java @@ -5,6 +5,7 @@ import modele.Case; import modele.Coup; import modele.Plateau; import modele.piece.Piece; +import reseau.TypeMessage; public class VueConsole implements Vue { @@ -62,7 +63,7 @@ public class VueConsole implements Vue { @Override - public void afficherMessage(String message) { + public void afficherMessage(TypeMessage type, String message) { System.out.println(message); // Affiche le message dans la console } @@ -78,4 +79,14 @@ public class VueConsole implements Vue { System.out.println("Dernier coup joué : " + coup); } + @Override + public void setTour(String tour) { + System.out.println("Tour : " + tour); + } + + @Override + public void setScore(String score) { + System.out.println("Score : " + score); + } + } diff --git a/src/vue/VueGraphiqueSwing.java b/src/vue/VueGraphiqueSwing.java index 4fea97a..9d54b51 100644 --- a/src/vue/VueGraphiqueSwing.java +++ b/src/vue/VueGraphiqueSwing.java @@ -2,114 +2,160 @@ package vue; import java.awt.*; import javax.swing.*; +import jdk.jfr.Percentage; import modele.Coup; import modele.Partie; import modele.Plateau; - +import reseau.TypeMessage; public class VueGraphiqueSwing implements Vue { private Coup c; - JFrame fen = new JFrame("CHESS GAME"); + private final JFrame fen; private final PlateauSwingUI plateauUI; - //private Coup dernierCoup; - // Journal systeme - private final JTextArea zoneSystem = new JTextArea(10, 24); - private final JScrollPane scrollSystem = new JScrollPane(zoneSystem); + // Colonne gauche (messages dynamiques) + private final JPanel panelMessages = new JPanel(); + + // Colonne droite (infos dynamiques) + private final JLabel lblDernierCoup = new JLabel("Dernier coup : "); + private final JLabel lblTour = new JLabel("Tour : "); + private final JLabel lblScore = new JLabel("Score : "); + private final JPanel panelSysteme = new JPanel(); - // zone de message for chat - private final JTextArea zoneChat = new JTextArea(10, 24); - private final JScrollPane scrollChat = new JScrollPane(zoneChat); - private final JTextField champChat = new JTextField(); - private final JButton btnEnvoyer = new JButton("Envoyer"); public VueGraphiqueSwing(Partie partie) { + fen = new JFrame("CHESS GAME"); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - fen.setResizable(false); + fen.setResizable(true); fen.setLayout(new BorderLayout()); - //Centre : Gestion du plateau - plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this); // Passe le modèle - fen.add(plateauUI, BorderLayout.CENTER); - + // Plateau + plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this); + plateauUI.setPreferredSize(new Dimension(500, 600)); - // Journal systeme (droite, haut) - zoneSystem.setEditable(false); - zoneSystem.setLineWrap(true); - zoneSystem.setWrapStyleWord(true); - zoneSystem.setBorder(BorderFactory.createTitledBorder("System")); + // Colonne droite (infos + messages système) + JPanel droite = new JPanel(new BorderLayout()); - // chat - zoneChat.setEditable(false); - zoneChat.setLineWrap(true); - zoneChat.setWrapStyleWord(true); - zoneChat.setBorder(BorderFactory.createTitledBorder("Chat")); + // Haut -> infos + JPanel panelInfos = new JPanel(); + panelInfos.setLayout(new BoxLayout(panelInfos, BoxLayout.Y_AXIS)); + panelInfos.setBorder(BorderFactory.createTitledBorder("Infos")); + panelInfos.add(lblDernierCoup); + panelInfos.add(Box.createVerticalStrut(10)); + panelInfos.add(lblTour); + panelInfos.add(Box.createVerticalStrut(10)); + panelInfos.add(lblScore); - JPanel chatBas = new JPanel(new BorderLayout(6,0)); - chatBas.add(champChat, BorderLayout.CENTER); - chatBas.add(btnEnvoyer, BorderLayout.EAST); + droite.add(panelInfos, BorderLayout.NORTH); - JPanel chatPanel = new JPanel(new BorderLayout(0, 4)); - chatPanel.add(scrollChat, BorderLayout.CENTER); - chatPanel.add(chatBas, BorderLayout.SOUTH); + // Bas -> messages système + panelSysteme.setLayout(new BoxLayout(panelSysteme, BoxLayout.Y_AXIS)); + JScrollPane scrollSysteme = new JScrollPane(panelSysteme); + scrollSysteme.setBorder(BorderFactory.createTitledBorder("Système")); + droite.add(scrollSysteme, BorderLayout.CENTER); - // Colonne droite : systeme (en haut) et chat (en bas) - JPanel coloneDroite = new JPanel( new BorderLayout(0, 8)); - coloneDroite.add(scrollSystem, BorderLayout.CENTER); - coloneDroite.add(chatPanel, BorderLayout.SOUTH); + // === Colonne gauche (messages serveur) === + panelMessages.setLayout(new BoxLayout(panelMessages, BoxLayout.Y_AXIS)); + panelMessages.setPreferredSize(new Dimension(200, 0)); + panelMessages.setMinimumSize(new Dimension(200, 0)); + JScrollPane scrollMessages = new JScrollPane(panelMessages); + scrollMessages.setBorder(BorderFactory.createTitledBorder("Messages (serveur)")); - fen.add(coloneDroite, BorderLayout.EAST); + // === JSplitPane centre (plateau + droite) === + JSplitPane splitCentre = new JSplitPane( + JSplitPane.HORIZONTAL_SPLIT, + plateauUI, + droite + ); + splitCentre.setDividerLocation(800); + splitCentre.setResizeWeight(0.7); + splitCentre.setOneTouchExpandable(true); - // Ecouteur pour envoyer le chat - btnEnvoyer.addActionListener(e -> envoyerChat()); - champChat.addActionListener(e -> envoyerChat()); + // === JSplitPane global (gauche + centre) === + JSplitPane splitGlobal = new JSplitPane( + JSplitPane.HORIZONTAL_SPLIT, + scrollMessages, + splitCentre + ); + splitGlobal.setDividerLocation(200); + splitGlobal.setResizeWeight(0.0); // tout l'espace supplémentaire va à droite + splitGlobal.setOneTouchExpandable(true); - fen.setSize(1000, 800); - //fen.pack(); // ajuste la taille selon le contenu - fen.setLocationRelativeTo(null); // centre la fenêtre à l'écran + // Ajout final + fen.add(splitGlobal, BorderLayout.CENTER); + + fen.setSize(1400, 800); + fen.setLocationRelativeTo(null); fen.setVisible(true); } - public void envoyerChat() { - String message = champChat.getText().trim(); - if (!message.isEmpty()) { - zoneChat.append("Vous: " + message + "\n"); - champChat.setText(""); - } + private JPanel createMessageBlock(String text, Color bg, Color fg) { + JLabel lbl = new JLabel(text); + lbl.setForeground(fg); + + JPanel block = new JPanel(new BorderLayout()); + block.add(lbl, BorderLayout.CENTER); + + // Style + block.setBackground(bg); + block.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(5, 10, 5, 10), // marges internes + BorderFactory.createLineBorder(Color.GRAY, 1) // bordure + )); + + // Taille fixe : largeur dynamique, hauteur compacte + block.setPreferredSize(new Dimension(0, 35)); // hauteur 35 px + block.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35)); // largeur étirable, hauteur fixée + block.setMinimumSize(new Dimension(100, 35)); + + return block; + } + + + // Ajouter message serveur (colonne gauche) + public void ajouterMessageChat(String message) { + SwingUtilities.invokeLater(() -> { // assure que c'est dans le thread Swing + JPanel block = createMessageBlock(message, Color.WHITE, Color.BLACK); + panelMessages.add(block); + panelSysteme.add(Box.createVerticalStrut(8)); + panelMessages.revalidate(); + panelMessages.repaint(); + }); + } + + // Ajouter message système (colonne droite bas) + public void ajouterMessageSysteme(String message) { + SwingUtilities.invokeLater(() -> { + JPanel block = createMessageBlock(message, new Color(255,220,220), Color.RED); + panelSysteme.add(block); + panelSysteme.add(Box.createVerticalStrut(15)); + panelSysteme.revalidate(); + panelSysteme.repaint(); + }); } // API de la Vue - public void afficherMessageSysteme(String msg) { - SwingUtilities.invokeLater(() -> { - zoneSystem.append(msg + "\n"); - zoneSystem.setCaretPosition(zoneSystem.getDocument().getLength()); - }); - } - - public void afficherMessageChat(String auteur, String msg) { - SwingUtilities.invokeLater(() -> { - zoneChat.append("[" + auteur + "]: " + msg + "\n"); - zoneChat.setCaretPosition(zoneChat.getDocument().getLength()); - }); - } - @Override - public void afficherMessage(String message) { - // Affichage du message dans la fenêtre graphique + public void afficherMessage(TypeMessage type, String message) { + switch (type) { + case CHAT : ajouterMessageChat(message); + case SYSTEME : ajouterMessageSysteme(message); + default : System.out.println("[INFO] " + message); + } } @Override public Coup demanderCoup(Plateau plateau) { while(this.c == null) { try { - Thread.sleep(20); // Attendre un court instant avant de vérifier à nouveau + Thread.sleep(20); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); return null; } } Coup r = c; - c = null; // pret pour le coup suivant + c = null; // prêt pour le coup suivant return r; } @@ -125,7 +171,17 @@ public class VueGraphiqueSwing implements Vue { @Override public void setDernierCoup(Coup coup) { - //this.dernierCoup = coup; + lblDernierCoup.setText("Dernier coup : " + coup); plateauUI.applyLastMove(coup); } -} \ No newline at end of file + + @Override + public void setTour(String tour) { + lblTour.setText("Tour : " + tour); + } + + @Override + public void setScore(String score) { + lblScore.setText("Score : " + score); + } +}