From 564aceb19301868b6e68020d9abd528998570c37 Mon Sep 17 00:00:00 2001 From: HP_pellel Date: Sun, 7 Sep 2025 14:44:32 +0200 Subject: [PATCH] MISE A JOUR --- src/Main.java | 124 ++++++------ src/controleur/ControleurPartie.java | 17 +- src/modele/ModeDeJeu.java | 2 +- src/modele/Partie.java | 17 +- src/modele/Plateau.java | 8 +- src/modele/joueur/JoueurHumain.java | 4 + src/out/Main.class | Bin 1409 -> 1706 bytes src/out/controleur/ControleurPartie.class | Bin 3097 -> 3097 bytes src/out/modele/ModeDeJeu.class | Bin 1119 -> 1119 bytes src/out/modele/Partie.class | Bin 3201 -> 3425 bytes src/out/modele/Plateau.class | Bin 2740 -> 2876 bytes src/out/modele/joueur/JoueurHumain.class | Bin 586 -> 658 bytes src/out/vue/CaseSwingUI.class | Bin 1751 -> 6037 bytes src/out/vue/PlateauSwingUI.class | Bin 904 -> 2973 bytes src/out/vue/Vue.class | Bin 246 -> 290 bytes src/out/vue/VueConsole.class | Bin 2496 -> 2690 bytes src/out/vue/VueGraphiqueSwing.class | Bin 955 -> 5569 bytes src/vue/CaseSwingUI.java | 231 +++++++++++++++++++--- src/vue/PlateauSwingUI.java | 115 ++++++++++- src/vue/Vue.java | 1 + src/vue/VueConsole.java | 8 +- src/vue/VueGraphiqueSwing.java | 103 +++++++++- 22 files changed, 507 insertions(+), 123 deletions(-) diff --git a/src/Main.java b/src/Main.java index 048d091..87abb23 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,68 +1,72 @@ -import controleur.ControleurPartie; -import controleur.ControleurReseau; - -import modele.ModeDeJeu; -import modele.Partie; -import modele.Couleur; - -import vue.Vue; -import vue.VueConsole; -import vue.VueGraphiqueSwing; - -import modele.joueur.Joueur; -import modele.joueur.JoueurHumain; + 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 + 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 - modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN; + 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; + } + } + + // 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"); + + Partie partie = new Partie(joueurBlanc, joueurNoir, stylePlateau); + + switch (choixAffichage) { + case 1 -> vue = new VueConsole(); + case 2 -> { + // vue = new VueGraphiqueJavaFX(); + } + case 3 -> vue = new VueGraphiqueSwing(partie); + 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); + // } - // 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"); - - Partie partie = new Partie(joueurBlanc, joueurNoir); - - switch (choixAffichage) { - case 1 -> vue = new VueConsole(); - case 2 -> { - // vue = new VueGraphiqueJavaFX(); - } - case 3 -> vue = new VueGraphiqueSwing(partie.getPlateau()); - default -> { - System.out.println("Type d'affichage non reconnu. Console par défaut utilisée."); - vue = new VueConsole(); - } + // lancement de la partie + var controleurPartie = new ControleurPartie(partie, vue, controleurReseau, modeDeJeu); + controleurPartie.lancerPartie(); } - - // 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(); } -} diff --git a/src/controleur/ControleurPartie.java b/src/controleur/ControleurPartie.java index 39a1e8d..6745396 100644 --- a/src/controleur/ControleurPartie.java +++ b/src/controleur/ControleurPartie.java @@ -1,10 +1,9 @@ package controleur; -import modele.joueur.*; import modele.Coup; -import modele.Partie; -import modele.Plateau; import modele.ModeDeJeu; +import modele.Partie; +import modele.joueur.*; import vue.Vue; @@ -26,6 +25,8 @@ public class ControleurPartie { System.out.println("BIENVENUE AU JEU D'ÉCHECS"); System.out.println("===============================\n"); + System.out.println("DEbug"); + vue.afficherMessage("Mode de jeu : " + modeDeJeu); vue.afficherMessage("Joueurs : " + partie.getJoueurBlanc().getNom() + " (Blancs) vs " + partie.getJoueurNoir().getNom() + " (Noirs)"); @@ -44,10 +45,14 @@ public class ControleurPartie { try { Joueur joueurPrecedent = partie.getJoueurActif(); // AVANT le tour partie.jouerTour(); // Moteur de jeu - Coup dernierCoup = partie.getHistorique().get(partie.getHistorique().size() - 1); + Coup dernierCoup = partie.getDernierCoup(); + vue.setDernierCoup(dernierCoup); vue.afficherPlateau(partie.getPlateau()); - //System.out.println(""); - vue.afficherMessage("Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); + + if(dernierCoup != null) { + vue.afficherMessage("Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); + } + vue.afficherMessage("\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); } catch (IllegalArgumentException e) { vue.afficherMessage("> Erreur : " + e.getMessage()); diff --git a/src/modele/ModeDeJeu.java b/src/modele/ModeDeJeu.java index d12e80f..17ea6aa 100644 --- a/src/modele/ModeDeJeu.java +++ b/src/modele/ModeDeJeu.java @@ -1,6 +1,6 @@ package modele; public enum ModeDeJeu { - IA_VS_HUMAIN, + HUMAIN_VS_IA, HUMAIN_VS_HUMAIN, RESEAU_SERVEUR, RESEAU_CLIENT, diff --git a/src/modele/Partie.java b/src/modele/Partie.java index 03a4904..8469d9b 100644 --- a/src/modele/Partie.java +++ b/src/modele/Partie.java @@ -1,11 +1,10 @@ package modele; -import modele.piece.Piece; -import modele.joueur.*; - -import java.util.List; import java.awt.Point; import java.util.ArrayList; +import java.util.List; +import modele.joueur.*; +import modele.piece.Piece; public class Partie{ private Plateau plateau; @@ -20,8 +19,8 @@ public class Partie{ private List listeCapturesBlancs; private List listeCapturesNoires; - public Partie(Joueur joueurBlanc, Joueur joueurNoir) { - plateau = new Plateau(); + public Partie(Joueur joueurBlanc, Joueur joueurNoir, String stylePlateau) { + plateau = new Plateau(stylePlateau); nombreCoups = 0; historique = new ArrayList<>(); listeCapturesBlancs = new ArrayList<>(); @@ -118,6 +117,12 @@ public class Partie{ public List getHistorique() { return historique; } + public Coup getDernierCoup() { + if(this.historique.isEmpty()) { + return null; + } + return this.historique.get(this.historique.size() - 1); + } public int getNombreCoups() { return nombreCoups; diff --git a/src/modele/Plateau.java b/src/modele/Plateau.java index 5a04ebf..68086bd 100644 --- a/src/modele/Plateau.java +++ b/src/modele/Plateau.java @@ -4,8 +4,10 @@ import modele.piece.*; public class Plateau { Case[][] cases; + String style; - public Plateau(){ + public Plateau(String style){ + this.style = style; // Création du plateau de jeu avec 64 cases cases = new Case[8][8]; for (int i = 0; i < 8; i++) { @@ -122,4 +124,8 @@ public class Plateau { } + + public String getStyle() { + return style; + } } diff --git a/src/modele/joueur/JoueurHumain.java b/src/modele/joueur/JoueurHumain.java index 3249f23..9e2bd5a 100644 --- a/src/modele/joueur/JoueurHumain.java +++ b/src/modele/joueur/JoueurHumain.java @@ -24,5 +24,9 @@ public class JoueurHumain extends Joueur { public Coup jouerCoup(Plateau plateau) { return vue.demanderCoup(plateau); // la vue s'adapte si c'est réseau ou pas } + + public void setVue(Vue vue) { + this.vue = vue; + } } diff --git a/src/out/Main.class b/src/out/Main.class index 75a55a3ccc4e6c19db203e896e51a65a47b451ca..c27376b709655a2e939df4dea27098d39fbeca3b 100644 GIT binary patch delta 1125 zcmZqVUd79G>ff$?3=9k|42cuD^kq31I2akYocuk5GgG2;)7z7#k7#VmxLVX=Q{o=!d<2@Zg62d$TA|MG4Pe+I#JA)V_17BHbs(x5$ zs&jr`aehuJ7lSARGdqJMBZE|KeoAUis(w~}X=-Vaz89GCD9ugG%;RK`W{_cLkmX^J zV~}TL;Df4ko;-t5SwxYMfz3CuBqOt!i$Q`xnTLUuL1prJMiXmk1~ncAb&v)YKY!04 z4hBs|2DX6IoSf7gb_Q)m241K!0f|K=nW{7lSQ>9Xo?P4}$}P@M!ozU2Clw z#?IhAc^`=?t8R91IXEv_)V_;$c0VW1U z237_(21bSe1_lOM21W)(1_lOJt?dkq8yOfF7#RW?7{JmD47?1S3_%RR5T%Ug8Q2)O z85kITGg`5-n6a^$u?w+Vafq_5Vqjn}1nXpAU}j)okYr$BP-I|W(A>npX~nXfL1GgF zzZFaUat47-3_>6Q4zR>-2GPjv4B|e!86+Y%F-U1M3n^@8Q1XRvRkfLgG`2G+`R!)V ziqz4S}Jr9l;qsbVCb`)L3k5` ziI7$OHU=A*8l8g-5;Gb2bq+8{SaC^mX>Vh2(uD}=A_?tgaEp}W)RttGWZBN(0aCb) z!5b7rOyD3&Vvt~9U=U$oW)NdwV-RQHWRPIsWsqXfV31}oV31+3V31{SV322UWl&-8 zWl*hWh+$A;$Y#)Bs9?}yn8KjVFrPt>VG)Bq!+HiohV2YS4Eq_(87?tcFg#^&W%$bA z#_)^5ogsvQfgy^4=Rbo611CE}C@B8e8NwME*%=}k7}(j_|1+?_B-k0a5K{jc{6O4L lc7|wnhFB1i2k{{~*%`DL7`T{t_=SWR7#ZRj7#Nrs5&)aT+d2RM delta 797 zcmZ3*+sMsz>ff$?3=9k|48aq*^kvu?I2alD%1Tr9!%9<~^Ye=Hb5gk&*cq7F8Mr6^ zVw4i#VqoTE;A7xtXAt0F5M&UVY{z7*C&I`e8&X-2s*s|dn3k5AoROHGs*snTr%;rd zoS&Chs>j73#vsnlAi={R$sjd(ACm@$>f# z;$SdhWMB(O&B;m4;b1UfWRUaCPf1lsNma;7Ed{$JH7_~8C{-c-@XDgYEA`kJ%orJX zbMsSDb5ivK5{pVQQ@I#S87x2+STZu`YfL`NC_ecdqbP@F7(0VCBZKth1ZGhIm`W=K zTaZe-$W&%If;46sYMV~>fE0b~ZB(QI1t0GZ{?4IvE(485kI( z85kJU7#J8dcQdd@ZfD^1Sr3=9nX3``6n^$e^GVhkJ%;tbpjk_;LQQVhln zvJ7Snatw|P3JjhMiVR*1stf@PY7C(a>I^9i8VqF&S`2jz+6?s!dJJ6*`V6xe3>fA! z7&3S;Ffdp$u>WV!VBlnD@MLH31_c2-gD)c^0|OTm7l-zL1`e1MJA*$M$p|q(RWL9z M1Tru%FfjxH0KYMdO#lD@ diff --git a/src/out/controleur/ControleurPartie.class b/src/out/controleur/ControleurPartie.class index 81056defe5d40b8c31b5b374657c91224dcf3b02..b8373b83498193345bd3c7d848626cf3e849f81b 100644 GIT binary patch delta 1271 zcmbO!F;jx;)W2Q(7#J8_7#3~hdd?`p!Jxy)!0O_fRGQAkpvR!k&S1d9V8~!J`5&Vf zn+XqtDTCQ$KPFdB3kFMe1}h#0>&bJN6u4~}?ARIXc^DiR948-Vvg3AUaA9X~64qElA4pM@0?#+V9m{7 z!H~eS^`%MQY@f>qE<6Zh=G~GM~H!i!GxWmcycAHx@-|cDGx&#gF7Pw zS9)rRZ)$OIVtT3&11p0G2SerLy{vMK)syeAnz7U}G9*v-Ws{h!$L7meKe>i&t{^)@ z8zTcZl4B-IvRjFDGcxe|=BK18q@*fjrIspKDKK&{^iIxXS7Yp-Jb_(NaUvsw6x5Xp z$@!%PAQcLU3R(H3hgX8sPM&;;T}g2&BLk0}f@@JxYH1Nj1wR|ZbS{P&3^UmoW`W{u z_GD3x%PjL48B`}ba;UPgGb~_akelqtAvf8S(~7l$fsvtcatWt)eG>x%gA@ZB0|SEq z0}F#711EzJ10RDhgD`^#gCv6}10zE-0~<&+0|Uc724)6E1_p*%n;0a8f@pOp ztqG;Iw=pPcZDHWm+QJ~ZgF$x}gE0fcP6l%(2B;wWHU^t*3{F~G7}&Qlc+_uWaN5P- zjif}#53X7$0M3Lc58BBPhHOw2Sa&Q;_cn&OjSLJ7j0_-888PrMFfd3ka4<+R2rx)7 zNHEASC@{z~m@+6Zgfl2IBrzy6!V9j8{V9#L65DLmH4Au+<43-Rq3|0)y z4Au;740a3?8SEM6FgP$QXK-ZL#Nfox0!}n641XCy*cqJJ8Cw4{NHH+7GjM>2B2flr zhIR%91}26MhE4_s1~mpYhG`6p3|(Nd2Tb;X$q5Y7Ac;v}&J>0@3=9lh42%qO8Rj!A HWRL^^@d*r# delta 1263 zcmbO!F;jx;)W2Q(7#J8_7?y41dd|qp#h}BW%g&(3!=TS#FqxCdi_M6K!I;5hawL;0 zrx}AeJA(xegXQGqObXoA3^wcxwmb}W4EB>RG1+lDGB~j_IP);LFt|>ZX0}wbW^m_W z@L;fKWZ+FtE%C}PO)V|*%g-zlVqj$O0vYPf$Y7x{*_%Ul@^oeyM&HR>n4K8?Cx2(w z@a4u!Wu=rG-2UMGVD^49w}NC5#NB8lF%C za}x8?_5G8wQj<%p*%?Y18Mt%vQ&MwM^_}xe3xpV$8N4`z7+4sL*cmD(`>?9ZRxnia zFw`)(GBR+brx@1*3Zbm@0*{Js*sYZkd<1hV5Pvw!7y>MFS{DcWJU&=$-CGUC(mG)Wt={F z8@rO?OhyJCI|bLGqSVqNkWzj&hS^*Ua~S5bGt2|U=KRS&*)KCLntYZ+i)9HTgWTi` z9CDK-IjvaR7#JDaCr5B<*LN^5Fi0`5F)%O)GO#cRF>o>nGw?BpFbFe*g5Z%F`y^Fz+fng_u zDH8)!kbN72)iwqPtt|}f+Zf!oF*xjE@MK`9hbs~CK`{N`Oo;M;oeUw!21S6iN5d@G z#t^fSfq{XM0puAy25trh21y1E1}O#s25ANf1~~>@26+a51_g#F1|^1624#j)233Y$ z1~rC>4E5>^jG(j$@gbu+12Y3N0|Ucuh`sT%7}_DM2p@NdS3M53T?J diff --git a/src/out/modele/ModeDeJeu.class b/src/out/modele/ModeDeJeu.class index 9c503e1d6e9d5d862857251cc258be4dfb3b1f41..59e0b0fba02c523b7304161725f3491ecdaefc4b 100644 GIT binary patch delta 23 ecmcc5ai3#?E{{j3ucN15d{}V2r{hLTH5LG1%m-fp delta 23 ecmcc5ai3#?E{~^Ud{}V2N2sr(r{6|PH5LG2KnGs{ diff --git a/src/out/modele/Partie.class b/src/out/modele/Partie.class index 9bd63444e541eca1bce17f1cc22ebb53d78a8636..63cba0abd18fff73b419f0358b6617ac0d62223b 100644 GIT binary patch delta 1900 zcmZpad?>|r>ff$?3=9k|3>zkLxwCQcFt9RkPgZ1>;N@iCW#D6H;OAiwU=W-bukXam zAk4!c!XV1Xz@3+$n^ctQoL^c{%*ep#$<83o$RM1RSeB??T9TQg?^slnSm~2lT*Ad5 z#=s0RNQ#F+nn7mb1tkw&200!Ec?KCq2H~8{;*wP7#DbF2qSRuioW#83Vvt%z9tI^$ zdB6P3qExWF3J-%SgW6;(MolYT1`QqtO$Iea2Cl69($vx-kSdTF+B^(8AYpEZuw!yb zW*QfR9)mtRg8>hNA%oH6xs2}ICJd(R3}!qG<_s2--!mFXY;K9z|$;05q;5~T)lL@2mlaYI}6^k8*2}2$aLq3DW&eqts~8<8 z3$p17B1s096lLb6Pqt-qncU8HUe6`9C@&M@AVvm$4Nafi{FKz3RDF;Otr;2k(o;+P z5D8#%I(uS0F9Q<;0|O@m6DYATFfcHI5()zY10%x}hN)n_DuWuB)`ZeJP+FQnhJle` z8dz>R0~07|!1*&6m_SJZiO9~Mcs2tAgBAl9 z0|SE?0}F#Vg8+jBgD8U}g93vTgEoUSgBgP?gEfO3g9C#+gDZmq10%y6hI%%Lix`U- zSQywC7#JRFZDG*T+QPuIjX~E3L~CzjFy6*s*$1KR`?fJSZDVlr)j7_k$i-`dgTv7E5VhjunDh!~Usm`Fwpv|DiV9H>? z;LKpi;LBjl5XoS|kjP-lkj-GlP{3f#(9B@V(9K}SFp0sQVIhM9!)gW>hHVV43`ZH< z87?yTFx+JDW4Olh9suyEtU<74ns2j`} zn86uBOlu2+q&6ftwIa7L2(ct=We@@d93wd3_!yWO7#LC+xEazIL>bZ<7#Zd>EP$FJ z3-t#p$bB2oypqMh$gq%M5d#xAAIR1tsg*@nn+MHZiy0UhmLT*XX;DDeQiP;sDON3# zC|c?n7#PZ+dX_OTGAw6U0riDH12Z_3)j%P!lc9r=VI~7B;|359gm*IZFfy>D>|~h0 z#BhMY1Y{^AupuE+$-u)<#lXi<0}g0r21Zc+U&+u9H5?v9^;%mPgwUhAfq{`>6~k(D zwV-qivIi0apwz&?(9FQdum)?$E2ArIXJBMli>_3W0TfH>=xRYpavdlsGOPyx-rHTa delta 1731 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 F1ps1V62Slf delta 35 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 diff --git a/src/out/vue/PlateauSwingUI.class b/src/out/vue/PlateauSwingUI.class index 15e29af97ebf0cfa602fcf0cb44b23ffb7cad2d2..9d9b90292a895c98a62be538595700a9d6d03916 100644 GIT binary patch literal 2973 zcmX^0Z`VEs1_l>~C0qNkp23JcEGtcQFG?)P$Sf>{gbX8tIM^X!=n~fK3~G!F!f+3}7iFgSBv$5^mT)ns zGH8GzM3a$$Rm0O$GmMLYi$R-*L5D$?k%6-~wFIJ$kwIDm5nvE8-^9Gc^wc72kRE*o z19k>O9tI-@V@3u(n4=;7W@KPbPb~q(A0vYx$PSpNKtk5+45o|>{Gb>FaiP)2#h}k% z&ck5AV9Ch9k)B!-Tv7=NIS~y_h$C_m^V0Q$ONuh{(yh4|Oc<;|Ua(DqV z#XgX0xftwt80;Aw7#WxoQ&Jciw4mBRiNQHPw;(?+HLt`PY8R>?Cxa7%GdqI|4}&X% z8zX}NI7}hdRTh_|<}xxc=a-f+GKfMPnwhU3P?VWh5?oT0nwV?N!QjEjpazY1s9zPV z6p9kliV`!EGct=bG!+sH3Q}_puT14)@M7?0XYk=+@MZ9W#U848j124rAk%a57#T#N zet@_I5;P#cnlJ?LFa&}!9Div+N@7W>TTy;4IC+6$I+%wc1SH2*lv7J!^4ov zkjKct4NY0j`K1Mn3|#4{P!m%b8H8YI1MVzqE`~@34Uh?iJPbu3?R@E}B`AiMFqE=0 zl<_c>GgL4#@Inm_0OvJE29Rp6{L<9YBFE&C%rr&@2@OqHQpy60>qDf$NwA8Cp_-uv zl3W8aQ~@brWf6H^$bvNKHMVVKS^gONcLlz}nI z9YzM8qSWNnvi!^N5ObH|&tZ@`+AiXTk`6;QOQZh3y z)vq)+DYYmhF$q*q@CKJ8CTII57C`x2h#UsWDW0C1U{jGw9BW1f-o%1}oJya>;u7Ed zGEg~Pj40%bKuQ@IL^Lq;f!x6roL^d$oa&YdvRfGH4`}w*1LYM4MFvpq$H2hOAOxzj z7#J9YK$QcSR%TEE)A9@o3=9lRpvnqNi!ca+X>kS#1_lOJ21W)}hM5eE46_&*7{wUa z7&sUh7^Y}#XJFJ4;1J+A%D~RFm4Q=>aVrBKh!6r1qFUNp86>rIwlc_S>276E)Y{FU z8VORpok4vYgBG(Hiztf#$07!QW;0e%RuIcxYYT&Q_w%rUSksyI>3}zrP zNw)0_R#xmTGA{prpoN8T`Tq?Y!LFXoz`)?eAjH7H zAjQDKz{?=OAj}}jAi^NUAjTliAkCn{Aj6=^Aj_b~AkSdSpuphHpvVx&pvDl#puteW zpvlm{pvBP6pvch6pujMhL6>0;0|SEs1IvE~2L@Jl1}=66eRhTtc7`d83=Dr5I2nI2 zIQ;^L(Od>LNEk7+f!Z4k3=9^V7#xM%w=sA!+em}FsKjh51ENJh{*X43G1|u9-@?SW z{QsL4M#km;?`dsg2-4cd5Q^}J8UrT-1A`$02ZIrV0E01u1cNDqGJ`RLCW8@!K7$2= zF@q(8IfE70jRFiTe;BwJ|1hvK{$db=xXFlN9@I^WP&aYH?B2k@z`)1=3M`Pb85nFC z7#Zd>%z!9o3};|rU}0cj_@uRkf$tcD5l9z^xrHGD#OB+=5NE`^jUf@6_%?=Att|{f z2wg%@T|!V@X;57#;@cQfwU05h>}H6J)ZWIBxrHGDLd9)o$oGYc7C=M`wlIK1{Xi*8 z2xOKH$O0XZ=`2t;>4HRbp(1IZbjXKAHN>Ty2*ukNQW1gg2F?af4D1Zf4Dt*v3}y`O z47Lm&451933^@#b3TC}yx?C}pr`C}VJ8C}(hGsAlkGs9}g;sAWiIXk^G{XksW} mXl1Bi=mh&&kb(6tgCsjc3p+y{_b&z>AtMGxhDG2!x)=bfsM1UT delta 630 zcmbO$-oegw>ff$?3=9k|4B8X9N=(@q_!$|5vl7b^^%KiW^xcaxQ+yID^Gi#(82A_j zc^Ft3gcuoEH9S2v!?+l@7({p&L>a^;?_$)dXJ?RLWZ;AAbk5JoFXCblXOIGEl4fLJ z)9?i8VrP(LWZ*9=P1Sc!EKUtB&&*2?_2goZVUP!@Q($D!)bK$y#M;x-CpSMOH78ZS zATu>NRX+ekT5EzGpv1$V%%H-^z&v?AlfmRDHjBwm*tF^y8JHM&88{di7?>Cs8CV(E z7#JB;85kHD8Q2)u7#J8PYHep=)Dqwj;5f>_&a{<*Q)@Q^UnGdXok3t5gD|s=v;fB< zh8$*F84w*OEt9}nFpGhmWjO;2vz_cr2C>}?;*o+39|Re03Nmcn&LFv*K?owWRgj^h zULbipgQOM9ZU&i1Nfv1t#_bGpR;*fE7&xVkWF%RGwIo@$F(`(&FflIwzo>V_;w~W8h_AVBln6VPIzvVBlhqXW(W~XW(JbXW(bBWe{LUWe{d4W)NYhWe{a( zVc=otV&G<&z#ze(&cMK+#K7^NL6M=JiJgIqk%8e413ROj1LGeCaYjFO2JxQ^YQGp* z85kKfU;)CA!NA18!oa|w2KBK5)Wnt_8shCzTqmO&B} kfeg|Nstk$@>I||B3<3-+e;Ak;K`!{kAOf*g6YNJV05Q6B6aWAK diff --git a/src/out/vue/Vue.class b/src/out/vue/Vue.class index df4f12e9eb492e78efa0a56776de65bb56162ea2..3a85e1fc1beb92aaa2ff063c9817e5f6effbcbfa 100644 GIT binary patch delta 97 zcmeyyxQL1C)W2Q(7#J8_82Bf0t&ry{PAzdsEy~MGEppB;Ens92(D2F4Pf5*5)d%q> su2s`!VPRxoWng1qU}0onXW#(SoD5uGnwx=#fq{XMftP`Sfr)_+05v!h9{>OV delta 57 zcmZ3)^o^10)W2Q(7#J8_7g+$73%>ff$?3=9k|43jrWKh$X?8_!M znU|TJLx_QyA&Q+LfASKRG{&;Y+^j)Le8s6HE~!O%nW;t2`K1Mn3<4THx%nxnIjQ;} zzO`o9{nyoeW*<4Bb2o4h%h$cd}k)?4R7rro}RmkwI?q1U9+JH`#=&@)#Hx*cccY zSixig0|SFB10w??0|NuA)^-NQjSLJ7j0}ZPMGOoa42%p#48;tL3)Lm$HghDi*P0DP)mPyhe` delta 383 zcmZn?Js`|=>ff$?3=9k|3|$+!rn4}!Gh|JE#*)TZIN6sqX!2oJBdtnC24+Tu8V-hP zMg|rIFsqi4fk}appN*lOi=ly`k)5H5hrxlNd9pRzWyZG2{OnpR9gGZelNYdwPp)HQ zpB&9DWR=Olz`)AD$iT|L#=yvs&A`AQ%fQIM2olxW&cL{lfq{XMA%}qhEX}~c!NACn z%a8|BI(a#J8)MF7Jq~x-dBOxEUf zj{>QaWMKQlAjJ5GL74Fmg91B)=Pw4aUkt3j7$g}O8A`ymgIuA)z{J4Bz`($E?V(?&KW+-J~U|?b> oV<=}}U=U$oW~gIeWT*g>RbaA)p@o5gfs28Wp_QSXp_4%p018PztN;K2 diff --git a/src/out/vue/VueGraphiqueSwing.class b/src/out/vue/VueGraphiqueSwing.class index 94c9efb0b582e39168e6044e14f177b29dfabb56..f90e8768af10a95573ba410361625e724b492eab 100644 GIT binary patch literal 5569 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 LGe!$WD+WmbV7s;; delta 590 zcmX@8y_=ou)W2Q(7#J8_7%V4p?dIZQU}q5JVGv^wpIptPRxioJAjKff$iP#aS`w66 zoLQBal#|NHz@ibQ8OF{a%g7*9R+_3Gkds)FnphfKo|%^(>dD0*!@vwOM}dbykwJ-( zfjKcHg^@u^!zU}TEKxtPyhPtQKer%1FEy{kS`(WfNV5tLgDQim8Y2UHacW6$W>qR9 z1FMFor)C&PQiF#>x*nm4ZCtoS%})$iVNDnV0HUnwykb6aw<$*ARi9m3NkAQGAnFjPzG@rw=t-L zXqIgZ+8Y@d7#JDq4H+01)EGD!7#O%1SQt1M1R1y)BpE>A%Ew^9Ai!YDAk5&(Aj06w zAjZJRV8p-+b(ACn0|OJt2#7f#V?gd@V31~DWH4qhfhvh($ diff --git a/src/vue/CaseSwingUI.java b/src/vue/CaseSwingUI.java index d089dc8..89c89d8 100644 --- a/src/vue/CaseSwingUI.java +++ b/src/vue/CaseSwingUI.java @@ -1,58 +1,208 @@ package vue; -import modele.piece.Piece; import java.awt.*; -import java.lang.ref.Reference; -import modele.Case; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import javax.swing.*; -public class CaseSwingUI extends JPanel { - private int ligne; - private int colonne; - private Color couleurdeFond; +import modele.Case; +import modele.piece.Piece; +import modele.Couleur; + +public class CaseSwingUI extends JPanel implements MouseListener{ + + + private Color couleurCaseClaire; + private Color couleurCaseFoncee; + private Color couleurCaseSelection; + private Color couleurCasePrecedente; + + + private final int ligne; + private final int colonne; + + private boolean estDernierCoupOrigine = false; + private boolean estDernierCoupDestination = false; + private boolean selectionnee = false; private final JLabel label = new JLabel("", SwingConstants.CENTER); private final Case caseModele; // reference vers la case de le modele - public CaseSwingUI(Color couleurdeFond, int ligne, int colonne, Case caseModele) { - this.couleurdeFond = couleurdeFond; + public CaseSwingUI(String style, int ligne, int colonne, Case caseModele) { + switch (style) { + case "RETRO_BOIS" -> { + // Style Bois rétro : + couleurCaseClaire = new Color(222, 184, 135); // Burlywood (bois clair rétro) + couleurCaseFoncee = new Color(139, 69, 19); // SaddleBrown (bois foncé rétro) + couleurCaseSelection = new Color(205, 133, 63); // Peru (orange/brun vieilli) + } + case "METAL_FUTURISTE" -> { + // Style métallique Futuriste + couleurCaseClaire = new Color(192, 192, 192); // Silver + couleurCaseFoncee = new Color(105, 105, 105); // DimGray + couleurCaseSelection = new Color(0, 255, 255); // Cyan flashy (effet néon) + } + case "BOIS_CLAIR" -> { + // Style Bois clair + couleurCaseClaire = new Color(240, 218, 181); // Beige clair + couleurCaseFoncee = new Color(181, 136, 99); // Marron clair + couleurCaseSelection = new Color(209, 83, 71); // Rouge-orangé + couleurCasePrecedente = new Color(255, 112, 99); // Rouge clair + } + case "JAUNE_CHALEUREUX" -> { + // Style Jaune Chaleureux + couleurCaseClaire = new Color(253, 231, 76); // Jaune vif + couleurCaseFoncee = new Color(227, 101, 91); // Rouge doux + couleurCaseSelection = new Color(248, 161, 87); // Orange doux + } + case "VINTAGE_PASTEL" -> { + // Style vintage pastel + couleurCaseClaire = new Color(246, 229, 189); // Beige pastel + couleurCaseFoncee = new Color(249, 125, 125); // Rose brique clair + couleurCaseSelection = new Color(200, 90, 90); // Rouge passé + } + default -> { + couleurCaseClaire = new Color(255, 255, 255); // Blanc + couleurCaseFoncee = new Color(200, 200, 200); // Gris + couleurCaseSelection = new Color(100, 100, 100); // Gris foncé + } + + } + this.ligne = ligne; this.colonne = colonne; this.caseModele = caseModele; + // Gestion de la couleur + if ((ligne + colonne) % 2 == 0) { + setBackground(this.couleurCaseClaire); // couleur claire + } else { + setBackground(this.couleurCaseFoncee); // couleur foncée + } + setOpaque(true); - setBackground(couleurdeFond); setPreferredSize(new Dimension(64, 64)); setLayout(new BorderLayout()); // Ajout du label à la case - label.setFont(new Font("SansSerif", Font.BOLD, 28)); + label.setFont(new Font("SansSerif", Font.BOLD, 60)); add(label, BorderLayout.CENTER); - this.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2)); - this.updateFromModel(); // Mise à jour de l'affichage à partir du modèle + this.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1)); + this.updateFromModel(); // Mise à jour de l'affichage à partir du modèle + + + //Ajoutons l'ecouteur + addMouseListener(this); } + @Override + public void mouseClicked(MouseEvent e) { + Container parent = this.getParent(); + while(parent != null && !(parent instanceof PlateauSwingUI)) { + parent = parent.getParent(); + } + if (parent instanceof PlateauSwingUI plateau) { + plateau.selectionnerCase(this); + } + //System.out.println("Case cliquée : " + ligne + ", " + colonne); + } + + @Override + public void mousePressed(MouseEvent e) {} + + @Override + public void mouseReleased(MouseEvent e) {} + + @Override + public void mouseEntered(MouseEvent e) {} + + @Override + public void mouseExited(MouseEvent e) {} + + + @Override protected void paintComponent(Graphics pinceaux) { super.paintComponent(pinceaux); // Pour effacer l'ancien objet + Graphics2D g2d = (Graphics2D) pinceaux.create(); + // Appliquer l'anti-aliasing pour des bords plus doux + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + int w = getWidth(); + int h = getHeight(); + // Couleur de fond (jaune) + //System.out.println("Selectionner debug: "+selectionnee ); if(selectionnee){ - this.setBackground(new Color(255, 215, 0)); // Jaune doux sélectionnée + this.setBackground(couleurCaseSelection); + + // Pour le truc de dégradé + // //Dégradé radial: claire au centre, foncé aux bords + // Color centre = new Color(255, 150, 130); // plus claire au centre + // Color bord = new Color(200, 50, 40); // plus foncé aux bords + // float[] dist = {0.0f, 1.0f}; + // Color[] colors = {centre, bord}; + // RadialGradientPaint gradient = new RadialGradientPaint( + // w / 2f, h / 2f, Math.max(w, h) / 2f, // centre X, centre Y, rayon + // dist, // fractions + // colors // couleurs + // ); + + // g2d.setPaint(gradient); + // g2d.fillRect(0, 0, w, h); + + // //petit contour plus sombre + // g2d.setColor(new Color(150, 30, 30)); + // g2d.drawRect(0, 0, w-1, h-1); + + + }else{ - this.setBackground(this.couleurdeFond); + // Couleur normale + //this.setBackground(this.couleurdeFond); + if ((ligne + colonne) % 2 == 0) { + g2d.setColor(couleurCaseClaire); + } else { + g2d.setColor(couleurCaseFoncee); + } + g2d.fillRect(0, 0, w, h); + } + + // Surbrillance du dernier coup + if(estDernierCoupOrigine) { + g2d.setColor(couleurCasePrecedente); + g2d.fillRect(0, 0, w, h); + } + + if(estDernierCoupDestination) { + g2d.setColor(couleurCaseSelection); + g2d.fillRect(0, 0, w, h); + } + + g2d.dispose(); // Libération des ressources graphiques } + + + // Rafrachit le contenu visuel depuis le model public void updateFromModel(){ Piece p = (caseModele != null) ? caseModele.getPiece(): null; label.setText(toUnicode(p)); - label.setForeground(Color.BLACK); - repaint(); + if(p != null) { + label.setForeground(new Color(0,0,0)); + if (caseModele.getPiece().getCouleur() == Couleur.BLANC) { + label.setForeground(new Color(250,250,250)); + }else{ + label.setForeground(new Color(30,30,30)); + } + } + repaint(); // double appel car setForeground le fais deja } private String toUnicode(Piece piece) { @@ -60,35 +210,56 @@ public class CaseSwingUI extends JPanel { if (piece == null) return ""; String symbole = piece.getSymbole(); return switch (symbole) { - case "BP" -> "♙"; - case "BC" -> "♘"; - case "BF" -> "♗"; - case "BT" -> "♖"; - case "BQ" -> "♕"; - case "BK" -> "♔"; + case "BP" -> "♟"; + case "BC" -> "♞"; + case "BF" -> "♝"; + case "BT" -> "♜"; + case "BR" -> "♛"; + case "BO" -> "♚"; case "NP" -> "♟"; case "NC" -> "♞"; case "NF" -> "♝"; case "NT" -> "♜"; - case "NQ" -> "♛"; - case "NK" -> "♚"; + case "NR" -> "♛"; + case "NO" -> "♚"; default -> symbole; }; } // Getters/setters utiles pour l'IHM - public Piece getPiece() { return piece; } - public void setPiece(Piece piece) { this.piece = piece; } + public Piece getPiece() { + return (caseModele != null) ? caseModele.getPiece() : null; + } + public void setPiece(Piece piece) { + if(caseModele !=null ){ + caseModele.setPiece(piece); + } + updateFromModel(); + } + // Getters pour l'état de sélection public boolean isSelectionnee() { return selectionnee; } - public void setSelectionnee(boolean selectionnee) { this.selectionnee = selectionnee; - this.setBorder(BorderFactory.createLineBorder(selectionnee ? Color.ORANGE : Color.DARK_GRAY,selectionnee ? 4 : 2)); + //this.setBorder(BorderFactory.createLineBorder(selectionnee ? new Color(248, 161, 87) : Color.DARK_GRAY,selectionnee ? 3 : 1)); // Repaint pour mettre à jour la couleur de fond repaint(); } + + // Gestion du dernier coup + public void setLastOrigin(boolean estDernierCoupOrigine) { + this.estDernierCoupOrigine = estDernierCoupOrigine; + repaint(); + } + public void setLastDestination(boolean estDernierCoupDestination) { + this.estDernierCoupDestination = estDernierCoupDestination; + repaint(); + } + + // Getters pour la position de la case public int getLigne() { return ligne; } public int getColonne() { return colonne; } -} \ No newline at end of file +} + + diff --git a/src/vue/PlateauSwingUI.java b/src/vue/PlateauSwingUI.java index e913972..92dc69e 100644 --- a/src/vue/PlateauSwingUI.java +++ b/src/vue/PlateauSwingUI.java @@ -1,26 +1,43 @@ package vue; -import modele.Case; -import modele.Plateau; -import javax.swing.*; import java.awt.*; +import javax.swing.*; +import modele.Coup; +import modele.Partie; +import modele.Plateau; +import modele.joueur.Joueur; + + public class PlateauSwingUI extends JPanel { + private final CaseSwingUI[][] cases = new CaseSwingUI[8][8]; private final Plateau plateauModele; + private final VueGraphiqueSwing vueGraphiqueSwing; + private final Partie partieModel; + + // Pour la gestion du dernier coup + private Point prevOrigine = null; + private Point prevDestination = null; + + private CaseSwingUI caseSelectionnee = null; + + + + public PlateauSwingUI(Plateau plateauModel, Partie partieModel,VueGraphiqueSwing vueGraphiqueSwing) { + this.plateauModele = plateauModel; + this.partieModel = partieModel; + this.vueGraphiqueSwing = vueGraphiqueSwing; - public PlateauSwingUI(Plateau plateauModele) { - this.plateauModele = plateauModele; setLayout(new GridLayout(8, 8)); // Création de la grille 8x8 for (int ligne = 0; ligne < 8; ligne++) { for (int colonne = 0; colonne < 8; colonne++) { // Détermination de la couleur de fond - boolean claire = ((ligne + colonne) % 2 == 0); - Color couleur = claire ? new Color(240, 217, 181) : new Color(181, 136, 99); + //boolean estCaseClaire = ((ligne + colonne) % 2 == 0); // Récupère la case du modèle, ne la crée pas ! var caseModele = plateauModele.getCase(ligne, colonne); // Création de la case SwingUI - var caseUI = new CaseSwingUI(couleur, ligne, colonne, caseModele); + var caseUI = new CaseSwingUI(plateauModele.getStyle(), ligne, colonne, caseModele); cases[ligne][colonne] = caseUI; // Stockage de la case dans le tableau add(caseUI); } @@ -29,9 +46,10 @@ public class PlateauSwingUI extends JPanel { // pour rafraîchir l'affichage public void rafraichir() { + System.out.println("PlateauSwingUI : rafraichir() appelée"); for (int ligne = 0; ligne < 8; ligne++) { for (int colonne = 0; colonne < 8; colonne++) { - // Mettre à jour l'état de chaque case + //cases[ligne][colonne].setSelectionnee(false); cases[ligne][colonne].updateFromModel(); } } @@ -41,4 +59,81 @@ public class PlateauSwingUI extends JPanel { public CaseSwingUI getCase(int ligne, int colonne) { return cases[ligne][colonne]; - s} + } + + public void applyLastMove(Coup coup) { + // 1) Netoyer ancien + if (prevOrigine != null) { + cases[prevOrigine.x][prevOrigine.y].setLastOrigin(false); + cases[prevOrigine.x][prevOrigine.y].repaint(); + } + + if (prevDestination != null) { + cases[prevDestination.x][prevDestination.y].setLastDestination(false); + cases[prevDestination.x][prevDestination.y].repaint(); + } + + + // 2) Appliquons le nouveau coup + if (coup != null) { + Point O = new Point(coup.getOrigine().x, coup.getOrigine().y); + Point D = new Point(coup.getDestination().x, coup.getDestination().y); + prevDestination = D; + + cases[O.x][O.y].setLastOrigin(true); + cases[D.x][D.y].setLastDestination(true); + + prevOrigine = O; + prevDestination = D; + + // 3) Repaint des cases concernées + cases[O.x][O.y].repaint(); + cases[D.x][D.y].repaint(); + } + } + + + // Méthode à appeler depuis CaseSwingUI quand une case est cliquée + public void selectionnerCase(CaseSwingUI caseCliquee) { + + Joueur joueur = partieModel.getJoueurActif(); + + // Etat 0 pas de case selection au paravant + if (caseSelectionnee == null) { + //1) il faut une piece + var piece = caseCliquee.getPiece(); + if(piece == null) return; // Pas de pièce sur la case cliquée, rien à faire + + // 2) et que la pièce appartient au joueur actif + if(piece.getCouleur() != joueur.getCouleur()) return; + + caseSelectionnee = caseCliquee; + caseCliquee.setSelectionnee(true); + + // Etat 1 une origine est deja selectionnée + }else{ + if(caseCliquee == caseSelectionnee ){ // a revoir + // re-clique sur la meme case = annuller + caseCliquee.setSelectionnee(false); + caseSelectionnee = null; + return; + } + + // 2e clic = destination on fabrique le coup + Coup coup = new Coup( + caseSelectionnee.getLigne(), caseSelectionnee.getColonne(), + caseCliquee.getLigne(), caseCliquee.getColonne() + ); + + // Rreset visuel + etat + caseSelectionnee.setSelectionnee(false); + caseSelectionnee = null; + + // transmettre le coup a la vue + vueGraphiqueSwing.recevoirCoup(coup); + + + } + } + +} \ No newline at end of file diff --git a/src/vue/Vue.java b/src/vue/Vue.java index a18a3d8..cf6d119 100644 --- a/src/vue/Vue.java +++ b/src/vue/Vue.java @@ -7,4 +7,5 @@ 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 setDernierCoup(Coup coup); // Met à jour le dernier coup joué } diff --git a/src/vue/VueConsole.java b/src/vue/VueConsole.java index 8da6540..c6cc3f9 100644 --- a/src/vue/VueConsole.java +++ b/src/vue/VueConsole.java @@ -71,5 +71,11 @@ public class VueConsole implements Vue { int ligne = Character.getNumericValue(position.charAt(1)); // Convertit '0' à '7' return new int[]{ligne, col}; } - + + @Override + public void setDernierCoup(Coup coup) { + // Implémentation pour mettre à jour le dernier coup joué + System.out.println("Dernier coup joué : " + coup); + } + } diff --git a/src/vue/VueGraphiqueSwing.java b/src/vue/VueGraphiqueSwing.java index 422dca3..4fea97a 100644 --- a/src/vue/VueGraphiqueSwing.java +++ b/src/vue/VueGraphiqueSwing.java @@ -1,30 +1,98 @@ package vue; -import javax.swing.JFrame; import java.awt.*; - +import javax.swing.*; import modele.Coup; +import modele.Partie; import modele.Plateau; public class VueGraphiqueSwing implements Vue { + private Coup c; JFrame fen = new JFrame("CHESS GAME"); private final PlateauSwingUI plateauUI; + //private Coup dernierCoup; - public VueGraphiqueSwing(Plateau plateau) { + // Journal systeme + private final JTextArea zoneSystem = new JTextArea(10, 24); + private final JScrollPane scrollSystem = new JScrollPane(zoneSystem); + + // 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.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fen.setResizable(false); + fen.setLayout(new BorderLayout()); - plateauUI = new PlateauSwingUI(plateau); // Passe le modèle + //Centre : Gestion du plateau + plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this); // Passe le modèle fen.add(plateauUI, BorderLayout.CENTER); + - fen.setSize(800, 800); + // Journal systeme (droite, haut) + zoneSystem.setEditable(false); + zoneSystem.setLineWrap(true); + zoneSystem.setWrapStyleWord(true); + zoneSystem.setBorder(BorderFactory.createTitledBorder("System")); + + // chat + zoneChat.setEditable(false); + zoneChat.setLineWrap(true); + zoneChat.setWrapStyleWord(true); + zoneChat.setBorder(BorderFactory.createTitledBorder("Chat")); + + JPanel chatBas = new JPanel(new BorderLayout(6,0)); + chatBas.add(champChat, BorderLayout.CENTER); + chatBas.add(btnEnvoyer, BorderLayout.EAST); + + JPanel chatPanel = new JPanel(new BorderLayout(0, 4)); + chatPanel.add(scrollChat, BorderLayout.CENTER); + chatPanel.add(chatBas, BorderLayout.SOUTH); + + // 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); + + fen.add(coloneDroite, BorderLayout.EAST); + + // Ecouteur pour envoyer le chat + btnEnvoyer.addActionListener(e -> envoyerChat()); + champChat.addActionListener(e -> envoyerChat()); + + fen.setSize(1000, 800); //fen.pack(); // ajuste la taille selon le contenu fen.setLocationRelativeTo(null); // centre la fenêtre à l'écran - fen.setVisible(true); } + public void envoyerChat() { + String message = champChat.getText().trim(); + if (!message.isEmpty()) { + zoneChat.append("Vous: " + message + "\n"); + champChat.setText(""); + } + } + + // 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 @@ -32,8 +100,17 @@ public class VueGraphiqueSwing implements Vue { @Override public Coup demanderCoup(Plateau plateau) { - // Demande un coup au joueur - return null; + while(this.c == null) { + try { + Thread.sleep(20); // Attendre un court instant avant de vérifier à nouveau + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return null; + } + } + Coup r = c; + c = null; // pret pour le coup suivant + return r; } @Override @@ -41,4 +118,14 @@ public class VueGraphiqueSwing implements Vue { plateauUI.rafraichir(); } + public void recevoirCoup(Coup coup) { + this.c = coup; + System.out.println("Coup reçu : " + coup); + } + + @Override + public void setDernierCoup(Coup coup) { + //this.dernierCoup = coup; + plateauUI.applyLastMove(coup); + } } \ No newline at end of file