From 7608e2bdee436ae56352eb4df36bef38c8bb5283 Mon Sep 17 00:00:00 2001 From: HP_pellel Date: Sun, 14 Sep 2025 01:32:33 +0200 Subject: [PATCH] finir le reseau --- .gitignore => src/.gitignore | 0 src/controleur/ControleurPartie.java | 27 ++--- src/modele/Coup.java | 6 +- src/modele/Partie.java | 4 + src/out/controleur/ControleurPartie.class | Bin 3264 -> 3398 bytes src/out/modele/Partie.class | Bin 3297 -> 3845 bytes src/out/reseau/TypeMessage.class | Bin 1120 -> 1184 bytes .../vue/ButtonEnvoyerMessageListener.class | Bin 0 -> 918 bytes .../ToucheEntrerEnvoyerMessageListener.class | Bin 0 -> 1088 bytes src/out/vue/VueGraphiqueSwing$1.class | Bin 638 -> 695 bytes src/out/vue/VueGraphiqueSwing.class | Bin 6512 -> 8355 bytes src/reseau/MessageJeu.java | 39 ++++++- src/reseau/Serveur.java | 46 ++++++++ src/reseau/TypeMessage.java | 3 +- src/vue/ButtonEnvoyerMessageListener.java | 23 ++++ .../ToucheEntrerEnvoyerMessageListener.java | 31 ++++++ src/vue/VueGraphiqueSwing.java | 100 ++++++++++++++---- 17 files changed, 242 insertions(+), 37 deletions(-) rename .gitignore => src/.gitignore (100%) create mode 100644 src/out/vue/ButtonEnvoyerMessageListener.class create mode 100644 src/out/vue/ToucheEntrerEnvoyerMessageListener.class create mode 100644 src/vue/ButtonEnvoyerMessageListener.java create mode 100644 src/vue/ToucheEntrerEnvoyerMessageListener.java diff --git a/.gitignore b/src/.gitignore similarity index 100% rename from .gitignore rename to src/.gitignore diff --git a/src/controleur/ControleurPartie.java b/src/controleur/ControleurPartie.java index a876d2f..80598f2 100644 --- a/src/controleur/ControleurPartie.java +++ b/src/controleur/ControleurPartie.java @@ -27,15 +27,17 @@ public class ControleurPartie { System.out.println("===============================\n"); - 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(TypeMessage.SYSTEMEBLEU,"Mode de jeu : " + modeDeJeu); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"Joueurs : " + partie.getJoueurBlanc().getNom() + " (Blancs) vs " + partie.getJoueurNoir().getNom() + " (Noirs)"); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"Les pions Noirs sont en bas. Les pions Blancs sont en haut. \n"); - vue.afficherMessage(TypeMessage.SYSTEME,"------- La Partie commence ! -------"); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"------- La Partie commence ! -------"); vue.afficherPlateau(partie.getPlateau()); //System.out.print("\n"); - vue.afficherMessage(TypeMessage.SYSTEME,"C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); boucleDeJeu(); + vue.setTour(partie.getJoueurActif().getNom()); + vue.setScore(partie.getScore()); } public void boucleDeJeu(){ @@ -49,20 +51,21 @@ public class ControleurPartie { vue.afficherPlateau(partie.getPlateau()); if(dernierCoup != null) { - vue.afficherMessage(TypeMessage.SYSTEME,"Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); } - vue.afficherMessage(TypeMessage.SYSTEME,"\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); vue.setTour(partie.getJoueurActif().getNom()); + vue.setScore(partie.getScore()); } catch (IllegalArgumentException e) { - vue.afficherMessage(TypeMessage.SYSTEME,"> Erreur : " + e.getMessage()); + vue.afficherMessage(TypeMessage.SYSTEMEROUGE,"> Erreur : " + e.getMessage()); } } - 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é !"); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"La partie est terminée !"); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"Si vous souhaitez rejouer, relancez le programme."); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"Si vous souhaitez voir l'historique des coups taper 1. Si vous souhaitez voir les captures taper 2."); + vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"Merci d'avoir joué !"); } } diff --git a/src/modele/Coup.java b/src/modele/Coup.java index 3fb7f57..fe8ab60 100644 --- a/src/modele/Coup.java +++ b/src/modele/Coup.java @@ -1,8 +1,12 @@ package modele; import java.awt.Point; +import java.io.*; + + +public class Coup implements Serializable { + private static final long serialVersionUID = 1L; -public class Coup { private int ligneDepart; private int colDepart; private int ligneArrivee; diff --git a/src/modele/Partie.java b/src/modele/Partie.java index 4807579..e4baaf1 100644 --- a/src/modele/Partie.java +++ b/src/modele/Partie.java @@ -102,6 +102,10 @@ public class Partie{ nombreCoups++; } + public String getScore() { + return "Blancs : " + listeCapturesBlancs.size() + " - Noirs : " + listeCapturesNoires.size(); + } + public Joueur getJoueurActif() { return joueurActif; } diff --git a/src/out/controleur/ControleurPartie.class b/src/out/controleur/ControleurPartie.class index 71d454787cb5f3c8b536bad3e522032aec846a71..7f1d115b225feb8ad581bf40843beadd53f4af87 100644 GIT binary patch delta 855 zcmX>gc}$Ay)W2Q(7#J8_7&dR@;%4IK4vq{CarJd|@^KAiWDuFm$Sktigy{)WJvW05 zLpl#b27?+S1AB35Nl1Qa5f_6KLlzH1HiHi%14nvlNpNz0Q7TAbE)PQoQI);p^}k-FFm!y zWpX5|0$Vi?Lk&ai5AqLncjaPeU})oE zXrKI%RgAG~G6$O+W6xxDHZ#V)$#HBMj1wjwXPeJBeR4Xx2jiT{8`wn{=S@D!uEw}v z@*8$V#zm9)IOG|ZOxEL2Qe4K!z+oYo(X1007#Su_zQC!?IC=6PPDSA<3~V3~1_nkR1{MZJ z1_p*BlMT2Q7-(%_;MLl~z`l(kej9`PPKGol282-NPKF#NhK&pi42%qu85kJM73rJp;o|25V*{t8uz!`Ts1CfxMd-nzXkuwC-Z)fa+cTKM-W{CI)SxPPkzp zUN;J_7lqdk=GAXxU}WH8n8q-Zp@D%3?A0I!5e5bZT?Q@&eFh;00|rS3Lk2|#BL-~- zV+LymQwDnmGlmETONL?wD~2`(YldkIb__EaY#3%S*fOkVuw&T7;K*=*!HMAJ+u$F;=fs28WVI9K;hD{8T0LyyCrT_o{ delta 739 zcmX>mbwHBq)W2Q(7#J8_7*=iM;%4Gt4~`5DarJfGtjP46$%>1?i6NbbA%h{4k%2w6 zxWp|pFO!jhSwk}lB$Lgn$iSJEUz%DJl3!W`63ydb$Y&^+JcU)At%!%An4x6y zK~_C+ZU!5M3Lb_^1~odBv2Rpq%Dsu*f{80r{&7#X2ARo~9CC~^Cx>##GtQn|%Auq3McR4R%a}o zynsuDJ$@U5`!0sE$$z=U>&uxKmjAB;Y2w|)psl@)p=K9DJp;o|25V-9<^K~wx;HUs z3pIcRV7w+2UJDAZ4b0ofz{tSG(8kcoP{qIm_JtpVFaraFHUk%fE`tz*9)l!Png9SqygEd1ZgC#>3gB8Pk25W{z40a3~80;DLF*q=s zVQ^%)#o)xy!@$5G#lXVwmm!>;!GoQl_dkOH10y>F2Z*SWU|?qGXJBApVwk`%k%56h wje(6}9s?u8BrrJzOip8%r@+9-Fayk)1t#Y(EMZ_^;9_88Sjw=RVI_kk0Lh}Kvj6}9 diff --git a/src/out/modele/Partie.class b/src/out/modele/Partie.class index e29d440db2e6e79373a66669428fe91af464e609..75b17d58f5524253bc6b1c6ec9c5ba6fad983478 100644 GIT binary patch delta 1316 zcmaDT*(%3%>ff$?3=9k|3_CV*sj$|w6lYeYGBPl0XnG1UFfcUmFf=kWF*1nfCT6EP z=jSCSmV{@PWH{&N6_+IDl@v2Fh-r9wYWid)mL=-vB<7{-2bUCO=A~P6GvqL|@G!J8 zv@tTUXBNBW7L-(ijg11ybnq~AGITLAFsG-MFfxd0z)jd(z{z>%I>5}cf0l*-5; zqJhQm&1Gz{jP;BR0#5n)CB-F0i3Pr?B^miC#T*Q)85zW!auV~BixsRC7!`CC{PHu4 zz-)dthP7M_>loIvGi(6)Y9k|q3c}f$d1d+8sZiHLJnEL1T#{c@$;dE61Id3-g}$lv zAR9dr^HOqBi&cE`^Rr6}tdZ0~!vRSIt`np&q_Q9ti}GkB_5Mj&smUeQ$o_{K;hdP0 z6I`EJl4{M!z~h;hms;eUlUQ7wTFlO{g^@uO!&i{dL3JxT!!||+Is8f)8Q35mV^Cz^ zWnf}pVBln6Vh~^uWME)m;$aYB5M^LsU}WfK=$ZVPUD>!7B+Ssqz{DWWAj81O0O9vD zFfk~h@c9`S8CV%6FfcMqob1UF&NylELJmXr$qZ~@k((TE7$;3W#u?2xWwH{Niu6>5 zHjp?21A`O;BLgGI4(2srdnZj!tt||aI~kf88D=uDGHw9zKp5^kNNen9(Rx&U!a4;}3 btYKheSjDi3fq{XGi-D10Gs9Mf?F^CtE@>O; delta 704 zcmZpbdnn0u>ff$?3=9k|42w5%sjyCNVil5Y;9+QFXkuhwDbB1)Wn^I1(DdYH$YE&V zVQ6J&+dPX^nsM`WwrIx5vpHp%+Zj40@8(oC?qpzKU}ETEU}BJGkYQkCfbhE+m>85$ z_)j9nCml@+)o?{fP{9AaMo; z1}O$c21bw_%xf4J7#JD)7#P5M7#PAB7#XU-?B2bbe%)qKg5}^m8r3|WNCIchGEQZ-oPxv!1g9ArR zYYT(qPKIhmhM5ekj2l2a5Z=j9&&a@%vXh~iiQxc)$p(gcP+WmRkdJ|xfq|itfrp`r zfsdhv0TgP?42+;in#0fpH61yKgwR93fq{`>F2g)5N_o)T-ps(rFdrQ7jJ=a5@`*Ws fTmbP_I|C!b01cT(nZ7ST-3^MEtk~|Eu4002nDsn3@D6%ss@h~Ve zs7w}Q4CPQ@P~%}xXV93O$EYc##=*eJ!N9}8z|X-T#K9oS#lXm5$ira7U_5yp<9k*G z1_lQ9$%~jY>K!CO_AxLBNP(GAJ{cGcZBbGl509gc!AUFvuTZV8m2!0kVaWfuVtcfhh{) zVg_cgUU>#)24;}Mw6tZmGpKIFun44)lZk;rfB}px85kIt7_0=iK;DA7*NK4za^;URE)eV31^I5aVHxVvuHJU`@`+&r4-w5Yf=|$x19s)Xz!GOV{^L%1TWxvF2is zWsqZMkmq4gU{IW_#~8{X%b?7|pu(U!xtmc_T$zJ`lY@bWgMpueL5PcikwKS-L61Ry z@;S!$tg;LY3~ZARF=^BbNP#S7U|?Wn;AAjh&}U#|Fl1n0P-0+Y00FK|48q$O#1Ak? zY+ztuU}P`?X#~qLGjK8}Fc>p1LDe&XMY)6+wRSMb9AIF?RBr;Zg^_`wfq{Vu7xmUA$eGnhdYmp~PJ>}Ft$6jEc}&Y-@Tff>xvU;%U3!5mFiFoz4w(P9I0 zc)=WPb}&a^2ZPRL24RGYr5M;47#LX877e+pUmQt z)V$OpMh4d8jKtgmMg|EVkkJ+T#pRiK>H1zFsTCz|nW;G`)*vJKco_H@1Q;2Z%Suxj z8N_`+#)g%qx)&uDWMmeWrUrvFS#vQ6F$l9Wi109oGKeuUh+#L7k%2uuwFG27BZG*B zCfHhtkAh2zGV{`{xfmoEB-t6Hco?KX#vpkaqJWWsrKBh`7o<#Mh0~a zOqXGbXohhxXfiS|fV{5F!=S^U%gDf94D+5S7Be)%*ctR08Dv3$qn}t_qMurpnpdLl zm|T*XpNEJRBZyWk@qr`oHNzMgSe)}yQW+WeeKPY>{YrC_Qj0eoiMg~>}0|rJ0Lk0#0V^A7rU|`_a+RnhJrM;DbT}x*x z1Mfx#1_nk3BL)TrAqEx(P#Ci?a5Hc+@G$T(@G>wm7&Dka4Txc2W?*JuU{KTA!oa?b zL2w&`xUbGO2ANq5Vp>}mc!d;nwlOGy4l7#YmKPBsSs-yz#x literal 0 HcmV?d00001 diff --git a/src/out/vue/ToucheEntrerEnvoyerMessageListener.class b/src/out/vue/ToucheEntrerEnvoyerMessageListener.class new file mode 100644 index 0000000000000000000000000000000000000000..456ff2ac597657ec07b5ae9bba34e30ca5658c69 GIT binary patch literal 1088 zcmX^0Z`VEs1_l=f2QCIC24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3VWveH!jko?l*j8xaWlA_ci*Sxa)%G4s?)Z*gA z^i-eB;*!+7)FMU(*5r)D+yX`h2_KLJ75c^HnR)5@ULmO!C2pCiIVsj4gZX$E_!$Hk z8JNpTQyCe=eL#kXm8QBEB^G347M7+4gEU!lF$ggTvonbBFo-gUF*1mQ4Af67FVRme zOU*0M_fD;J1u+;IxYAQgyi+Tk^HWm6j`!qZkYJExXOQAykYTH1ABUE z3CLxP3?dquUFz<`>!NA18$Y8?2#J~hf;tUK7OrS)`z`(%5z{tSLV8+16V9vn6U<}GP3=9nX zTH6^IwY0Y~uxsgTW#HY&z`(%BV8Ot^AjH7J019^&25tsU1|9}J23`h621^Djr~xSq z%nZy73=I0(+ZY4|xE3&IXl-F&-^L)mjX~B|XB&gkECw;HEeyOuYC78>azc9B7z{ub zFo7+QVqjxnU=U>BWDsHyVGw4JW)NXeWe{c1V~}95W?*1oW?uafaSi2UU}BKwVUS@EU}WHdiU;|J zy1TM7$W0buY-iM%JcrR-RhEH)fl)w$ft!H`#A4uJkY`X}U}R8aU|^_YU}j)sU|=wx z{DV=wdJ_ZtCI+c(41#R_%Nba_H!?6Ya59K6h%<;XNH8cfs4<8#s52Nbm@t-uke+PF*v_KL$RIi~UUc$BMtM~! z1_lO30SN|f1|ATLfrCMYL6(7$L5_ieA&G&RfsuiML1VHglY0C{1||kh1`!5v22lnH z24w~{22lnk26+Ys1~#y&9tH&l1_mAmmT-0kQ3hWS!N9_x$iTqB#Gu5W%)r3F!l1&y az@P>eQDIPLU|`^4U}WH6U|?Vn-~a&4y%d80 diff --git a/src/out/vue/VueGraphiqueSwing.class b/src/out/vue/VueGraphiqueSwing.class index 72bae309b2c5452808752349b5280245017b91c5..c99eaa61cefe29bb019da46046eab5c55af221f6 100644 GIT binary patch delta 4432 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 delta 2731 zcmZ4N_`!(l)W2Q(7#J8_7_&BVy<}zPVCb5x%O=j)Gx;F9G;cRU9}fd7Lq8*fj)v!C zZ&szsq}k0djfY`6!wg0S{^HbRCJtvnQuY)LEx#x=y(qslFNKjoSi>hPu`E$PvAjgz zIX@@A$QooBJHu)ohBYwtPKn9c5cOOP$qegw7}hgvm~6;xp~}gyiD5H4!xkQftqj{3 z8Te35Vq{=(4|0s0tjHzI1=6^KhhZnfuE~$N+}RoS@G$IU*f+VDyNrq9z~tB5GTID> zc^Hl`gflYm6{nW?CRSwTmga&yC&a+OaEyoHIKv4>2IivDJVpll$woX{lk<4Qco7e+=ZwS>kn{r{hKC?&QB>*R z%HopL+*D46#|%%{8J_YmJY#r1S(ne4gNflK55p^l*OTvX$S|pCOy=QK=X}fXj-BB> z55tGabNE!*89wnad}jDE`2?RF55o_JpX?03co=>&{F(fTPnn6~-(+!qB~FGPj0`-C zjEqc^o%l6;7=AFa@G!D6urV@lX6BWo78R8ilyEUPFtYP7a)3m+iW1X`5;K!CGK;tv zxfr?G8F_dZc^UZ_83e%bk&~F0t{+@dl$n=4c>%wv8Z*O7AqEzPms|`2j6yt&!XOWV zQc_521=w6s9!4=n@yWmWRef1OO4&e4H!(`{Ft9SpFfy=dczSwjhH)}%VwB@yln2E- zbC9bG7Xvq=A`hbyqcS6dP;yafVo54AFr9Mpld~BaJSJZdkgP`}GmK;h7O2oKF3-$M z*Y^rY%uCI&=3-!HROMk*gZMMGEHNiDC9xzGB&@;1s0k8gFG?*)%*-nRIY^s_Q3vE8 z)^HEc5Lb|h9uK2FSj5T4(b=1wiP3Pft)SK9c0oHn-r$nNf{?_doYcvO1=mfU zB&0a`qL6F700SF8E29U0uo(~VB1A`a`qaPy!N3^G(n}4hVBL`yu zBLkmverbV1QR?C4r3zLcu^>hU0hiRGyv)=hg=CN%STux@fg>cpvrXJm`!VT@sn-8@xo+2Fh1FwB^JwAznh^tQfmtX*LH?lD^^KXq0Su)N!u8jb~AKGvS@8# z@YdPR&}+pe$tK9Gu#I7YB%27sM5e73xIR08#>osGj58U$8J9BzFs^3^WZcRS z#JHOwl<^otIOAo82*%qCk&KTSq8OM!$sZEH37Es>K5V(z@6~Yxd2<0Dw@C8z!{5DC}4e-D;W8h_AV2EYlVu)i9 zU`Sw4U`S-pWJqDqXGmo*XGmkPt7k}OaAZhjaA(M72xG`$NMp!lC}YTHU<8$pP!Fjy zFflMOFfedyY42h<%D}LL;UpruxWH1S3|tH~42+;M6Pu>M)0NcaJz`!5_Wh-jwY-6|sBJOWuc%-w7;ROT3 zHikDKr!j$3k{AOk0|P@3g9<}0gC;{CgC0XagB8O>Mso%R237`U6&4l-#(G8zMoXyW z#Zb#twYD&PJkB60!tiwm!}sO?Kl|=r_`i*jnQ;S1!dHuNE5k>f4GfG7>ZRsrM;Em z<0ghj+B+CIcQNwAg94(R4;-p17+4urGKes&Vqj#ng&0xKz`$S$HA7Ns3xhaBzW@Wn zHby~^E3~&UiXfZ;F=riv0K<9)35E>}jEr^+Vo;}OL5<T0m_9jNHO^muwgSm9JG311Uj1}P6!B7C@aBX7*S;d8B zRXwOcC}ZGZC}$95s9;cHsASM&sA4c+sAgbcbOI%4MrTGB1_lNe21bU9jIIm}3?>Zh zjNuH-jBbqXjBZet7o!_v90MbxFPQWPlYw9|7)*vTrZ6xt2r)1*Tm)qs0S?Ag#&pI^ G21x*~i9GrM diff --git a/src/reseau/MessageJeu.java b/src/reseau/MessageJeu.java index bd51652..4b45d56 100644 --- a/src/reseau/MessageJeu.java +++ b/src/reseau/MessageJeu.java @@ -1,5 +1,42 @@ package reseau; -public class MessageJeu { +import java.io.*; +import modele.Coup; + +public class MessageJeu implements Serializable { + private static final long serialVersionUID = 1L; + + private final TypeMessage type; // CHAT, COUP, SYSTEME, DEMANDE_DE_PARTIE, FIN_DE_PARTIE + private final String auteur; // MOI adversaire ou système + private final String contenu; // Pour les messages texte Chat/système + private final Coup coup; //Pour les mouvements sinon null + + public MessageJeu(TypeMessage type, String auteur, String contenu, Coup coup) { + this.type = type; + this.auteur = auteur; + this.contenu = contenu; + this.coup = coup; + } + + public TypeMessage getType() { + return type; + } + + public String getContenu() { + return contenu; + } + + public String getAuteur() { + return auteur; + } + + public Coup getCoup() { + return coup; + } + + @Override + public String toString() { + return "[" + type + "] " + auteur + " : " + contenu + (coup != null ? " (Coup: " + coup + ")" : ""); + } } diff --git a/src/reseau/Serveur.java b/src/reseau/Serveur.java index a9f937f..c32ddbe 100644 --- a/src/reseau/Serveur.java +++ b/src/reseau/Serveur.java @@ -1,5 +1,51 @@ package reseau; +import java.io.*; +import java.net.*; + +import controleur.ControleurReseau; + + public class Serveur { + private final int port; + private ObjectInputStream input; // flux d'entrée qui vient du client + private ObjectOutputStream output; // flux de sortie qui va vers le client + private ControleurReseau controleur; + + public Serveur(int port){ + this.port = port; + } + + public void setControleur(ControleurReseau controleur) { + this.controleur = controleur; + } + + public void demarrer() throws IOException{ + ServerSocket serveurSocket = new ServerSocket(port); + System.out.println("Serveur démarré sur le port " + port); + + // Accepter une connexion seule client + Socket clientSocket = serveurSocket.accept(); + System.out.println("Client connecté : " + clientSocket.getInetAddress()); + + // Initialiser les flux de communication + output = new ObjectOutputStream(clientSocket.getOutputStream()); + input = new ObjectInputStream(clientSocket.getInputStream()); + + // Démarrer un thread pour écouter les messages entrants + new Thread(()-> { + try { + while(true) { + MessageJeu message = (MessageJeu) input.readObject(); + traiterMessage(message); + } + } catch (Exception e) { + if(controleur != null) { + controleur.onSyteme("Client déconnecté."); + } + } + }) + + } } diff --git a/src/reseau/TypeMessage.java b/src/reseau/TypeMessage.java index 1529f9b..3eaf8a8 100644 --- a/src/reseau/TypeMessage.java +++ b/src/reseau/TypeMessage.java @@ -5,7 +5,8 @@ public enum TypeMessage { MOUVEMENT, // Transmission d'un coup FIN_DE_PARTIE, // Signal de fin - SYSTEME, // Message système (erreur, info serveur, etc.) + SYSTEMEBLEU, // Message système ( info serveur, etc.) + SYSTEMEROUGE, // Message système ( info serveur, etc.) en rouge CHAT // Message chat entre joueurs } \ No newline at end of file diff --git a/src/vue/ButtonEnvoyerMessageListener.java b/src/vue/ButtonEnvoyerMessageListener.java new file mode 100644 index 0000000..64ac1ae --- /dev/null +++ b/src/vue/ButtonEnvoyerMessageListener.java @@ -0,0 +1,23 @@ +package vue; + +import java.awt.event.*; +import javax.swing.*; + +public class ButtonEnvoyerMessageListener implements ActionListener { + private JTextField champ; + private VueGraphiqueSwing vue; + + public ButtonEnvoyerMessageListener(JTextField champ, VueGraphiqueSwing vue) { + this.champ = champ; + this.vue = vue; + } + + @Override + public void actionPerformed(ActionEvent e) { + String msg = champ.getText().trim(); + if (!msg.isEmpty()) { + vue.ajouterMessageChat("Moi", msg); + champ.setText(""); // Efface le champ après envoi + } + } +} diff --git a/src/vue/ToucheEntrerEnvoyerMessageListener.java b/src/vue/ToucheEntrerEnvoyerMessageListener.java new file mode 100644 index 0000000..07460a0 --- /dev/null +++ b/src/vue/ToucheEntrerEnvoyerMessageListener.java @@ -0,0 +1,31 @@ +package vue; + +import java.awt.event.*; +import javax.swing.*; + +public class ToucheEntrerEnvoyerMessageListener implements KeyListener { + private JTextField champ; + private VueGraphiqueSwing vue; + + public ToucheEntrerEnvoyerMessageListener(JTextField champ, VueGraphiqueSwing vue) { + this.champ = champ; + this.vue = vue; + } + + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + String msg = champ.getText().trim(); + if (!msg.isEmpty()) { + vue.ajouterMessageChat("Moi", msg); + champ.setText(""); // Efface le champ après envoi + } + } + } + + @Override + public void keyReleased(KeyEvent e) {} + + @Override + public void keyTyped(KeyEvent e) {} +} diff --git a/src/vue/VueGraphiqueSwing.java b/src/vue/VueGraphiqueSwing.java index 9d54b51..b2e69c1 100644 --- a/src/vue/VueGraphiqueSwing.java +++ b/src/vue/VueGraphiqueSwing.java @@ -22,6 +22,7 @@ public class VueGraphiqueSwing implements Vue { private final JLabel lblScore = new JLabel("Score : "); private final JPanel panelSysteme = new JPanel(); + private JScrollPane scrollMessages; public VueGraphiqueSwing(Partie partie) { fen = new JFrame("CHESS GAME"); @@ -54,14 +55,30 @@ public class VueGraphiqueSwing implements Vue { scrollSysteme.setBorder(BorderFactory.createTitledBorder("Système")); droite.add(scrollSysteme, BorderLayout.CENTER); - // === Colonne gauche (messages serveur) === + // Colonne gauche (messages serveur + input) 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 = new JScrollPane(panelMessages); scrollMessages.setBorder(BorderFactory.createTitledBorder("Messages (serveur)")); - // === JSplitPane centre (plateau + droite) === + // Champ de saisie et bouton + JTextField champMessage = new JTextField(); + JButton btnEnvoyer = new JButton("Envoyer"); + btnEnvoyer.addActionListener(new ButtonEnvoyerMessageListener(champMessage, this)); + champMessage.addKeyListener(new ToucheEntrerEnvoyerMessageListener(champMessage, this)); + + // Panneau bas (saisie + bouton) + JPanel basGauche = new JPanel(new BorderLayout(5, 0)); + basGauche.add(champMessage, BorderLayout.CENTER); + basGauche.add(btnEnvoyer, BorderLayout.EAST); + + // Panneau global gauche + JPanel gauche = new JPanel(new BorderLayout()); + gauche.add(scrollMessages, BorderLayout.CENTER); + gauche.add(basGauche, BorderLayout.SOUTH); + + // JSplitPane centre (plateau + droite) JSplitPane splitCentre = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, plateauUI, @@ -71,10 +88,10 @@ public class VueGraphiqueSwing implements Vue { splitCentre.setResizeWeight(0.7); splitCentre.setOneTouchExpandable(true); - // === JSplitPane global (gauche + centre) === + // JSplitPane global (gauche + centre) JSplitPane splitGlobal = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, - scrollMessages, + gauche, splitCentre ); splitGlobal.setDividerLocation(200); @@ -89,57 +106,96 @@ public class VueGraphiqueSwing implements Vue { fen.setVisible(true); } - private JPanel createMessageBlock(String text, Color bg, Color fg) { - JLabel lbl = new JLabel(text); - lbl.setForeground(fg); + private JPanel createMessageBlock(String auteur, String text) { + JLabel lbl = new JLabel(auteur + " : " + text); JPanel block = new JPanel(new BorderLayout()); block.add(lbl, BorderLayout.CENTER); - // Style + // Couleur selon auteur + Color bg, fg, border; + switch (auteur.toLowerCase()) { + case "moi" -> { + bg = new Color(200, 255, 200); // vert clair + fg = Color.BLACK; + border = Color.GREEN.darker(); + } + case "serveurbleu" -> { + bg = new Color(220, 235, 255); // bleu clair + fg = Color.BLUE.darker(); + border = Color.BLUE; + } + case "serveurrouge" -> { + bg = new Color(255, 220, 220); // rouge clair + fg = Color.RED.darker(); + border = Color.RED; + } + default -> { // adversaire + bg = new Color(255, 220, 220); // rouge clair + fg = Color.RED.darker(); + border = Color.RED; + } + } + block.setBackground(bg); + lbl.setForeground(fg); block.setBorder(BorderFactory.createCompoundBorder( - BorderFactory.createEmptyBorder(5, 10, 5, 10), // marges internes - BorderFactory.createLineBorder(Color.GRAY, 1) // bordure + BorderFactory.createLineBorder(border, 1), + BorderFactory.createEmptyBorder(5, 10, 5, 10) )); - // 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 + // Taille compacte + block.setPreferredSize(new Dimension(0, 35)); + block.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35)); 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); + public void ajouterMessageChat(String auteur, String message) { + SwingUtilities.invokeLater(() -> { + JPanel block = createMessageBlock(auteur, message); panelMessages.add(block); - panelSysteme.add(Box.createVerticalStrut(8)); + panelMessages.add(Box.createVerticalStrut(15)); panelMessages.revalidate(); panelMessages.repaint(); + + // Déplacer la scrollbar après que Swing ait fini la mise en page + SwingUtilities.invokeLater(() -> { + JScrollBar verticalBar = scrollMessages.getVerticalScrollBar(); + verticalBar.setValue(verticalBar.getMaximum()); + }); }); } + // Ajouter message système (colonne droite bas) - public void ajouterMessageSysteme(String message) { + public void ajouterMessageSysteme(String auteur, String message) { SwingUtilities.invokeLater(() -> { - JPanel block = createMessageBlock(message, new Color(255,220,220), Color.RED); + JPanel block = createMessageBlock(auteur, message); panelSysteme.add(block); panelSysteme.add(Box.createVerticalStrut(15)); panelSysteme.revalidate(); panelSysteme.repaint(); }); + + // Déplacer la scrollbar après que Swing ait fini la mise en page + SwingUtilities.invokeLater(() -> { + JScrollBar verticalBar = scrollMessages.getVerticalScrollBar(); + verticalBar.setValue(verticalBar.getMaximum()); + }); } // API de la Vue @Override public void afficherMessage(TypeMessage type, String message) { switch (type) { - case CHAT : ajouterMessageChat(message); - case SYSTEME : ajouterMessageSysteme(message); + case CHAT : ajouterMessageChat("", message); break; + case SYSTEMEBLEU : ajouterMessageSysteme("serveurBleu", message); break; + case SYSTEMEROUGE : ajouterMessageSysteme("serveurRouge", message); break; default : System.out.println("[INFO] " + message); } }