From 80f4616574394b93f4dbd110e2833e52767ffd7f Mon Sep 17 00:00:00 2001 From: HP_pellel Date: Wed, 17 Sep 2025 00:23:46 +0200 Subject: [PATCH] Il ne rest plus que la vue graphique pour le debut la config et tout --- src/controleur/ControleurPartie.java | 69 +++++++++++--- src/controleur/ControleurReseau.java | 111 +++++++++++++++++++++- src/modele/Partie.java | 13 ++- src/out/controleur/ControleurPartie.class | Bin 3398 -> 4378 bytes src/out/controleur/ControleurReseau.class | Bin 217 -> 3816 bytes src/out/modele/Coup.class | Bin 1122 -> 1214 bytes src/out/modele/Partie.class | Bin 3845 -> 3900 bytes src/out/reseau/Client$1.class | Bin 0 -> 978 bytes src/out/reseau/Client.class | Bin 193 -> 3731 bytes src/out/reseau/MessageJeu.class | Bin 201 -> 1688 bytes src/out/reseau/Serveur$1.class | Bin 0 -> 981 bytes src/out/reseau/Serveur.class | Bin 195 -> 3918 bytes src/out/reseau/TypeMessage.class | Bin 1184 -> 1719 bytes src/out/vue/VueGraphiqueSwing$1.class | Bin 695 -> 748 bytes src/out/vue/VueGraphiqueSwing.class | Bin 8355 -> 8512 bytes src/reseau/Client.java | 94 +++++++++++++++++- src/reseau/Serveur.java | 89 +++++++++++++---- src/reseau/TypeMessage.java | 28 ++++-- src/vue/VueGraphiqueSwing.java | 12 ++- 19 files changed, 364 insertions(+), 52 deletions(-) create mode 100644 src/out/reseau/Client$1.class create mode 100644 src/out/reseau/Serveur$1.class diff --git a/src/controleur/ControleurPartie.java b/src/controleur/ControleurPartie.java index 80598f2..42b8aa2 100644 --- a/src/controleur/ControleurPartie.java +++ b/src/controleur/ControleurPartie.java @@ -14,11 +14,16 @@ public class ControleurPartie { private ControleurReseau controleurReseau; private ModeDeJeu modeDeJeu; - public ControleurPartie(Partie partie, Vue vue, ControleurReseau controleurReseau, ModeDeJeu modeDeJeu) { + public ControleurPartie(Partie partie, Vue vue, ControleurReseau CR, ModeDeJeu modeDeJeu) { this.partie = partie; this.vue = vue; - this.controleurReseau = controleurReseau; + this.controleurReseau = CR; this.modeDeJeu = modeDeJeu; + + // On lie ce ControleurPartie au ControleurReseau + if (controleurReseau != null) { + controleurReseau.setControleurPartie(this); + } } public void lancerPartie(){ @@ -27,14 +32,14 @@ public class ControleurPartie { System.out.println("===============================\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_INFO,"Mode de jeu : " + modeDeJeu); + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"Joueurs : " + partie.getJoueurBlanc().getNom() + " (Blancs) vs " + partie.getJoueurNoir().getNom() + " (Noirs)"); + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"Les pions Noirs sont en bas. Les pions Blancs sont en haut. \n"); - vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"------- La Partie commence ! -------"); + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"------- La Partie commence ! -------"); vue.afficherPlateau(partie.getPlateau()); //System.out.print("\n"); - vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); boucleDeJeu(); vue.setTour(partie.getJoueurActif().getNom()); vue.setScore(partie.getScore()); @@ -51,21 +56,57 @@ public class ControleurPartie { vue.afficherPlateau(partie.getPlateau()); if(dernierCoup != null) { - vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); + vue.afficherMessage(TypeMessage.SYSTEME_WARN,"Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup); + + // Envoi du coup au serveur si le controleurReseau est initialisé + if (controleurReseau != null) { + controleurReseau.envoyerCoup(dernierCoup, joueurPrecedent.getNom()); + } } - vue.afficherMessage(TypeMessage.SYSTEMEBLEU,"\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer."); + + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"\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.SYSTEMEROUGE,"> Erreur : " + e.getMessage()); + vue.afficherMessage(TypeMessage.SYSTEME_ERR,"> Erreur : " + e.getMessage()); } } - 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é !"); + //Fin de la partie + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"La partie est terminée !"); + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"Si vous souhaitez rejouer, relancez le programme."); + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"Si vous souhaitez voir l'historique des coups taper 1. Si vous souhaitez voir les captures taper 2."); + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"Merci d'avoir joué !"); + } + + // Coup reçu depuis le reseau + public void joueCoupReseau(Coup coup){ + try { + partie.jouerCoup(coup); // Applique le coup + vue.setDernierCoup(coup); // Met à jour le dernier coup + vue.afficherPlateau(partie.getPlateau()); // Affiche le plateau + + vue.afficherMessage(TypeMessage.SYSTEME_WARN, + "Dernier coup : " + partie.getJoueurActif().getNom() + " a joué " + coup); // Affiche le dernier coup + + vue.setTour(partie.getJoueurActif().getNom()); // Met à jour le tour + vue.setScore(partie.getScore()); // Met à jour le score + } catch (IllegalArgumentException e) { + vue.afficherMessage(TypeMessage.SYSTEME_ERR,"> Erreur en appliquant un coup reseau : " + e.getMessage()); + } + } + // Fin de la partie + public void finPartieReseau(String message){ + vue.afficherMessage(TypeMessage.SYSTEME_INFO,"Fin de la partie en reseau : " + message); + } + + public void afficherChat(String auteur, String message){ + vue.afficherMessage(TypeMessage.CHAT, auteur + ": " + message); + } + + public void afficherMessageSysteme(String message){ + vue.afficherMessage(TypeMessage.SYSTEME_INFO, message); } } diff --git a/src/controleur/ControleurReseau.java b/src/controleur/ControleurReseau.java index ce145d4..6cd9cd6 100644 --- a/src/controleur/ControleurReseau.java +++ b/src/controleur/ControleurReseau.java @@ -1,5 +1,112 @@ package controleur; +import modele.Coup; +import reseau.*; + public class ControleurReseau { - -} + private final boolean isServer; // Vrai si on joue en tant que serveur + private Client client; // si joueur rejoint une partie + private Serveur serveur; // si joueur héberge une partie + private ControleurPartie controleurPartie; // Logique du jeu (plateau, règles, etc.) + + public ControleurReseau(boolean isServer){ + this.isServer = isServer; + } + + public void setControleurPartie(ControleurPartie controleurPartie){ + this.controleurPartie = controleurPartie; + } + + // Initialisation du serveur + public void demarrerServeur(int port) throws Exception{ + serveur = new Serveur(port); + serveur.setControleur(this); // Branchement du controleur réseau au serveur + serveur.demarrer(); + } + + // Initialisation du client + public void demarrerClient(String host, int port) throws Exception{ + client = new Client(host, port); + client.setControleur(this); // Branchement du controleur réseau au client + client.connecter(); + } + + public void arreter() throws Exception{ + if (isServer) { + serveur.arreter(); + } else { + client.deconnecter(); + } + } + + // Emission + public void envoyerDemandePartie(String joueur) { + envoyer(new MessageJeu(TypeMessage.DEMANDE_DE_PARTIE, joueur, "Demande de partie", null)); + } + + public void envoyerCoup(Coup coup, String joueur) { + envoyer(new MessageJeu(TypeMessage.MOUVEMENT, joueur, null, coup)); + } + + public void envoyerChat(String joueur, String texte) { + envoyer(new MessageJeu(TypeMessage.CHAT, joueur, texte, null)); + } + + public void envoyerSysteme(String texte, TypeMessage type) { + envoyer(new MessageJeu(type, "SYSTEME", texte, null)); + } + public void envoyerFin(String texte, TypeMessage type) { + envoyer(new MessageJeu(type, "SYSTEME", texte, null)); + } + + private void envoyer(MessageJeu msg) { + try { + if (isServer && serveur != null) { + serveur.envoyerMessageAuClient(msg); + } else if (!isServer && client != null) { + client.envoyerMessage(msg); + } + } catch (Exception e) { + onSysteme("Erreur d’envoi : " + e.getMessage()); + } + } + + + + // --- Réception (appelé par Serveur/Client) --- + public void onDemandePartie(String auteur) { + onSysteme("Demande de partie de " + auteur); + // Ici, le serveur peut accepter ou refuser + if (isServer && controleurPartie != null) { + controleurPartie.lancerPartie(); + } + } + + public void onMouvement(Coup coup) { + onSysteme("Coup reçu : " + coup); + if (controleurPartie != null) { + controleurPartie.joueCoupReseau(coup); + } + } + + public void onChat(String auteur, String texte) { + System.out.println("Chat [" + auteur + "]: " + texte); + if (controleurPartie != null) { + controleurPartie.afficherChat(auteur, texte); + } + } + + public void onSysteme(String texte) { + System.out.println("[SYSTEME] " + texte); + if (controleurPartie != null) { + controleurPartie.afficherMessageSysteme(texte); + } + } + + public void onFinPartie(String texte) { + System.out.println("[FIN] " + texte); + if (controleurPartie != null) { + controleurPartie.finPartieReseau(texte); + } + } +} \ No newline at end of file diff --git a/src/modele/Partie.java b/src/modele/Partie.java index e4baaf1..18822eb 100644 --- a/src/modele/Partie.java +++ b/src/modele/Partie.java @@ -34,14 +34,14 @@ public class Partie{ public void jouerTour() { // Logique pour jouer un tour Coup coup = joueurActif.jouerCoup(plateau); + jouerCoup(coup); + + } + + public void jouerCoup(Coup coup) { + // Logique pour jouer un coup Piece piece = plateau.getCase((int)coup.getOrigine().getX(), (int)coup.getOrigine().getY()).getPiece(); - // System.out.println(""); - // System.out.println("Origine du coup : " + coup.getOrigine()); - // System.out.println("Destination du coup : " + coup.getDestination()); - // System.out.println("Contenu de la case d'origine : " + plateau.getCase(coup.getOrigine()).getPiece().getSymbole()); - - if(piece == null) { throw new IllegalArgumentException("Aucune pièce à la position d'origine."); } @@ -78,7 +78,6 @@ public class Partie{ ajouterCoup(coup); // Changer de joueur changerJoueur(); - } public boolean estFini() { diff --git a/src/out/controleur/ControleurPartie.class b/src/out/controleur/ControleurPartie.class index 7f1d115b225feb8ad581bf40843beadd53f4af87..2e0563654ec706477ba9317a107fc569c3fa9356 100644 GIT binary patch delta 2495 zcmX>mHA{)>)W2Q(7#J8_7_Lp^`YFK0AjKff&LG3XAj=@f$RIs&kF+!+gK%+biF1Bl zNl|`IYH3kGVo^zEDkFn}hR;M#X#s1^Fir*q21RxTB_0N429?PIjK(Z#j12OVFET3d zFlaDnvNLG$FlaOAOfF`$V$_?wj!~Y`VDdReRc<2&V|E4;9tKkev&sJ$#d ZEU+ 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 N4C@#+Fl=Iw1OV{#YWx5I diff --git a/src/out/controleur/ControleurReseau.class b/src/out/controleur/ControleurReseau.class index 721ee56f559012485a35924727485fa2afb48a9c..0a6b98029123939edbed3cfe0549be980420fbe3 100644 GIT binary patch literal 3816 zcmX^0Z`VEs1_l>~-CPVz49x5dEIbUX3~Y=H0$GV=iTXK-dFlH8Nm;4MC5#MgHko;u zC3cJq%o>_uoD3Wcoa_u-JPh0nJd6y|$@zIDMfo|YrA7MAaAr_yacW{IBLhcfad2u; zS!xj@17j3OCm#<3KZ5`xg8)KXKw?ozW-23ttPesA$tZ}lH9Lb4BLiO%*j#=0S2UVLjNS`zhgA9W#BLi=7Y6-&K zj0_4I*qs6Kk+o(RNV7Z-g90e5I8st`6N`#ci`W^I7#Vn>);Q;6rskD!F(@*qfE=gF z$RMWSg9z2&lA_GKbZe+{)p-~+7&I9f*pk7z7#a9su7wz54Kha>MCkA^=z=WeOwP~C zOHD3G1^Zv0hrs|O$_{b|SWJ<@h=;)#B*vYR3Rla{V9LlK2z8-vYH@L5da74yDJO$D zg9ST-B@crYgEb?A5L7`(WkD)b5hH`3i>t4rpNng}i)(yLkc@XDi1>%C_!P*?2sJF$iS16n3tSd1mSWqWH4m1Gi32F zWHaQTlq!()&&a@DmY7qT>Ys+@en_EXjm7;!3``IgtuVuliShEg7eGKO+gSAc!b$iSRmTEfU63JLnmeEoo;%)FA|lA_eaTx%f) zW`;^o=vOf^SYQbxh$e7R3Goy*S93AcFx0X$)bTLXg909sCQvP6WMD4U(F2tyj0^%!`S~TqB}It^ zzNsY{`6QZLuOuCes-!pBx^tlF1N(wlKi4dMur*40Si?K@r_4fUP?}C zv5HTAes*brHD8%Xx8yOfF7#aE)7#R2%m>C!t zco+Zd!k^fm@Lgejmxhk-$ifrmkyL4-kqL7G95VG`JP zj10jHj0}?*RH5cNGO&VODXX=cK`~NWW;=uORt7b#EevW}+ZeP!^fm@c56WEd1s3^rh3gBtA4z{tSJz`!7>wS|FwCIc_Tje5%&xFCiaf(&H>hZDrL$_(rb zDhz@QY77z#8Vpmwu4NKrLot3TLjpAX^cmQ};UTQGo53V<6N8zykPYK@2D@zxjv#{} z5daBH9R?u=T?R&mX$;e$n)Mji!JZa^YIfCO)W)vYfI*PKkb#k5217Fry&l>+IP5iH z5M(fAU}TudFbk?z7izB{*j^nWZ*3e}Ef@qCEEyOXW|OYfnn8fUhJgvx5`)^>1L{yP zFfcemVnP%Y6UP|%K$P}22H)k7D4N9}1d5nr4BQ|}dmBT*at1+PEuC!)p}QC&85p)P z#BKyfs6K-cLofp*=9CyX7#J8F82A_*86+8;7}Ob@8T1+48H^ZQ8H^d+7#tWpz%j|m zz#=K?#Lf`R%fQGm2Of#O&`hA9rM-(G5o`y~CSB8O+VIDmCy&0InNk?uILy@-5E`|z_xz!No@_;C9oox&a=my6! z@G`_Ph%m%6$TB3t43=eJ1U3Gk4)%mPSO#S9E`}B)b3riza&IfTu_+8Z45h$Er5P9*=EH*+&Dahs#&)6`o6W$(ki#I%kjo&=kdH8ynPCCA7+lD(h=GAYje(6} nJp&`dVlcTBOfCnLE5YPyFu9gtD+2=q7Xu^1HijJxyBH(^QZ$9} delta 103 zcmaDMdy|pt)W2Q(7#J8_79esja4<4RPnKqso~+3xJ$V|tvLk~c13Lo~0|+oO zFfy<*urV+)a56A3$TEQV3=FJV+Zh-)GB7YOGH@|4fTbB2m>C!uxEUB2m>75fnwJaM diff --git a/src/out/modele/Coup.class b/src/out/modele/Coup.class index 0a82ef7ce5d443856fc721f5e475d2279ae9812c..cc9adb6325dc815f65c0cb7762568fcdfec1d4bd 100644 GIT binary patch delta 351 zcmaFFv5%AM)W2Q(7#J8_80j$S6WhUliRwX9oq%txH z6oa{8sYS(^`FWw9E{qI}UW^R9&iQ%8C5d?@VTn1VsjLhTz&KfuahaSEBLk-bBcp<@ zt^y+?KO2Jy7lSE-89ReH4}&a&#pJ7umszYC8B`}TGO4n$GuSdR$W3NslAHXMNkEj5 zL7st?L5e|W^GLk1_lNx1~vu;27U$>1_1_6 z20;cs1|bGv24MzC1`!5E22BPnu<8zGMNyDyHU>rp1_p5kMh0!D%svzuX$D3H9R^*n zo-fSC)*wB649pA+3SK=rb5FFfed1Fftf3Fftf2STZm$a4|44 MSTWcz*fB@~0J5br1ONa4 delta 258 zcmdnT`G|w-)W2Q(7#J8_7%Vn&u`^DNW?Uwx&B(y1z{seetE<4s$j`>0%f+C_pwG@= zz{4QRU^rQx=`xE6BZKN>MP@lJ6`%b4?9u{u2D8a>%!bSi3@npVnAKV385kK9CQo42 z)>LF*V31;9V_;z5W?*69Vc=xoW#D7rV-RNGXOLtNU|?iWVo(OFe!{FM3R2C+z{tSB zAk4tXpaPYVVnLP>XJBMdWl#g_31Bg{2I=8rU}j)okYV6tkYx~JkY`|KP-kFZU}Df< i&}3j>;9y{6&|zR?&|)xRU|`^4U}P|6Fl8`jkOTk)*Bp5O diff --git a/src/out/modele/Partie.class b/src/out/modele/Partie.class index 75b17d58f5524253bc6b1c6ec9c5ba6fad983478..f8fd3307a4b1c52ef817f7fc92e4e0d3ab218380 100644 GIT binary patch delta 1645 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 diff --git a/src/out/reseau/Client$1.class b/src/out/reseau/Client$1.class new file mode 100644 index 0000000000000000000000000000000000000000..5dd82d0f82ac7062bc3675ab59e2f0ea0c445027 GIT binary patch literal 978 zcmX^0Z`VEs1_l=fTP_AB24;2!79Ivx1~x_pp`z5{)WlN#kjjEo-_+vb#Pn1~2DY-q zoYK@{Mh0;W&1fG?71o>#91NW73|u@6+zdR74E#_f&N-Q>c_k`_j100W!R47H$r-+h z1u76p6%-qoqCGhom>BqY82A|k7#RdzTzwt=TwLQ_T;l^AgF-xA85u;dSqyT$5D$Ye zg9sx7dwx+$W?o_rBLlOBrYAdt7$bvJR$^JAeokUuy1rk2aA|UeTV`rbifd6(ei6tz z2_6PXkae8C{-I&6zOH^DAW>-^1{shji?fF#SU`@4K^`Q)6C4>F;_B-f@9F2}4^pYf z!=QvB5$+h|2a-_XVNeB0aKm)C1_gn{)p-~+K;rB!u5ON=A+8`XEglAKkQhgpr*nwE zXAoFWmxnyloz{ntg@Qr^`R%&tyBLjy`a!zJmW{Dlx(_xGZEYA5U zsf-N#KACx`ext903m6&r zUGtK2@{2R`(tT4)GV)W{8LSu?cp=fI4^hd;z~Pr#T;h>mT*An}1Y0WZ+~FVGw5!WsqP{W>8}gWl(1@VlZV8WiVrKWN={+WpHH(UVWk_KtU?^q~Whh~2U}$C#WoTiTz%ZFXl!1xCgn@y94eVJf22%zG27Lyh zaCQb!245_MA4m+1U|?Y|V_;xlVlZd0U|?WiVX$OiV6X;@STfi!Ffed2Ffwp3FfcF( GZ~y>!_rrMr literal 0 HcmV?d00001 diff --git a/src/out/reseau/Client.class b/src/out/reseau/Client.class index 0fff62b3119b38616e12cd5937b0f4a785d3599b..999bfec45ec512bb89fb19b25f90f8d7f20b85e3 100644 GIT binary patch literal 3731 zcmX^0Z`VEs1_l>~Gh7Tz49x5dEIbUX3~Y=H0$GV=iTXK-dFlH8Nm;4MC5#MgHko;u zC3cJq%o>_uoD3Wcoa_u-JPh0nJd6yyMXAN9iKY6^Ihm<>C5#L#8TrK}j0{3P2xEdv ziZb)ktw9?3co_H@1Q;1u3i69e7#SEnL4ra&48jZ|j11h#`FSNp`8lbjML~=VvOWl| zzB57wY@IbbgBT+NKiH1E)Dr#R{N(J^5-tW&1__WiBpDgRG%#J@339zOgA6-^EDwVm zgFK37gDZ9N`gy@QWJBng%}tZ6nPkw7?c?q#B&p~ zQ=Rkkk`qh9GfOg@^Ye;J67x!m85z{ES`9G}9Ins+;bKr_P-ACM=V8!b&}3u~2Kxrp zMn(qq0+9VVd5jFASd7&SV`tE2WRQYsg~XVDX-PpT)XktU(dA*#W6)=0;7?C2L6&1= zkkHVCxGOVXA6dqli$ROQ5EPU~j0}=ci_z79LX(5RgonYD!HkiCEgx(vBZCaWL~!~+ zF_)def{{TI)w!N|D6X~QVX$VfVPxP-Pc1=`Vq_3Uax9XBH5Y?9gB{4N_8(W@O-pR%kyHt( zEJ*cDEiO(>Pi16aiuUAUNMJ~0XGr2 zDGx&#Lpj7F&iSPUj12r5nm)PtDXBTB`XB*okQJ3Y3{?!(j11iQdA|9jWvRK~f>A&N zMIk5}5*TWE80tVy=Soj40hMv7d8Hr|8h98Q8Ja+OD$hA1u>^aOf<18*FtqS6w1T|H znV$zK(^5f3w(~G_fJC|T^V~A?AYKw;U}ES36=&Uy3~I;;5SG|5t>9#kX6WT%=mQm= z%&A3191If}8SJ3(r%;r7czLNpZenJ!LSkuhX`TWigcXVouLM;T3VDwjW~LUGC?uAY zBqnDZUa6o6%D*xz zco=3g%wc5UD=A9MEJ-bbIt!HCV5to%7bc80y6^tX?ZK?P(#q}h>~ zSC*fhst-wokQ&x4F}WnasFIOk268fmDulSrBQY-}C$(6`CqF;Cw7?oO=^}}sXatom zSd>R2sfVU99AP-h$e@JbB_D8P_@C1rho{Eo%k_F$Pu!aRx?) zr3`EgOkfLJ7+ApSLv}NWMrv(gVAtBhz`LD6+-DPm6pXuzL4ko`8-t40ZU(JL?QIM? z+ZhbDG8k*^W-teFEw?k+Ze?)T&EOKLwTr=xfkDV?JA=u>IF$96= zZ46-ubNLvU!GXrXV8X!9V2Wf86R7xwgbAYn12foz!1RD z%@D}Y#}L9Wk0F#{AwvYiN`@!~kSBQ=I!HVTQR35dT9`jv50ugF1r% zg9d{zgC>IrgBF7{gEoT-gC5v=4hCk1Aa;hi0t_q+Yr$D-9m9HPii%>`z`(#D!NAP0 rlYx<8Bg1|MW`@lSTNpNj`P&(ef%6m-Llh_>2yieQXE@1lnn4l(FFxBX delta 133 zcmbO%dytXq)W2Q(7#J8_7FcmFa4<6P7Nr)aCYI_u=VYell`t}}IOnINGBWV{ zWag#%mF6a;7KJ1x<)lvj#V+m0pvb_^z{CIoj0}tntPE@nj0~I%3=FaiAU*>FtJZb~ d#*GXN42%q13=Cjt1_ovZMh0#M1_mYu9sni`7PJ5W diff --git a/src/out/reseau/MessageJeu.class b/src/out/reseau/MessageJeu.class index cd8fdee9b1efd621916653212312a6feb4182655..8c7de53160a149d944c8a3868c91143fde1899c0 100644 GIT binary patch literal 1688 zcmX^0Z`VEs1_l=fUoHkF24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3ViqSWHl#8Q3V)Z*gA^i;3ZQbq=rlFEWqMg|cd zs9Z>8K`K<<8l;_%hk>6#fRTYMv9u($w1|;G$OmC*a7j^SUOHHv5D$YeNF94}eqKpx zUMWbgC=Y`egE%7tOLBf`0V4yiPi}rnYEG)YbAD-oH5Y>fzZ>Kxu`MK}!~&>G zxPtRbi;`2_GC@Jb4^6vXsik_Lz+_|)aLUgwDK05WEbvV&$;eMB=3ua6WZ+WJ09j?F zz^KW=;K0bh70no{z^GuQz{tqY#^A)o;LPB{&fp4)c{fG|6_8Poe3qG4mYiVPeK zObm<+>I|$5QVg05S`3T~+6)W~Obj{n0fkBFa zje&uIkAa1OpMjG>fPs%ekU^M1h(VG;n1PYOkiiIQrYr*^10w?i1FO~+2KEhb?I4R8 z7{nMD8H^cBuqYKoS1QH8$Y6?9DKENGIR-`sGX`@kri!2|RbpUduz;Id#=ru0t1if` zI~XLiwlMH&ZDA19+QJ}mj6n!Q?O>4D#URJPu$+NaNNE>?3IhYkNG5QQK>Vc6V9CJ1 zpv}PapFx#@k)449RCh?SGl0;4P+)+BSRi}|$-vBD1&%Lk1{-jgGBG$ZFf!PJNqYu& S1_lN$21W)C1}_F521x++xQO8Z delta 116 zcmbQidy5H>7a4<3m7Nr)aCYI{^rWO|`rl)$PmQJo@lAbKb zEbGXi$iU9P!~g<}42%q{3~UUH44e!M46+O$J_7@*)^-NQjSLJ7j0{{13}9&n24)6E M25trh1||j`0GZ$s3;+NC diff --git a/src/out/reseau/Serveur$1.class b/src/out/reseau/Serveur$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f19b4233058fcc0166c0aeaacd1563d47ee255c8 GIT binary patch literal 981 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

HO$v6;Y-2#(bx0IT~%4FCWD delta 635 zcmdnayMUAH)W2Q(7#J8_80;rlr`iF+O`nvjsa56A5aPu(mFt9N)@Va^W#k;u1 z2RH_Wc)EgQ_;?ujK{DLIk-;IZzOGI_uAv}tK^_JnkT?%iJjg%P9jrlwhd~r1!Q$-U z2sT@she3itl97R3CCt$$)HRrqK{VQD@>WJsZfOP?b_Piv23ZEV$yXT_xfK``*%_30 z7?c@QCNnaHawssU@i3?}XiSb{(v(u;VBq9n;Nf84=U@=xU=ZbEU}P}lVK8Dap1g88{hC7>pSh8B7@%7?cCzLL7st`ff?i=Ep3_Y45}M3ECOldWMW_tU;txF29N<(0$d>PK;7%azyfkEgO&i> zI@tVCJdYmjtpE3 TehkbEObige*f7|F{bUCK2S!k8 diff --git a/src/out/vue/VueGraphiqueSwing$1.class b/src/out/vue/VueGraphiqueSwing$1.class index 00e0feb0ff3c89c8dcbb806d9908d04af42f9b2e..44f243c45433e872b6865178badfde7526c77bf9 100644 GIT binary patch delta 259 zcmdna`i7P3)W2Q(7#J8_81yD`{deREjtmZQ^>vN+^mFs)WME>D=3$Uw5MX40ON2WH z`GF+lco^hC65KEyu0cWU42qKt8QWR385u+;#*0qA$SAL>z`(%3C?LVW&Ao*_ zF(@-IGN>>xFwA0LW?*DsU~ro(%484t|G#MBeSQxYz7#MWG WB3cZ(3=9lh42%pM3=9km0vrH)!6e}T delta 226 zcmaFEx}BBl)W2Q(7#J8_7_=vH{ny|QjtmZQ^>uafaSi2UU}BKwVUS@EU}WHdiU;|J zy1TM7$W8WQY-iD6WDuPgFFN@Zqr9pt0|Nu2fCK|K0}qJBz`-ETpuoV$pvb_$P{+W` zz{tSBU_M!o$t-6h12Y3Bg9w8-gD8UpgEE5}gD8VKgAs!%gD3+NgAxM+0~=WNVFqOe z1_nU}ws3X^Q3hW)!N9_x!oa}5#GuNc#=yY9!l2H;z@P~hQD@L%U|`^4U}WH6U|?Vn G-~a$diW}bm diff --git a/src/out/vue/VueGraphiqueSwing.class b/src/out/vue/VueGraphiqueSwing.class index c99eaa61cefe29bb019da46046eab5c55af221f6..5a9cac3ff72c0f0d042ab84d785374e5b1e69bd3 100644 GIT binary patch delta 2732 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 delta 2689 zcmX@$wAhjB)W2Q(7#J8_7>{h^y2okA&hUVdfiEkuEKxtPyhPtQKPSJ4i{U=QBOV4; zhR2KyY#N@Po|<8t4EGtH@-RGOcs^N&OE&pF!%H59R}9Y?8CczeTwVP@I^OUwyk&UD z$iSA8Sd^Vw#K<6|q3MHaur7}y!U@i2U6 z_%V4umzKgW9){lxKNuN!i&IP7@{3Z_i}FkJQn(nB8UFGx{A2h(nUmXtjgg0uiII77 zIJXTOD-RGWh$jBf* znV(m5ay+jlr!u1oJEJNOquS(&yvlqUj0_B14BU)bJdE0mI+G9aI!fv>GH@5C7L}!z z7CGglmV#srco+>CbtcR3Ny!>BGVnlUgYrw$Q#lz;8O_)k&3PCt7%eBK@tLw&^Dvxb zw3)n+Pn*+@(Vm^rfrrs?@>M=HHfJ727e?2~jQlcuB3z7~j9%=F-aL#xjJ}h#`BfPG zCkOB=b9gca@-PN522ZZ$*EIEH4CP@AV_;)s;LOY`Ni8ZWEhyn)aA1t!VT=Tcaup?} z6(wdSXJi&}F`QwH=3$IsjGcUw-(1C7h=GmKnu|ezF_DKci9w8!fxS4jBqX&0tUrZ^ zF_kfGvWbAYfVB_<2S{NxV-^o%He=4@YymUQJjQ%>#sVJ3!pW-yv}E%bi+LDJ7)%%$ zIEqtC!V+^zQ$b-;#=}_7STXsdK$w0N4`VgNJ*j1hIhiSmC8=Bt?2NTMjCCMk_M+5+ z#LT=BAqGxHDR#!j&1HhO8S7^%?!&xr^#vK(M!P@OCwCdZ}Xlb@em zTENbDXfm&uF=qnvH-z`*3sz{bGE zz`$5D`M;!feE>UyKFB7m(x-x(nvBv6^v;a;{=vV5nz+044?o21y1625SZehS=Q<_ag-v zP6#sm7i2iGo#CMs>n4ULR&1LXUes@6cx}bLoFNUO9a0ja56I8_~kP0ONDkNDXS+_BK)s0j?d4 z3_BQEwlQQ#vg~H?k7O25-p&xXjiD976=vju2rzO(1O!qbe1wV>D;zXLMkg!061- z$LPs0g)xF*Dq|+YG{#DX8H}wA3=FOeoc|dj7`WIOxY-%bfRO+@11LJ#8O|^=F!1y9 zNGU2R{%4S5;6SLUX8HNE7#Mi8v~_kd@-Z;%U=-R2 zRs-@b7Xv7g=QD6KtYKgT6;@DPrchm?U|kYmU0S;sCBY1Yc0Q2N^$Z&sxEXdah%oG9 zU}S7#Y=@fB4K*WZ6QhjwHbx~qP}*W(V6X+*4ob2N3=A?13=HZF3=BqE!i?%V+ZZ*M zGpK3_GwSMWW7J>HAf+YDXar&MZ(=mj*~MtZz_5+c7UTd(bV)I=fs*TC1{H=Q4EhX5 z8LSwNF}N}uX9#3C2@XU@8JIv0XHeDJ!sv9IK~#j%Z3m;r z^8cTGcQ6KQV+>*30Fv<4V%*B;q_cs6k%66omqCEh51K~Q7&sXi7|t@VGn{AOWw>0= zAi!{eL6G4hgE+$_21$mi3~~(D7?c^VgB`%Zz|7#!&gjR%z{uFe*bQ}o3IiiJ;52o#8G6BV!L^8dQfV0~1(>sFwCtMyE}TCfYj~qjoXIF)-9a zLjM z=L`}IFBljZ`xwNaPSJuI!>6@{K~{TLJ!3l95QJukAKozVGQ4GAWbDVPQAv9jV+K}z z9~pQVJ_#^^ifyQchENLywYD&HZez^!(bnF^n7fU!2yA6NINTr(-p#VCU}0cj(9zP?*~VDvr?rJaRd*XhPB@4mz`ui`0LIzISP2r_##jS38f-Es zjWIB6Vqj<3%pkz9g+Z2KD}xHdHU@2m?E*}UlNiNypw^^9tucjIGg(VPwjN|0*EYr) ztzC@uXqiV2oU<1&urn-V5MWruAj`0rL4{!ngEqr*1`~$W0!*Mv1!^?@5CA(95&$b0 zI2cwk2r#T-U}2oXz);1k348Uq6Z3j-sgEaP+r1_nO{F2;=vjEplFw=*y^&SIR+ zI19>}2WKs0oCQ|11WYailPkdFDloYQs$(7FEJjcZQ;30y5maz82yig&XFSMwm_ZT% DAS*BQ diff --git a/src/reseau/Client.java b/src/reseau/Client.java index 429cccf..394f725 100644 --- a/src/reseau/Client.java +++ b/src/reseau/Client.java @@ -1,5 +1,97 @@ package reseau; +import java.io.*; +import java.net.*; + +import controleur.ControleurReseau; + public class Client { - + private final String host; // Adresse IP du serveur + private final int port; // Port du serveur + private ObjectInputStream input; // flux d'entrée (messages du serveur) + private ObjectOutputStream output; // flux de sortie (messages envoyés au serveur) + private ControleurReseau controleurR; + + public Client(String host, int port) { + this.host = host; + this.port = port; + } + + // Associer le controleur réseau au client + public void setControleur(ControleurReseau controleur) { + this.controleurR = controleur; + } + + // Connexion au serveur + public void connecter() throws IOException { + Socket clientSocket = new Socket(host, port); + System.out.println("Connecté au serveur " + host + ":" + port); + + output = new ObjectOutputStream(clientSocket.getOutputStream()); + input = new ObjectInputStream(clientSocket.getInputStream()); + + // Thread d'écoute des messages du serveur + new Thread(() -> { + try { + while (true) { + // Lire un message reçu du serveur + MessageJeu message = (MessageJeu) input.readObject(); + traiterMessage(message); + } + } catch (Exception e) { + if (controleurR != null) { + controleurR.onSysteme("Serveur déconnecté."); + } + } + }, "Client-Listener").start(); + } + + // Envoyer un message au serveur + public synchronized void envoyerMessage(MessageJeu message) throws IOException { + output.writeObject(message); + output.flush(); + } + + // Dispatch : traiter les messages du serveur + private void traiterMessage(MessageJeu message) { + if (controleurR != null) { + switch (message.getType()) { + case DEMANDE_DE_PARTIE: + controleurR.onDemandePartie(message.getAuteur()); + break; + + case MOUVEMENT: + controleurR.onMouvement(message.getCoup()); + break; + + case CHAT: + controleurR.onChat(message.getAuteur(), message.getContenu()); + break; + + case SYSTEME_INFO: + case SYSTEME_WARN: + case SYSTEME_ERR: + controleurR.onSysteme(message.getContenu()); + break; + + case DEFAITE: + case VICTOIRE: + case EGALITE: + controleurR.onFinPartie(message.getContenu()); + break; + + default: + controleurR.onSysteme("Message inconnu: " + message.getContenu()); + break; + } + } else { + System.err.println("Message reçu mais aucun controleur réseau n’est attaché !"); + } + } + + // Fermer proprement + public void deconnecter() throws IOException { + if (input != null) input.close(); + if (output != null) output.close(); + } } diff --git a/src/reseau/Serveur.java b/src/reseau/Serveur.java index c32ddbe..38af592 100644 --- a/src/reseau/Serveur.java +++ b/src/reseau/Serveur.java @@ -3,49 +3,102 @@ package reseau; import java.io.*; import java.net.*; -import controleur.ControleurReseau; - +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; + private ObjectInputStream input; // flux d'entrée : messages reçus depuis le client + private ObjectOutputStream output; // flux de sortie : messages envoyés vers le client + private ControleurReseau controleurR; // référence au contrôleur réseau (qui gère la logique côté app) - public Serveur(int port){ + public Serveur(int port) { this.port = port; } + // Permet de brancher le controleur réseau à ce serveur public void setControleur(ControleurReseau controleur) { - this.controleur = controleur; + this.controleurR = controleur; } - public void demarrer() throws IOException{ + // Lancer le serveur + public void demarrer() throws IOException { + // Crée un serveur qui écoute sur le port choisi ServerSocket serveurSocket = new ServerSocket(port); System.out.println("Serveur démarré sur le port " + port); - // Accepter une connexion seule client + // Bloque jusqu'à ce qu'un client se connecte 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()); + output = new ObjectOutputStream(clientSocket.getOutputStream()); // envoi d’objets au client + input = new ObjectInputStream(clientSocket.getInputStream()); // réception d’objets du client - // Démarrer un thread pour écouter les messages entrants - new Thread(()-> { + // Lancer un thread séparé pour écouter les messages entrants en continu + new Thread(() -> { try { - while(true) { + while (true) { + // Lire un message envoyé par le client MessageJeu message = (MessageJeu) input.readObject(); + + // Dispatch du message vers le controleur réseau traiterMessage(message); } } catch (Exception e) { - if(controleur != null) { - controleur.onSyteme("Client déconnecté."); + if (controleurR != null) { + // Si le client se déconnecte ou erreur réseau + controleurR.onSysteme("Client déconnecté."); } } - }) + }, "Serveur-Listener").start(); + } + // Envoyer un message au client + public synchronized void envoyerMessageAuClient(MessageJeu message) throws IOException { + output.writeObject(message); // sérialise l’objet et l’envoie + output.flush(); // vide le buffer pour s'assurer que c'est transmis + } + + // Dispatch : traduit un MessageJeu reçu en action pour le controleur réseau + private void traiterMessage(MessageJeu message) { + if (controleurR != null) { + switch (message.getType()) { + case DEMANDE_DE_PARTIE: + controleurR.onDemandePartie(message.getAuteur()); + break; + + case MOUVEMENT: + controleurR.onMouvement(message.getCoup()); + break; + + case CHAT: + controleurR.onChat(message.getAuteur(), message.getContenu()); + break; + + case SYSTEME_INFO: + case SYSTEME_WARN: + case SYSTEME_ERR: + controleurR.onSysteme(message.getContenu()); + break; + + case DEFAITE: + case VICTOIRE: + case EGALITE: + controleurR.onFinPartie(message.getContenu()); + break; + + default: + controleurR.onSysteme("Message inconnu: " + message.getContenu()); + break; + } + } else { + System.err.println("Message reçu mais aucun controleur réseau n’est attaché !"); + } + } + + // Arrêt du serveur : fermeture des flux + public void arreter() throws IOException { + if (input != null) input.close(); + if (output != null) output.close(); } - } diff --git a/src/reseau/TypeMessage.java b/src/reseau/TypeMessage.java index 3eaf8a8..3cd3744 100644 --- a/src/reseau/TypeMessage.java +++ b/src/reseau/TypeMessage.java @@ -1,12 +1,26 @@ package reseau; public enum TypeMessage { - DEMANDE_DE_PARTIE, // Un joueur veut lancer une partie - MOUVEMENT, // Transmission d'un coup - FIN_DE_PARTIE, // Signal de fin + // Partie / connexion + DEMANDE_DE_PARTIE, + ACCEPTATION_PARTIE, + REFUS_PARTIE, + INIT_PLATEAU, - SYSTEMEBLEU, // Message système ( info serveur, etc.) - SYSTEMEROUGE, // Message système ( info serveur, etc.) en rouge - CHAT // Message chat entre joueurs + // Jeu + MOUVEMENT, + ABANDON, + ANNULATION, + TEMPS_DEPASSER, + + // Fin + DEFAITE, + VICTOIRE, + EGALITE, + + // Communication + CHAT, + SYSTEME_INFO, + SYSTEME_WARN, + SYSTEME_ERR } - \ No newline at end of file diff --git a/src/vue/VueGraphiqueSwing.java b/src/vue/VueGraphiqueSwing.java index b2e69c1..4b8f3cb 100644 --- a/src/vue/VueGraphiqueSwing.java +++ b/src/vue/VueGraphiqueSwing.java @@ -130,6 +130,11 @@ public class VueGraphiqueSwing implements Vue { fg = Color.RED.darker(); border = Color.RED; } + case "serveurorange" -> { + bg = new Color(255, 220, 220); // orange clair + fg = Color.ORANGE.darker(); + border = Color.ORANGE; + } default -> { // adversaire bg = new Color(255, 220, 220); // rouge clair fg = Color.RED.darker(); @@ -194,8 +199,9 @@ public class VueGraphiqueSwing implements Vue { public void afficherMessage(TypeMessage type, String message) { switch (type) { case CHAT : ajouterMessageChat("", message); break; - case SYSTEMEBLEU : ajouterMessageSysteme("serveurBleu", message); break; - case SYSTEMEROUGE : ajouterMessageSysteme("serveurRouge", message); break; + case SYSTEME_INFO : ajouterMessageSysteme("serveurBleu", message); break; + case SYSTEME_WARN : ajouterMessageSysteme("serveurOrange", message); break; + case SYSTEME_ERR : ajouterMessageSysteme("serveurRouge", message); break; default : System.out.println("[INFO] " + message); } } @@ -204,7 +210,7 @@ public class VueGraphiqueSwing implements Vue { public Coup demanderCoup(Plateau plateau) { while(this.c == null) { try { - Thread.sleep(20); + Thread.sleep(15); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); return null;