From 802c85adfb9d0ed43bd03fe1f1e973e0403f8c4e Mon Sep 17 00:00:00 2001 From: HP_pellel Date: Sat, 13 Sep 2025 23:27:56 +0200 Subject: [PATCH] Jouable --- src/Main.java | 124 +++++++------- src/controleur/ControleurPartie.java | 28 ++-- src/modele/Coup.java | 41 +---- src/modele/Partie.java | 2 +- src/modele/joueur/JoueurHumain.java | 4 +- src/modele/piece/Fou.java | 45 ++++- src/modele/piece/Reine.java | 49 +++++- src/modele/piece/Roi.java | 33 +++- src/modele/piece/Tour.java | 53 +++++- src/out/Main.class | Bin 1706 -> 1734 bytes src/out/controleur/ControleurPartie.class | Bin 3097 -> 3264 bytes src/out/modele/Coup.class | Bin 1122 -> 1122 bytes src/out/modele/Partie.class | Bin 3425 -> 3297 bytes src/out/modele/joueur/JoueurHumain.class | Bin 658 -> 658 bytes src/out/modele/piece/Fou.class | Bin 500 -> 1855 bytes src/out/modele/piece/Reine.class | Bin 504 -> 1965 bytes src/out/modele/piece/Roi.class | Bin 531 -> 1140 bytes src/out/modele/piece/Tour.class | Bin 502 -> 1956 bytes src/out/reseau/TypeMessage.class | Bin 1015 -> 1120 bytes src/out/vue/CaseSwingUI.class | Bin 6037 -> 5990 bytes src/out/vue/Vue.class | Bin 290 -> 371 bytes src/out/vue/VueConsole.class | Bin 2690 -> 2916 bytes src/out/vue/VueGraphiqueSwing$1.class | Bin 0 -> 638 bytes src/out/vue/VueGraphiqueSwing.class | Bin 5569 -> 6512 bytes src/reseau/TypeMessage.java | 10 +- src/vue/CaseSwingUI.java | 30 ++-- src/vue/Vue.java | 5 +- src/vue/VueConsole.java | 13 +- src/vue/VueGraphiqueSwing.java | 194 ++++++++++++++-------- 29 files changed, 409 insertions(+), 222 deletions(-) create mode 100644 src/out/vue/VueGraphiqueSwing$1.class 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 c27376b709655a2e939df4dea27098d39fbeca3b..d21796906e632de72b477a5bd0124a1283f39436 100644 GIT binary patch delta 146 zcmZ3*dyIF(1s2BFn=i8PFxJ;G$TKi7h%hiSh%vA+h%<09NHFj+NHb_K$TH|M$T1i& zC@`2ZC^A?uC^OhHs4zG%s4=)QXfgOQXfwnx=rCk6=rL3<7&1&@FlLy;V8Sq;!JJ_c zgC)Zn1}ld33^okg8EhH$GdMDwVQ^x&#NfhkpTU*kDT61&R|YSJUku)p9oVt}A1WJ? delta 118 zcmX@cyNY+i1s2Bhn=i8PFeWE4NH8!kh%hiSh%vA+h%<09NHFj+NHJ(INHZ8P$S_zi z$TB!E$TPSys4)04s4~Pbs4-+SXfRYTXfaG-&}Nv=pvSO?L7!nggCWCq1|x?34CV}% X7%Ui`GPp8)WpHEo#o#_UhAj&KwW<~4 diff --git a/src/out/controleur/ControleurPartie.class b/src/out/controleur/ControleurPartie.class index b8373b83498193345bd3c7d848626cf3e849f81b..71d454787cb5f3c8b536bad3e522032aec846a71 100644 GIT binary patch delta 1368 zcmbO!aX^ym)W2Q(7#J8_7*=iMdd?WY$)Lla%g&(3!=TS#z{ns}lvN-Rs%&q>Tn*AFf!%FIi*)(qofaAI&~XK>+R zaAk0te2K}9+k?TAoxzKT!JENnvNW@$niGQ`4}(908zTd6dTNPReralHkzamhkq`qT zLmLa8W=#$!h6o;pNQS7%8Z0UtHViR546zJx zlS5dv>YW%8co-5vhVsD;bxbbFOcP>YVzA(1;9yAMVMt|QV`Sh?$}dgMNp(r}N-YIB zHl2qdgCUcVfjzaj#4R%~laYa0Lo*5_lg-1B1Jc2nm0y}#6p~+B1QN~TVaR7FU}ON< zF$V}eF zF2^`?@-%jN#@Um%u`4OgWn|#7Q*bRRN-Zq{DduNmn9s$qfMFp!!y-_)FP{99{W9aS z$!9sVSXMAH$W6Y$Aval)(~7l&fsvteas;P#eHQ}*gA@ZB0|SE~0}F!?11Ezp10RD3 zgD`_AgCv6(10zE>0~<&+0|UcD1{MZJ1_p+On;0a8f@pOpt+|asQELkW?}0TJWGcYhnGH@_RF$ge7Ge|JVF&Hq& zGlViIFeEc5)iV?_C^IxNs4~o9P-9rYpw7SuN>mUJGbS^zFfcPPFx-Y%oi>YMHiQ-L z1EI4ZRIV?`hdMhM3L!3oh(cVdbBsX-B)f@0TYDRWyAC*DN?~rThld#ZHU@}4%3yL^ z7!J1(agB`;L2788m3=Rxu7#taHF*q^wfYTTY z!(WDQb_Nf2hTi`S1`Les3>*xMUhE825)8}?{R|8YObinkCNeNEs4=iH%wu3=m;@%L gfXQiKat4^31t#Y(EMZ_^;9_88Sjw=RVI_kk0GjJCwg3PC delta 1131 zcmX>gIa7k`)W2Q(7#J8_7#3~hdd?`p!Jxy)!0O_fRGQAkpvR!k&S1d9V8~!J*^$YM z&4h=+l)-HBL?%~m3kFMe1}h#0YX-H+51C|mxfpC2?ARIXc^DiR94DJG+i^QHxUe(0 z@-VnDxKFNUw&bv7@Z@3eVsM;%fLVmi2V|1(2l3x-@ChCGJ+$@Q!noIXMf zEDR>>48@a=u&T=zF_iK!lrgw7GH|7*miVR?7bm8t3Nf%Um~b#uPUc{fW2~O6&Su6~ zJ2{RmgRy?{aklx4ZIjd4Js7(uZ(tW;?45j+U5&AS@*8$V#)*^pIOG{8PuAm5Qk=@j zz+oISaa<1))UMh4Z%b2(I**%=m0F5rx2 zZD3$zXqq{$ToU!07$k+Xw=pPcZDHWm+QJ~ZgF$x}gE0fcP6l%(2B;wWHU^t* z3{F~G7}&Qlcx+>E+Qs0Fq(aCKu2?7l&V;BA+Q|@xY)%wdcPvczwt9xRjSLJ7j0_+j z7%}iLFfd3ka4<+R2rx)7NHEASC@{z~m@+6Zgfl2IBrzy6TbsSql|7vwRWoeVil^+-U}2AR*Ry^Wz{7ehH*v=(HHPz5|hgsKqC8Yr`# zfmf&w%-+br$iT&r%TT~j#J~g&4lf2F1_lNl22c(aV$f%hWH4Y*WH4mVW-wx~W-wu} zXE0?5Ww2n#Ww2%_V6bE;WUyjrX0T>xW3XeG$Y9SfhrxkiIfEm^CI%;l7H|S#Vff1s z!p`8#&d~awL5hKqoxzs_L>7rMFf+6>FfcGNbTD)>FfgbwurW+yU}We5lRaRv4@^z~ alas*Y6oxqr3=CWhj0|%b<})m0kOTnXN$6kz diff --git a/src/out/modele/Coup.class b/src/out/modele/Coup.class index dc826b07a6b7b73a856b90b62e9075b72c50bcb8..0a82ef7ce5d443856fc721f5e475d2279ae9812c 100644 GIT binary patch delta 66 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 delta 149 zcmZ3>|AU$9)W2Q(7#J8_8002$ot~`4Tr0+)$RNPL!~gEnsBe zN>45EFUm~M%u8it5Yo`}$x19s)K4rg(GSSa%qy`5X_n(*kO%4HOHVCvNi8nP%u6iE z%+KRwP-IYIXHe#0P+?GIWZ*;9$;iN1!N|bq$yv{!$e_-{paD|DSjokp#h}g3pu@wU z%b*9-l#`g3uJ4;zlEKKpoS0P1$iSlEsp-kZV8CF=&S1pDV9a2`$iN46cR)^JNory# zBLjPSYKe1VaVjH&poXWXrVmseBxKFSV8&q1&S1gAU|G*#h2&|ldiK=flCaE_R7M77 z4b3Q!S{oh)TLwEu29EU9l7P(A#UKQtt+z4QYi(n2Udq7EvYdg1c?|;t z0}}(t`9@%e2{N!U2r+Ooh%g8;h%$&Xh%v}9h%=}%NHN$m$S`;^$T9>oC@>^4C^KX; zs4%!OFfiyau>WVUW#D9I5MpPLU}rF3XHaBkP-J9eWMp7ql>Eye&&bI5he3gz!Hn5~ Mk%5uH8*HTy0E(TA)Bpeg delta 112 zcmeyuF`0$y)W2Q(7#J8_7!)RQotzxNq|GQjxrV8VQGD`uCQVTZ1_lN`24)5Z1`Y;R z22KWX1}+B4$)?O2#!?K73^EL|42%ro3=9k)9!M1v^BM*Q21W*uJ~jqM1_lOx21W)s K1_lNu26+I^-VTTW diff --git a/src/out/modele/piece/Tour.class b/src/out/modele/piece/Tour.class index 7d22e55724dadaf21597f783510fa15323f9f707..d3b58d5567c0956d8175be3c681ce315a868b168 100644 GIT binary patch literal 1956 zcmX^0Z`VEs1_l>~JT3+%24;2!79Ivx1~x_pq1^nG)SOiPg3Q$9RQ&)D$;iNFlbM%U zV#mlJtlH5JXMVWc&)*K9Cj0{YEAzTa+43g{&QalXO3^I%i+)#6z^GgdD8Mx9@OZ}cP_k_<)$=ES68 zMg|rQPfbsdQUe|aLk1&82Ikzv3PuK24NtJR34;%V38T6kz4-sl_E>nJKA^49psuQJf48 z436v!PCN|G3@(fe0$|^PT^d|jT#}m0$iSRmTEfU63JI~yeEoo;%)FA|lA_eaTx%f) z1_n1C26qMzMh5ZR#Oze({JiAElJLxu4Cnm3;*!L?l43>%F|Y%XOol`p7lRjrH#>t5 z4}&j*A0vY>SOKa9j124rAnS7S7#T!0AWncd4q}967|5#uJPd&hL5vI>>8T~qBrB$& z2@4TOLIR6hgHn444?`$J7$iwRlQAQM5JEjv%$kcqfFXpDfyFr=6juB`nR%&xrMXF| zMInhvprptfT#}fa?VDHt<%^^im$;-B^1Vv*=WkD(y<<+OH!>F8F)PN@=}YOa}tY- zQ;XRdvKSduG5mzhsq73nj0|%4l`=B0LHxy_$RNPL!~gv;GjK34ure?*L^H%d>|wmZz|0`Tz`)3(y^TTK zPkS4KtQCvy76t_~R^2TOYG!PbEFca$h*C4-5M`guASTK#z`mG)UzB4u1D7a=0Q(XK zR^~OL?4qnGI~X+0I7K-`*}yC=QO=nRT%uevLGsLI+#n@O7&uwXxR*2Vf;fv9*qF?? znay}WTEH?qAQ=u(Hn0qjD5ogb4hDTQUKTSxQ9e=LMGOw2tfG9P+!+aG{Gx24e4;!V z31$L1qWq!)+Zc?k1SJKxF<8!G5ZT0F4-(tO;L5gol zf+{@$b_NM{1`~D$MRo>7Mn*8LWgH o7#WxuV!?ihV~A&9VBlb2WJqFQWJqAh0H+d0hD?TRhFk_o0GkcU-T(jq delta 149 zcmZ3&|BadJ)W2Q(7#J8_8002$otmu4TqDMy$RNPL!~gOhDE!GB7kSFff69!oUpHE6>2pz|6qF zz^p-!wJ{1z+@``U#30PhAi%>Q!XP^FsUo*Hg9JN+BoBiW zgY;xU#!wD%23Z~kIR^R3d5oHZvK$PY91J{M42%q_JPc|K>XX+ozONT&U|?WzkYr$G zU}Io#kYwP5(mWtqK#GB%L4bjQft7)iL4!e^fssLzfq_AZfsp|OxHd8HZetKUz#z1N zfq{XML5qQbfekFj%)rSY#h}f=1Xa%j7UdFR)Y`!yc7TBquD%|wK?h_FBLhPN0|OJt z%?!+7z48pq49pA+4D4FkGTRwsHey%=(#Off0CuJT1A{IDNWY!{7s!WD_v$mSfSk)9 z&bF6c!@;1>pa<0*1l6s#n}IP>NP&4fgW_fe zW-v#I1t|u$Wng8HVqjxXXJBSvg1XaygTWB&U?Tvi CY%^N` diff --git a/src/out/vue/CaseSwingUI.class b/src/out/vue/CaseSwingUI.class index 50e3888aad61b40cc01b33fe5c7bac13bfa74cd9..dba6549b3ecc94d4db268df46c167046ef25ce34 100644 GIT binary patch delta 258 zcmbQL|4eT~qA;fp0}}%)0|Vo#%~`_sjP>~p5WvmAz+lh7z~Iclz~Iinz~Ifmz~Ilo zz!1#9z!1*Bz!1&Az!1;Cz>v(qz>vqD>$hbk6k$HnKBkKlXM)nQDjGP;U8M!y$ z64%+lz`(%7D9XUV;KU%nz`$^cft}%U8Uqi*6~+pNtBf@a*BBcZt~0hU++gfrxXIYV zaEoyQ!)?YX40jl3Fx+LF!*Gvr0mFU9B@7Q3S1>$e6k}ju&|r{e|Hn|l&Y;N7pvcGv U2K*qv^P9ne83}COD|&+w0K@$;1poj5 delta 306 zcmaE+H&uT_qA+JP0}}%)0|Vos%~`_sjP>md5WvmAz+lh7z~IWjz~Ifmz!1p5z!1*B zz!1y8z>v(qz>vwnz>v?tz);G-z);P=z|bhn$he%rO_-5+IfH{RBkOVoD`7_V&e2pMima YnVo@yo#8q=gCYYXJA>lpKG7SD0B&?Q+W-In diff --git a/src/out/vue/Vue.class b/src/out/vue/Vue.class index 3a85e1fc1beb92aaa2ff063c9817e5f6effbcbfa..28ab326962d6fbac75f4dd3b318adf6ce68cf4d7 100644 GIT binary patch delta 123 zcmZ3)^qGn4)W2Q(7#J8_7=$KrO%T)6@F_|yPE9P;52-9j^-V1<~5!zU}TEKxrvF)v*|xTGjEFWp)*jFEw(IJG1=Ilm}%;uU2^wuwI!q*xdk Zcp3N@7+4q?_(3!SBZB|~0|OI-AOOSWA!7gl delta 45 zcmey&w1|o8)W2Q(7#J8_82Bf0O<)q$n7F}evN)q6Bgff$?3=9k|40ASe-DKevVqjs25@KLwh+=0bocxR>jj>{~FKdvPriM>Z zYH?~}seVXhL8@jQqYlXpS_~Wv+6)2=x(pHwdJHNI`V2Y@1`H+)h72|g zMhxx@CJcTIrVMcm`V1)y77PUpmJAgPx(sy;HVkbHwqQ3%GO+z&5MunpAk6rOL4lpY z^B05IF9z0M43Z3t4Al%ZQ0J&HFflNLLT(d-kh0D;1|38=aWOD4FfceXurs(YFfkZ2 zn1HlQKEtUm3koYfur_xFP6iJKAqGzdMuu93IEE7@8Rv s7}OZp7$z_ff$?3=9k|43jr<-DF{AXUL!YfhCQxY;rhj(B!MEDwFxxjAR-Z8JHOr zYB(607#Ua;z^oQV1||hY4u-bLF>I28{A>&zTnwEIUF;0qJPZyDJ(Cx+U1sTLWKf-a zo=ugFonay)gWTlvY;uzivkO_}F)%Q&F)%W)g2@5~1_oIMMg~R(1_oBG?F@_?85kHC z8496_7#KJh7#WHfiWwLg3MTV&w55V%oEQWc7#R2%xEc5vgc$@FBp8Gl6c|Jp)EPt> z^cln$3>hRD%o(H@Y#F2(Tp45-d>P~zf*Ir)A{i7I;u#bfQW;bjO28&C{$ns?XJBV% zP-SN*Wng3|XQ%+%^owJLC&DI81`Y--1_1^g1_=gT1{DT91|0@{1``GY1{(%L26qNy z20sQ9hByX2h7<;Kh5`l)h6)B9hB^johBgKphLXv*ITb7`!QKRUSA~Izfr){EfnyVc zkoGnP9fXg$z~W8}>dN*NdWttPQ(BJ diff --git a/src/out/vue/VueGraphiqueSwing$1.class b/src/out/vue/VueGraphiqueSwing$1.class new file mode 100644 index 0000000000000000000000000000000000000000..468f66b1f419960ae9b7226f9f9c94b6b615e367 GIT binary patch literal 638 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 R2+BkP9E_=q>5Q2Sk^nk>t!@AS literal 5569 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 LGe!$WD+WmbV7s;; 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); + } +}