TP 4 : Fédération de Boxe - Round 2 - Combat
Transcription
TP 4 : Fédération de Boxe - Round 2 - Combat
TP 4 : Fédération de Boxe - Round 2 - Combat Extract of La page de Julien Seinturier http://www.seinturier.fr/spip/spip.php?article99 TP 4 : Fédération de Boxe Round 2 - Combat - Enseignements - Archives - 2013 / 2014 - DUT R&T IUT d'Aix-Marseille - Programmation Objet - Publication date: lundi 16 mars 2015 Description: Ce TP est dédié à la mise en place de combats entre les boxeurs modélisés lors du TP 3. Copyright © La page de Julien Seinturier - Tous droits réservés Copyright © La page de Julien Seinturier Page 1/8 TP 4 : Fédération de Boxe - Round 2 - Combat Prérequis Liens utiles : API java 1.8 :http://docs.oracle.com/javase/8/docs/api/ Outils Java :http://docs.oracle.com/javase/8/docs/technotes/tools/index.html Les TPs en rapport : TP 3 : Fédération de Boxe - Round 1 : Héritage TP 4 : Fédération de Boxe - Round 2 : Combat TP 5 : Fédération de Boxe - Round 3 : Collections TP 6 : Fédération de Boxe - Round 4 - Entrée/Sorties Introduction Après avoir modéliser différents types de boxeurs lors du TP 3, nous allons maintenant mettre en place un système de combat permettant de les faire s'affronter. 1. Description d'un combat Un combat est l'opposition entre deux combattants dans un environnement clos (le ring) durant une période de temps définie et fractionnée(en reprises, ou rounds). Dans les sport de combats de type boxe, deux adversaires s'affrontent. Ceux-ci sont généralement identifiés par les 2 coins du ring dans lesquels ils se trouvent au début (coin bleu ou coin rouge). Le combat est caractérisé par une suite de rounds (généralement 12 de 3 minutes chacun) durant lesquels les boxeurs échangent des coupes. Le combat se termine si l'un des 2 boxeurs est mi hors combat (Knock Out - KO) ou si tous les rounds ont été effectués. Le résultat d'un combat voit un vainqueur avant le terme si un boxeur met sont adversaire KO, un vainqueur au point si le combat est allé au bout de ses rounds et qu'un des deux boxeurs possède un meilleur score ou encore un match nul (ou no contest) si les 2 boxeurs sont KO ou si à la fin des rounds les deux possèdent le même score. 2. Modélisation d'un combat Nous allons maintenant enrichir notre package boxing avec une classe permettant de représenter des combats entre boxeurs. Un combat sera représenté par la classe Combat du package fr.univamu.iut.rt.java.boxing. Les données les plus élémentaires pour organiser un combat sont : • • Les deux adversaires ; Le nombre de rounds. Copyright © La page de Julien Seinturier Page 2/8 TP 4 : Fédération de Boxe - Round 2 - Combat 1. Créer la classe Combat du package fr.univamu.iut.rt.java.boxing. Cette classe devra comporter les champs suivant : bleu : qui est une référence vers le boxeur du coin bleu ; • rouge : qui est une référence vers le boxeur du coin rouge ; • roundsTotal : qui est le nombre de rounds total du combat. • La classe combat devra contenir le constructeur public Combat(Boxeur rouge, d'instancier un combat d'un nombre de rounds donné entre deux boxeurs. Nous allons maintenant faire de la classe ajoutant des accesseurs. Combat Boxeur bleu, int rounds) qui permet un Java Bean en y appliquant des règles de sécurité et en y 2. Transformer la classe Combat en un Java Bean. Pour cela : • passer tous les champs de la classe en private ; • ajouter les accesseurs (getter / setters) nécessaires aux champs. 3. Phase de combat Un combat peut être assimilé à une succession de phases composées de l'attaque d'un premier boxeur sur le second suivie d'une attaque de ce second boxeur sur le premier. Chaque boxeur est donc capable d'attaquer et de se défendre. Pour cela vous ajouterez à la classe Boxeur deux méthodes permettant de représenter les gestes offensifs et défensifs. • Une attaque sera représentée par la méthode de la classe Boxeur : public void frappe(Boxeur){} Cette méthode indique au boxeur attaquant qu'il doit porter un coup au • boxeur passé en paramètre. • Un geste défensif sera représenté par la méthode de la classe Boxeur : public void defend(ICoup){} Celle-ci permettra au boxeur attaqué de se défendre par rapport au coup • reçu(passé en paramètre). 3. Ajouter à la classe Boxeur les méthodes suivantes : public void frappe(Boxeur){} qui indique au boxeur attaquant qu'il doit porter un coup au boxeur passé en • paramètre. public void defend(ICoup){} qui permettra au boxeur attaqué de se défendre par rapport au coup reçu(passé • en paramètre). A partir des deux méthodes manière suivante : • frappe(Boxeur) et defend(ICoup) il est possible de modéliser une action de combat de la l'attaquant choisi le coup à porter ; Copyright © La page de Julien Seinturier Page 3/8 TP 4 : Fédération de Boxe - Round 2 - Combat • • il assène le coup au défenseur ; le défenseur réagi au coup reçu. Cette modélisation peut être facilement représentée grâce aux deux méthodes. 4. Modifier les méthodes suivantes public void frappe(Boxeur){} et public void defend(ICoup){} afin de représenter la modélisation d'une action de combat telle que : • la méthode frappe(Boxeur) : • instancie un objet implantant l'interface ICoup (CoupPied, CoupPoing ou CoupCoude) ; • appelle la méthode defend(ICoup) du boxeur défenseur en lui passant en paramètre le ICoup instancié. • la méthode defend(ICoup) doit permette au boxeur de réagir au coup reçu. Pour l'instant cette méthode peut se contenter de ne rien faire. Penser à ajouter des affichages (System.out.println() à l'intérieur des méthodes pour en suivre le déroulement. par exemple, un appel à b1.frappe(b2) peut afficher b1.getNom()+" frappe "+b2.getNom()) 4. Déroulement d'un combat Nous allons maintenant nous intéresser au déroulement d'un combat en le représentant de façon simplifiée. Un combat peut se résumer à un échange de coups entre boxeurs durant un nombre de rounds donnés. Un algorithme de combat peut alors être le suivant : Boxeur rouge: Boxeur roundsTotal : entier roundActuel: entier tantque roundActuel < roundsTotal faire roundActuel ↕ roundActuel+ 1 bleu.frappe(rouge) rouge.frappe(bleu) fintq bleu: 5. Ajouter à la classe Une fois la classe Combat Combat 6. Ajouter au package une méthode public void combat() qui implante l'algorithme ci-dessus. mise à jour, il faut tester celle-ci. fr.univamu.iut.rt.java.boxing une classe CombatTest dont le code est le suivant : package fr.univamu.iut.rt.java.boxing; import java.util.Date; Copyright © La page de Julien Seinturier Page 4/8 TP 4 : Fédération de Boxe - Round 2 - Combat public class CombatTest { public static void main(String[] args){ Boxeur b1 = new Boxeur(new Date(59, 3, 24, 8, 35), "Panza", "Andre", 85.6f, 1); Boxeur b2 = new Boxeur(new Date(66, 5, 30, 16, 5), "Tyson", "Mike", 88.4f, 1); Combat combat = new Combat(b1, b2, 10); combat.combat(); } } Exécuter ensuite cette classe pour tester l'algorithme simple de combat. 5. Déroulement d'un combat : Santé et fatigue des combattants. Nous allons maintenant nous concentrer sur le déroulement d'un combat. Lors d'un combat, les boxeurs sont soumis à la fatigue et à la dégradation de leur santé en fonction des coups reçus. La santé est représentée par un double compris entre 0 et 100 tel qu'à 100 le boxeur est en pleine santé et à 0 il est KO. La fatigue est également représentée par un double tel qu'à 0 le boxeur est en pleine forme et à 100 il n'est plus en état de porter des coups. La méthode isKO() retourne true si le boxeur est ko. 7. Afin de modéliser ce comportement, vous allez ajouter à la classe Boxeur les méthodes : • public void setSante(double sante) {} qui change l'état de santé actuel du boxeur ; • public double getSante() {} qui retourne l'état de santé actuel du boxeur ; • public void setFatigue(double fatigue) {} qui change l'état de fatigue actuel du boxeur ; • public double getFatigue() {} qui retourne l'état de fatigueactuel du boxeur ; • public boolean isKO() {} qui retourne true si le boxeur est KO (c'est à dire si sa santé est inférieure à 0) et false sinon. La fatigue est la santé d'un • • • Boxeur évoluent au cours d'un combat : La santé diminue à chaque coup reçu et non esquivé / paré / contré. La valeur de santé perdue est fonction de la puissance du coup porté. La fatigue augmente à chaque coup porté. La valeur de la diminution est fonction de la puissance du coup porté et de sa vitesse. La fatigue se réduit lors de chaque esquive / contre. 8. Modifier les méthodes public void frappe(Boxeur){} et public void defend(ICoup){} de la classe d'intégrer les règles relatives à la santé et à la fatigue énoncées ci-dessus. Aide : La méthode defend(ICoup) Copyright © La page de Julien Seinturier Boxeur afin doit permettre au boxeur de réagir au coup reçu. Une implantation très simple de Page 5/8 TP 4 : Fédération de Boxe - Round 2 - Combat cette méthode est de faire baisser la santé du boxeur défenseur en fonction de la puissance du coup reçu. En plus d'attaquer et de défendre, les combats contiennent également des phases de repos (lorsque les boxeurs sont fatigués.) 9. Les combats alternant des phases actives et des phases calmes, vous définirez pour la classe Boxeur la méthode public void garde(){}. Cette méthode place je boxeur en garde est lui permet de récupérer un peu en diminuant sa fatigue et en augmentant sa santé. Ces changements de valeurs se font par exemple en fonction de l'endurance du boxeur. A partir des nouvelles propriétés de la classe combat. 10. Ajouter à classe Combat Boxeur, il est possible d'enrichir la modélisation du déroulement d'un les champs suivants : public static final int BLEU_VAINQUEUR_KO = 1; public static final int BLEU_VAINQUEUR_PTS = 2; public static final int ROUGE_VAINQUEUR_KO = 3; public static final int ROUGE_VAINQUEUR_PTS = 4; public static final int DOUBLE_KO = 5; public static final int NO_CONTEST = 6; Ces champs permettront de déterminer le résultat d'un combat. Il est possible maintenant d'enrichir la méthode possibles à un combat. combat 11. Modifier dans la classe Combat la méthode public • si les deux boxeurs sont ko ; • si l'un des deux boxeurs est ko ; • si le nombre maximal de rounds est atteint. elle même afin de prendre en compte tous les résultats void combat() en faisant en sorte qu'un combat se termine : Modifier ensuite la signature de public void combat() en public int combat() afin que celle-ci retourne un entier représentant le résultat du combat (voir exercice 10). Les valeurs possibles sont : • • si le boxeur bleu a gagné par KO ; BLEU_VAINQUEUR_PTS si le boxeur bleu a gagné aux points (c'est à dire si à la fin du combat il a plus de santé que le boxeur rouge) ; BLEU_VAINQUEUR_KO Copyright © La page de Julien Seinturier Page 6/8 TP 4 : Fédération de Boxe - Round 2 - Combat • • • • ROUGE_VAINQUEUR_KO si le boxeur rouge a gagné par KO ; si le boxeur rouge a gagné aux points (c'est à dire si à la fin du combat il a plus de santé ROUGE_VAINQUEUR_PTS que le boxeur bleu) ; DOUBLE_KO si à la fin du combat les deux boxeurs sont KO ; NO_CONTEST si à la fin du combat aucun boxeur n'est KO et que les deux ont la même valeur de santé. Tester votre nouvelle implantation de Combat en exécutant la classe CombatTest 6. Différents styles, différentes techniques. Il existe de nombreuses techniques de boxe dans le monde. Nous allons maintenant modéliser quelques types de boxe en représentant les boxeurs issus de ces techniques. La boxe anglaise (aussi appelée le noble art) est une discipline dans laquelle les combattants utilisent uniquement leur poings pour frapper leur adversaire. 13. Afin de représenter un boxeur pratiquant la boxe anglaise, vous définirez la classe classe Boxeur. Vous devrez redéfinir les méthodes appropriées et vous assurer que : • Un boxeur anglais ne peut porter que des coups de poings ; • Un boxeur anglais ne peut contrer / parer des coups bas ; • Un boxeur anglais ne peut porter de coups bas. BoxeurAnglais qui étendra la La boxe française (ou savate) est une discipline dans laquelle les combattants peuvent utiliser leurs poings (comme en boxe anglaise) et leur pieds pour frapper l'adversaire. 14. Afin de représenter un boxeur pratiquant la boxe française, vous définirez la classe la classe Boxeur. Vous devrez vous assurer que : • un boxeur français ne peut porter que des coups de Poings / Pieds ; • un boxeur français peut porter des coups hauts, médians et bas ; • un boxeur français peut esquiver / contrer les coupes de Poings et de Pieds ; BoxeurFrancais qui étendra Maintenant qu'au moins deux techniques de boxe ont été modélisées, il faut s'assurer que l'on ne peut plus définir de boxeur non issu d'une technique spécifique. 15. Modifier la classe Boxeur afin de la rendre abstraite. Pour cela : • modifier la méthode public void frappe(Boxeur){} en public abstract void frappe(Boxeur){} ; • modifier la méthode public void defend(ICoup){} en public abstract void defend(ICoup){}. Vous ne pouvez plus maintenant directement instancier de Boxeur, il faut impérativement passer par un BoxeurAnglais / BoxeurFrancais. Cette modélisation traduit le fait qu'un boxeur est forcement issu d'une discipline. Copyright © La page de Julien Seinturier Page 7/8 TP 4 : Fédération de Boxe - Round 2 - Combat 16. Maintenant que la classe Boxeur est devenue abstraite, la classe de test de combat (CombatTest) ne fonctionne plus et doit être modifiée avec le code suivant : package fr.univamu.iut.rt.java.boxing; import java.util.Date; public class CombatTest { public static void main(String[] args){ Boxeur b1 = new BoxeurFrancais(new Date(59, 3, 24, 8, 35), "Panza", "Andre", 85.6f, 1); Boxeur b2 = new BoxeurAnglais(new Date(66, 5, 30, 16, 5), "Tyson", "Mike", 88.4f, 1); Combat combat = new Combat(b1, b2, 10); combat.combat(); } } Exécuter ensuite cette classe pour tester lla nouvelle version de l'implantation de Combat. Vous pouvez maintenant exécuter à nouveau le jalon. JALON 2 : Mettre à jour la librairie validation.jar en copiant le fichier dans le répertoire lib de votre projet. Vous pouvez maintenant exécuter la cible Ant nommée test.boxing. Celle-ci testera votre projet et vous affichera un rapport. Ce test enverra aussi un email au responsable des Tps contenant une copie de ce rapport. Vous pouvez exécuter le test autant que nécessaire, seul le dernier envoi sera comptabilisé. Rappel : pour exécuter une cible Ant, il suffit de vous placer dans le répertoire contenant le fichier taper la commande ant cible (par exemple dans notre cas ant test.boxing). build.xml et de Si vous avez oublié le fonctionnement de Ant ou que votre architecture de projet n'est pas valide, reportez-vous au TP 2. 7. Si vous avez fini... Si vous avez défini les coups relatifs à la boxe Thailandaise (voir TP2), il est alors possible de définir un boxeur pratiquant la boxe thaïlandaise. Afin de représenter ce boxeur, vous définirez la classe BoxeurThai qui étendra la classe Boxeur. Vous devrez vous assurer que : • • • • Un boxeur thai ne peut porter que des coups de Poings / Pieds / Coude / Genoux Un boxeur thai peut porter des coups hauts, médians et bas ; Un boxeur thai peut esquiver / contrer que les coups de poings ; Un boxeur thai ne peut pas contrer un coup de coude. Copyright © La page de Julien Seinturier Page 8/8