From a8fde43596860a0cbe819c83e9dd18dbd177761e Mon Sep 17 00:00:00 2001 From: marc barbier Date: Mon, 4 Jan 2021 16:10:09 +0100 Subject: [PATCH] ajout mana + patch defait/victoire + resilience en anti crash --- bin/game/Board.class | Bin 1126 -> 740 bytes bin/game/Command.class | Bin 1184 -> 1139 bytes bin/game/ComsJoueur.class | Bin 2336 -> 2191 bytes bin/game/Joueur.class | Bin 6756 -> 7930 bytes bin/game/Match.class | Bin 2605 -> 2727 bytes src/game/Board.java | 10 -- src/game/Command.java | 10 +- src/game/Joueur.java | 294 +++++++++++++++++++++++--------------- src/game/Match.java | 21 ++- 9 files changed, 198 insertions(+), 137 deletions(-) diff --git a/bin/game/Board.class b/bin/game/Board.class index 154bf93731a08a2f9f185ef7bee7807102e6041c..3067fe93e1f90b06dda03577db06c25d5db64122 100644 GIT binary patch delta 36 scmaFH@r0G@)W2Q(7#JAL8I(41#W7A+VA5t}+3dsQ&B)5Yz{H>k0Nfb}?*IS* delta 423 zcmZut%}N4c6g_vG@f&S0Q~E{0wDK>Tvdl_q5$zHZgs4q0k%^&B*ch~O(;L(av~q2Q ziwL(tFVQA?jO>m=5VX19J@=k_&b{BK@};`pzh8O)vdDJaC)66fY*gyjUg@-1-ZhQJ znG0de2}B6q3**|*t46)77jLetQcc4=76=ZrX%WWrgLcK#3${SfYLtvxPDPABM{Xpr zD3B!h|6yrJVTqvF&RJV3Hq;tgSzImW;)g1hS?a)+N^4k!N)Urxt91eA-8rR5dAg^4 zYN;T&_@q}zQ250e1qo^v%Y8-@is>6ROj?oqCoJW|G~J6 zl@1R(;N>_2C&v){{2O6Jc!vi>MKC53 XSOfY@v9W;mTM>U45|cALEMffz_CruD diff --git a/bin/game/Command.class b/bin/game/Command.class index 4e0d40b82b1c1fae949bab67fd1def611818a25a..3c8877177d740f0623a2af548728b5c8b328600e 100644 GIT binary patch delta 184 zcmZ3$`I&?3)W2Q(7#JAL8A3L4aWe(*1iOaByZX8MM#g&ta4@(sGH@2BmZavT=4KQy zGO&SULE;{a46HzLu$WC|US^3MBLlOBW*8#_i*tTTDi;GYgD($*Cxh4ICZ-fdvCYq! z5*dMdm_R}dj11mD8})%SBamj*+Ros!5y)U-@B@-;U_lNBe;}I&qJSZQArQ!8WC#MQ G3I+gKOd%2g delta 247 zcmX9&OHKko6s*@E4h@M*!wrNDOE-jsG;RDeBTf(KjttBrnPeOdjB)89ynt6AE=*i_ z0IuWS@Q_Vay?Rwi{RSU(z5VzDx%ZRtxD*jg)7uRIF@+|*P_(EBpiy<6(-@M&KGVs|B*YveE|p% Q2{sP_c*JrMCV~pn9Sc(~v;Y7A diff --git a/bin/game/ComsJoueur.class b/bin/game/ComsJoueur.class index 26ff0e66347eb4bf0fd3c16995b6d0783f5f6425..e2e8c3ef438d13080847b29c3ae3dae198a9763e 100644 GIT binary patch literal 2191 zcmZuxX;T|V6zma#1+fMr4r8#bg&cr5l*GUWeSr>7x(Cu-4>-P74EHT3-sNIF@Jqfc&DyL$dlb5C z3k;u&T(*;eZJtx!mrU3bh1t?Cl)@!uX}fFLmj8u7-}r^yi7kQ5;`6es`<7#S8oC8~ z8<>{YPj>{;3r~d#(=f`wv)B@*<~tJ~Ei%3XcW_q&Yb5+ydg1x9rsH$aIxUW}YyT5yr0Jfrj;jyAu?2e2ZHGT3xZKQeCYkJVx2Yoa8}^3T}t~Ob^H{nEL{rri@@gM#>V2q4I{9nQLdVvCk@-N4c~Qw zgEub?(|GgJmzNJ-B|UFj0DZSs8o|S@q*73#o^cs|k1!;n;#~zQBQwo2tiRnXM{0 zfm@bKmb!)A%@=z{=|CK`JKyydq|`IQQA*wA@XMRbZyO^zp>zEbXKBv5aG9ej$0>ft z^C#%ZzeeBo9fBc7PC8tVL*mj zRT!uqTvbf*9SU{Lb7zt|PSFL^+?~N7%PY=C2x>S6pdO6J*k$2Cu0O^Tj;t_aYDGhZ z|6N?6i7u#dkL&b2x|JHo*pIN*&a=PG2H#2$`Ke&`?SmrmQ~?k;9S@x#8{d(M5%bIx9Cl^5|&lm)zF8V8LY_Xr}FlhhE;qnk9?ux zOBG*9&wCksoxwLM%na5vf>b3)O?vUx2O;;qRk5z(zJjbL+zsK*2fl)_$^&!5ELl!z ze(iy%`rK>={*vzsvvEa1CUPy?3P$&MmhGft+Hdg`BxPT z75`^Fv7#U~?bL*V{)%ObxuCHo++}mE&YgV4shaf_)3xL}-c0%TEl&noHyfff?KHew zP9Or8fwZb)+swjpNLZVBToq0EPVbZ_?3#k%m_XgM*GtUOve&Oj25Liip1B@|3=5KU zpxG5wOKi|QR6G%-(CMJiG@dX_*GE$85$) z<~B{szi!tS_YWM2MZByl{J^zW%({Y}YTfZjq`N3n%B~APQb57rF6$0iQpK`#Ojk{} zR%UUOGK;q41a4K#TC)88?c$!6RnbwzH3f%X-!dvJ9S`tOde(J}<4px4o$iUg(b0e{ zT^${7;cXr7;JA(^9;tA3cwjpn+N;Kmz^d1T%hp_?qSVjO5nw~dCN8LWtm6sJ>G%#) z3I_I`RbaHY_LoS<_cHAA%;MtA-9;m?g;AAS3d446!*`uvT9l1rlK&KG7t*|^MItE%nVYdeSrRx20~@l?hDjPE zO7Es?`C^xD$0)}AEWMJdJ@I_eU_-Mo$~N`Z^}S*`7Po1u(r#*Te$4MF;35G!TG^Acmdt~4s#0l)+Jj!e6q{=RM`wg zoZ$WhS9PTL1{5cDpiI0#*Xm>o-8)Eaqle41T&g?BY$H1{xee{-5NVS4gXrNs$MgLd z!~mlmAbuVvLtBW6Q#j2P(NUsJ!5O}%_#ENI28%h|3)uqW6ThH`@p_*_e}TT$9pv); zEevpLpoIf1<|aESR95>dxrMIFbx{0nwQWtVeDX8seSOO~UInr&h5cMNS+ zp5tKt5Ci24Tb2CbtABKPuxD*5T5K)tqyTXE{!=vXDFg-Dh?1URJs|6+~Q!B9bBK-^0ezb+7q5j9( d^r8}6V$m-rN>GR~iGXQ*#F$BvGa;MV{{TD704x9i diff --git a/bin/game/Joueur.class b/bin/game/Joueur.class index 2a7ad1ff2b95e03f91ae8d798c4f206c9683e512..b37a273b858c7bb4c0fa0853df6dfc13549c8d22 100644 GIT binary patch literal 7930 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 v!$EQ%^ZLE?^ZP1%+*&rYH8`s(hc+WLz&7b3Z) literal 6756 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 diff --git a/bin/game/Match.class b/bin/game/Match.class index 20822baab27ae05954ecff452dbfbb996115d0f6..e79f9bed4fd93b9be8f07e4b03939f7223f6b81f 100644 GIT binary patch delta 1403 zcmYjROK%%h7(Ek@<79G8h$*7NUbqgpsa<5EN>o57L}^mHWQd_|0EecG?P)UUc;d{A z6H-#l`(0j!7UvIGU33wFEX1NKBqaV0+X^_>7kCA61rf`ewXJPagMy;Kt9VVpgz41I8Fh2^if_6F&uf|r)T#1`WtmhG zxQLj75hm$|UtOnZdFQ7~P1jMNl-tXpeZ5KR2f@< zBd{rB;cAebz?Oh3$qifHS<|R#@Ub01Q^CU<#KMI@Ug%r630lxH5bJQe@C{xjj=Etv#dX6or)AA| z0^dvbSjF&t+w2FVzb)|NFLU7=O6zY7A;cjssWV+ z(DY2ahoyrcjnU{JZ~xyvGd*1BVswzfwqZ;n%`wbk9(mp&%8Bt?IE_V;ilT&77`!Xo-A&$s zYG){s)GkU1;-sD;`7~al7;~&#ph)LfpGT48OO#}la#i@UNwh(#4}{wq2uHpY?pdi^ znu-Q`6%Q?`+)-%p0`*cK@1Kh_(Lbo)#rExyRIAa!k$_X}P@##yk`5_E@R9-q4rv{* zdB7`;QQFJUIKl~nILZOWQ6|3?uEHgbe3jTQ_wfrt1v)V> zra6%;|0Qz#Z#ac*D!+^346boc_bC7MKFnl*=1^uGKXEe^Hh2a%X$^5$;5fsvxd;;X PFwRp=GT|28L-_eWBR&qr delta 1241 zcmYjQSx*yT6g{O=3iYc9R3V`;EQ&%=FruOn6_pAKg6t?R10A3^EjZHw!KLo|%BTtc zfj;>_G>tLDR}-I&zs88?>mZP(_ulVrJ?Gxr)aFkC-_O6_z5_Ub4~sspyV-?yfwL%Z zAzzC}PN^}iX*8i3t)^*dJ_OMza1JFdc%x>M9-XGog>Hc!S&_qvb~Q0FZtL#S>;Zv6 zoVVxQ<)uTo^Wt7az@~~Y~qWWEowXxwsc)KniIHzn`{&@)ETOstyO)}e_J3a{hpX+=@}Gv z1@2{NPZ`=&yBb$z+5>@y8RzVzWh5+vRDyUc@I*TEBHFN(=wYNeZg2JElspr7jx)p% zQ={?Dan;oJ$o!WAuk0pIKzSqZ_Vb|Ur7QUZS^NNvDFmylzo0CQ7O5+!Q^;+rPNQwn z@pml1??gI2F8^krD}@{w_Fce;Q*cC~Xey|F1>j@FPHEepHe0 zUg`!MM>BO8o#>`^=W5g?z@p&DQ# zGKS(+^7X5h9K#mm^h^GIQnXPZBS^o;F3BxVPAnkcz*imqu@v$hOFGCo=DZ|3$04mn zwstsFBA0dtd<2)zKWQ<#xV~!l7$Hsa1`QsR$st=U+|2a4k%m|B5fJ8)P0U3svuR~9Q(l%*aKek=ALLOgjK8Bd H3-A8{)#T@> diff --git a/src/game/Board.java b/src/game/Board.java index e0724f8..2d1f94a 100644 --- a/src/game/Board.java +++ b/src/game/Board.java @@ -28,14 +28,4 @@ public class Board { return board[zone]; } - public void printDebugBoard() { - for(Card c : board) - { - if(c == null) System.out.print("X"); - else System.out.print("O"); - } - System.out.println(); - - } - } diff --git a/src/game/Command.java b/src/game/Command.java index a75f463..8685eac 100644 --- a/src/game/Command.java +++ b/src/game/Command.java @@ -5,7 +5,7 @@ package game; */ public final class Command { - private Command(){} // pas de contructor on ne veut pas instancier cette classe + private Command(){} // pas de contructor on ne veut pas instancier cette classe public static final String YOURTURN="yourturn"; // commande de debut de tours public static final String DRAW = "draw"; //demande a pioché public static final String GET_DECK = "getDeck"; // demande le deck @@ -26,10 +26,6 @@ public final class Command { public static final String DESTROY_CARD = "destroyself"; //demande au clien de retirer une carte du terrain public static final String DESTROY_ADV_CARD = "destroyadv"; //demande au client de retirer une carte adverse du terrain public static final String BATTLE = "battlephase"; - - - //inutilisé - public static final String SELECT_CARD = "selectCard"; - public static final String DEFEND = "defend"; - public static final String CAST_SPELL = "castSpell"; + public static final String SET_ENEMY_HP = "setenemhp"; + public static final String SET_HP = "sethp"; } diff --git a/src/game/Joueur.java b/src/game/Joueur.java index 7a27755..b4de8e6 100644 --- a/src/game/Joueur.java +++ b/src/game/Joueur.java @@ -13,18 +13,20 @@ public class Joueur { private Hand hand; private Board board; private int pV; - private int currentMana=0; + // la quantité maximum de mana elle augment de 1 par tours + private int currentMana = 0; + // la mana actuele du joueur private int mana; - public Joueur(ComsJoueur connectionJoueur) { - coms=connectionJoueur; - pV =20; - this.board=new Board(); + coms = connectionJoueur; + pV = 20; + this.board = new Board(); } /** * cette fonction permet d'obtenir le deck du joueur et de préparer la main + * * @throws IOException */ public void requestDataEarlyGameData() throws IOException { @@ -35,16 +37,20 @@ public class Joueur { hand = new Hand(deck); coms.send(DeckSerializer.serializeDeck(deck)); draw(5); - + coms.send(Command.SET_HP); + coms.send(pV); + coms.send(Command.SET_ENEMY_HP); + coms.send(pV); + } /** * cette fonction permet de pioche une quantité donné + * * @param amount la quantié * @throws IOException */ - public void draw(int amount) throws IOException - { + public void draw(int amount) throws IOException { coms.send(Command.DRAW); coms.send(amount); hand.draw(amount); @@ -52,6 +58,7 @@ public class Joueur { /** * affiche sur l'ecran que c'est le tours de l'adversaire + * * @throws IOException */ public void debutTourEnemie() throws IOException { @@ -60,6 +67,7 @@ public class Joueur { /** * affiche un menu de victoire + * * @throws IOException */ public void win() throws IOException { @@ -68,6 +76,7 @@ public class Joueur { /** * affiche un menu de defaite + * * @throws IOException */ public void lose() throws IOException { @@ -75,102 +84,118 @@ public class Joueur { } /** - * cette commande doit être utilisé a chaque début de tour elle permet d'augmenter la mana du joueur + * cette commande doit être utilisé a chaque début de tour elle permet + * d'augmenter la mana du joueur + * * @throws IOException */ public void prepMana() throws IOException { - //on prepare la mana - if(currentMana < 10)currentMana++; - mana=currentMana; + // on prepare la mana + if (currentMana < 10) + currentMana++; + mana = currentMana; coms.send(Command.SETMANA); coms.send(mana); } - /** * premiére phase de jeu avant d'attacker + * * @param adversaire - * @param board + * @param board * @throws IOException */ - public void mainPhase1(Joueur adversaire) throws IOException { - boolean phaseActive=true; - //on retire le time out sur l'adversaire car sa peut causer des désyncronisatoin et des crash + public void mainPhase1(Joueur adversaire) throws IOException { + boolean phaseActive = true; + // on retire le time out sur l'adversaire car sa peut causer des + // désyncronisatoin et des crash adversaire.getComs().getSocket().setSoTimeout(Integer.MAX_VALUE); - //debut de l'écoude des action client - while(phaseActive) - { + // debut de l'écoude des action client + int alive = 0; + while (phaseActive) { coms.getSocket().setSoTimeout(500); String command = coms.recieve(); coms.getSocket().setSoTimeout(Integer.MAX_VALUE); - if(command != null && !command.equals("time out")) - { - System.out.println("GOT COMMAND :"+command); + if (command != null && !command.equals("time out")) { + alive = 0; + System.out.println("GOT COMMAND :" + command); switch (command) { - + case Command.PING: coms.send(Command.PONG); break; - + case Command.PASS_TURN: - phaseActive=false; + phaseActive = false; break; - + case Command.PUT_CARD: System.out.println("entering put card"); - putCard(adversaire,board); + putCard(adversaire, board); break; - + default: - System.err.println("unknown command "+command); + System.err.println("unknown command " + command); + } + + } else { + alive++; + // 3000xalive =300s = 5minutes + // si au bout de 5 minute le client ne repond pas on envoie une erreur + if (alive > 300000) { + throw new IOException("dead client"); + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { } - } + } } - //cette mothode est utilisé l'orse qu'un joueur utilise Command.PLACECARD - //elle verifie si le joueur peut la jouer et refuse ou confirme en fonction + // cette mothode est utilisé l'orse qu'un joueur utilise Command.PLACECARD + // elle verifie si le joueur peut la jouer et refuse ou confirme en fonction private void putCard(Joueur adversaire, Board board) throws IOException { String info = coms.recieve(); - //si ce n'est pas un nombre - if(!isInt(info)) { - //alors on affiche l'inforamtion si la sortie d'erreur + // si ce n'est pas un nombre + if (!isInt(info)) { + // alors on affiche l'inforamtion si la sortie d'erreur System.err.println(info); - }else { - //on recupére la carte + } else { + // on recupére la carte int cardId = Integer.parseInt(info); - + Class cardClass = CardRegistery.get(cardId); System.out.println(cardClass.getName()); - - - int zone = Integer.parseInt(coms.recieve()); + int zone = Integer.parseInt(coms.recieve()); Card handCard = hand.contains(cardClass); - //si la carte n'est pas trouve ou si elle coute trop cher - if(handCard == null || mana < handCard.getCost()){ - //on refuse le placement + // si la carte n'est pas trouve ou si elle coute trop cher + if (handCard == null || mana < handCard.getCost()) { + // on refuse le placement System.out.println("no mana or no card"); coms.send(Command.NOK); - } - else { - if(board.isZoneAvaliable(zone)) - { + } else { + if (board.isZoneAvaliable(zone)) { hand.remove(handCard); board.setCard(zone, handCard); - adversaire.enemyPlay(cardId,zone); + adversaire.enemyPlay(cardId, zone); coms.send(Command.OK); - }else { + + coms.send(Command.SETMANA); + mana -= handCard.getCost(); + coms.send(mana); + } else { System.out.println("the zone is not avaliable"); coms.send(Command.NOK); } } } - + } private boolean isInt(String info) { @@ -179,11 +204,12 @@ public class Joueur { /** * cette fonctoin est appelé affin de placer une carte sur le plateur énemie + * * @param cardId * @param zone * @throws IOException */ - private void enemyPlay(int cardId,int zone) throws IOException { + private void enemyPlay(int cardId, int zone) throws IOException { coms.send(Command.PUT_ENEMY_CARD); coms.send(cardId); coms.send(zone); @@ -199,48 +225,47 @@ public class Joueur { public ComsJoueur getComs() { return coms; } - + public void setPV(int pV) { this.pV = pV; } - - public boolean isDead() - { + + public boolean isDead() { return pV == 0; } - - public boolean isAlive() - { + + public boolean isAlive() { return !isDead(); } /** * envoie le message donné qui aparaitera alors comme une toast + * * @param message * @throws IOException */ - public void sendMessage(String message) throws IOException - { + public void sendMessage(String message) throws IOException { coms.send(Command.POPUP); coms.send(message); } /** * affiche le debut de tours + * * @throws IOException */ public void yourturn() throws IOException { - //on affiche le debut de tour + // on affiche le debut de tour coms.send(Command.YOURTURN); } - public boolean isHandFull() { return hand.isFull(); } /** * retire le nombre de carte donné du deck + * * @param nbcard nombre de carte a supprimé * @throws IOException */ @@ -249,81 +274,124 @@ public class Joueur { coms.send(nbcard); deck.draw(1); } - - public void battlePhase(Joueur adversaire) throws IOException - { + + public void battlePhase(Joueur adversaire) throws IOException { coms.send(Command.BATTLE); - + boolean phaseActive = true; - + adversaire.getComs().getSocket().setSoTimeout(Integer.MAX_VALUE); - //debut de l'écoude des action client - - while(phaseActive) - { + // debut de l'écoude des action client + + while (phaseActive) { coms.getSocket().setSoTimeout(500); String command = coms.recieve(); coms.getSocket().setSoTimeout(Integer.MAX_VALUE); - if(command != null && !command.equals("time out")) - { - System.out.println("GOT COMMAND :"+command); + if (command != null && !command.equals("time out")) { + System.out.println("GOT COMMAND :" + command); switch (command) { - + case Command.PING: coms.send(Command.PONG); break; - + case Command.PASS_TURN: - phaseActive=false; + phaseActive = false; break; - + case Command.ATTACK: - //numero de la zone de la carte attaquante + // numero de la zone de la carte attaquante String carteAttaquante = coms.recieve(); - //numero de la zone de la carte ciblé + // numero de la zone de la carte ciblé String carteCible = coms.recieve(); - if(!isInt(carteAttaquante) || !isInt(carteCible))throw new RuntimeException("non number zone recived in attack phase"); + if (!isInt(carteAttaquante) || !isInt(carteCible)) + throw new RuntimeException("non number zone recived in attack phase"); Card attackingCard = board.getCardInZone(Integer.parseInt(carteAttaquante)); - Card attackedCard = adversaire.getBoard().getCardInZone(Integer.parseInt(carteCible)); - - if(attackedCard ==null || attackingCard == null) - { - board.printDebugBoard(); - throw new RuntimeException("error invalid carteCible:"+carteCible + " carteAttaquante : "+carteAttaquante); - } - - System.out.println("FIGHT " + "carteCible:"+carteCible + " carteAttaquante : "+carteAttaquante); - - boolean isDestroyed = attackedCard.takeDamage(attackingCard.getAttack()); - if(isDestroyed) - { - //on suprime la carte du terrain - board.setCard(Integer.parseInt(carteCible), null); - - //demande a l'adversaire de retirer la carte de son terrain - adversaire.getComs().send(Command.DESTROY_CARD); - adversaire.getComs().send(carteCible); - - //retire la carte au terrain adverse - this.getComs().send(Command.DESTROY_ADV_CARD); - this.getComs().send(carteCible); - - //appelle les effet de quand la carte est détruite - //NOTE : non implémenter dans les cartes individuelles par manque de temps - attackedCard.onCardDestroyed(); + + if (attackingCard == null) { + throw new RuntimeException("invalid attack"); + } else { + if (carteCible.equals("100")) { + boolean isadvDead = handleAttackAgainstPlayer(attackingCard, adversaire); + if(isadvDead) + { + phaseActive = false; + } + } else { + handleAttackAgainstCard(attackingCard, carteCible, adversaire); + } } break; - + default: - System.err.println("unknown command "+command); + System.err.println("unknown command " + command); } - + } } } + private boolean handleAttackAgainstPlayer(Card attackingCard, Joueur adversaire) throws IOException { + boolean result = adversaire.takeDamage(attackingCard.getAttack()); + if(!result) + { + adversaire.updateHp(this); + return false; + } + return true; + } + + private void updateHp(Joueur adversaire) throws IOException { + coms.send(Command.SET_HP); + coms.send(pV); + adversaire.coms.send(Command.SET_ENEMY_HP); + adversaire.coms.send(pV); + + } + + private void handleAttackAgainstCard(Card attackingCard, String carteCible, Joueur adversaire) throws IOException { + Card attackedCard = adversaire.getBoard().getCardInZone(Integer.parseInt(carteCible)); + + if (attackedCard == null) { + throw new RuntimeException( + "error invalid carteCible:" + carteCible + " carteAttaquante : " + attackingCard); + } + + boolean isDestroyed = attackedCard.takeDamage(attackingCard.getAttack()); + if (isDestroyed) { + // on suprime la carte du terrain + board.setCard(Integer.parseInt(carteCible), null); + + // demande a l'adversaire de retirer la carte de son terrain + adversaire.getComs().send(Command.DESTROY_CARD); + adversaire.getComs().send(carteCible); + + // retire la carte au terrain adverse + this.getComs().send(Command.DESTROY_ADV_CARD); + this.getComs().send(carteCible); + + // appelle les effet de quand la carte est détruite + // NOTE : non implémenter dans les cartes individuelles par manque de temps + attackedCard.onCardDestroyed(); + } + + } + private Board getBoard() { return board; } + + /** + * inflige des degats au joueur + * @param amount + * @return true si les pv du joueur on attein zero + */ + private boolean takeDamage(int amount) + { + pV -= amount; + pV = pV > 0 ? pV : 0; + return pV == 0; + + } } diff --git a/src/game/Match.java b/src/game/Match.java index 7c3335d..d89385c 100644 --- a/src/game/Match.java +++ b/src/game/Match.java @@ -30,30 +30,36 @@ public class Match extends Thread { // gameplay @Override public void run() { + //cette variable permet de decider le gagnant en cas d'erreur reseau + boolean isJ1Turn=true; while (joueur1.isAlive() && joueur2.isAlive()) { try { tour(joueur1); - tour(joueur2); + isJ1Turn=false; + if(joueur2.isAlive())tour(joueur2); + isJ1Turn=true; } catch (IOException e) { - endGameAfterIssue(); + endGameAfterIssue(isJ1Turn); return; } } try { endMatch(); } catch (IOException e) { - endGameAfterIssue(); + endGameAfterIssue(isJ1Turn); } } /** * si le jeu a un crash il faut que si un joueur ai perdu la connection l'autre gagne + * @param isJ1Turn */ - private void endGameAfterIssue() { + private void endGameAfterIssue(boolean isJ1Turn) { if(PlayerTesteur.playerTest(joueur1.getComs())) { try { - joueur1.win(); + if(isJ1Turn)joueur1.win(); + else joueur1.lose(); } catch (IOException e) { e.printStackTrace(); } @@ -61,7 +67,8 @@ public class Match extends Thread { if(PlayerTesteur.playerTest(joueur2.getComs())) { try { - joueur2.win(); + if(!isJ1Turn)joueur2.win(); + else joueur2.lose(); } catch (IOException e) { e.printStackTrace(); } @@ -114,7 +121,7 @@ public class Match extends Thread { joueur.mainPhase1(enemy); //Joue autant de carte qu'il veut/peut joueur.battlePhase(enemy);//lance des attaques à son adversaire qui peut répliquer //cette phases ne serira surment pas car nous manquon de temps pour implrementer les fonctionnalité specifique de certaine cartes - joueur.endPhase();//fin du tour du @joueur + if(enemy.isAlive())joueur.endPhase();//fin du tour du @joueur } }