From 7fc59188cf2ca2b31d2fb0b83d4abbb75a2897fc Mon Sep 17 00:00:00 2001 From: Guyslain <guyslain.naves@lis-lab.fr> Date: Thu, 3 Oct 2024 11:33:50 +0200 Subject: [PATCH] ajout td5 --- src/main/java/fr/univamu/progav/td5/Blow.java | 4 + .../java/fr/univamu/progav/td5/Character.java | 29 +++++++ src/main/java/fr/univamu/progav/td5/TD5.md | 58 ++++++++++++++ .../java/fr/univamu/progav/td5/Warrior.java | 35 +++++++++ .../java/fr/univamu/progav/td5/Wizard.java | 36 +++++++++ .../fr/univamu/progav/td5/WarriorTest.java | 76 +++++++++++++++++++ .../fr/univamu/progav/td5/WizardTest.java | 65 ++++++++++++++++ 7 files changed, 303 insertions(+) create mode 100644 src/main/java/fr/univamu/progav/td5/Blow.java create mode 100644 src/main/java/fr/univamu/progav/td5/Character.java create mode 100644 src/main/java/fr/univamu/progav/td5/TD5.md create mode 100644 src/main/java/fr/univamu/progav/td5/Warrior.java create mode 100644 src/main/java/fr/univamu/progav/td5/Wizard.java create mode 100644 src/test/java/fr/univamu/progav/td5/WarriorTest.java create mode 100644 src/test/java/fr/univamu/progav/td5/WizardTest.java diff --git a/src/main/java/fr/univamu/progav/td5/Blow.java b/src/main/java/fr/univamu/progav/td5/Blow.java new file mode 100644 index 0000000..6c806a9 --- /dev/null +++ b/src/main/java/fr/univamu/progav/td5/Blow.java @@ -0,0 +1,4 @@ +package fr.univamu.progav.td5; + +public record Blow(int physicalDamage, int magicalDamage) { +} diff --git a/src/main/java/fr/univamu/progav/td5/Character.java b/src/main/java/fr/univamu/progav/td5/Character.java new file mode 100644 index 0000000..4a7c081 --- /dev/null +++ b/src/main/java/fr/univamu/progav/td5/Character.java @@ -0,0 +1,29 @@ +package fr.univamu.progav.td5; + +public abstract class Character { + + // TODO add health points + + public boolean isAlive() { + // TODO + return false; + } + + protected int getHealth() { + // TODO + return 0; + } + protected void reduceHealth(int amount) { + // TODO + } + protected void setHealth(int health) { + // TODO + } + + public abstract Blow attack(); + + public abstract void defend(Blow blow); + + public abstract void specialAction(); + +} diff --git a/src/main/java/fr/univamu/progav/td5/TD5.md b/src/main/java/fr/univamu/progav/td5/TD5.md new file mode 100644 index 0000000..c5049d0 --- /dev/null +++ b/src/main/java/fr/univamu/progav/td5/TD5.md @@ -0,0 +1,58 @@ +Dans cet exercice, nous implémentons le comportement de trois personnages, le +guerrier, le mage et le prêtre, dans un jeu de rôle. Chacun peut donner et +recevoir des coups, a des points de vie et meurt lorsque ses points de vie +deviennent négatifs. Par contre, ils réagissent différemment aux coups, ont des +attaques différentes et ont chacun une action spéciale spécifique. + +Les coups sont décrits par la classe `Blow`, chaque coup ayant une +composante *dommage physique* et une composante *dommage magique*. +Chaque point de dommage, physique ou magique, fait baisser d'un point la vie +du personnage recevant le coup. + +Le guerrier +----------- + +- Ses attaques sont physiques : 3 points physiques et 0 point magique. +- Il est costaud : il ne subit que la moitié des dommages physiques des + coups qu'il reçoit. +- Il peut entrer en rage avec son action spéciale. Sa rage lui permet de + frapper deux fois plus fort pendant 3 attaques (6 dommages physiques). +- Après 3 attaques, il perd sa rage. +- S'il reçoit un coup provoquant une perte d'au moins 5 points de vie + pendant sa rage, sa rage dure une attaque supplémentaire. + +Le mage +------- + +- Ses attaques sont magiques : 4 points magiques et 0 points physique. +- Il absorbe la magie : s'il reçoit un coup, il ne perd pas de vie à cause + des dommages magiques, au contraire, la moitié des dommages magiques du + coup s'annule avec les dommages physiques (par exemple, pour 5 dommages + physiques et 3 magiques, il ne perd que 5 - (3/2) = 4 points de vie). +- L'absorption de magie ne lui permet pas de gagner des points de vie + (seulement de réduire les dommages physiques). +- Son action spéciale consiste à invoquer un bouclier magique, qui absorbe + les dommages physiques, jusqu'à 8 points. Le bouclier disparait une fois + qu'il a absorbé 8 points au total (par exemple après deux attaques faisant + 5 dommages physiques chacune, il laissera passer 2 dommages physiques lors + de la deuxième attaque). +- Le bouclier est appliqué avant la règle de l'absorption des dommages magiques. + + +Le prêtre +--------- + +- Ses attaques combinent force (2 dommages physiques) et esprit (1 dommage + magique). +- Son action spéciale est de prier. +- Toutes les 3 prières, il est exaucé : il récupère 10 points de vie, et sa + prochaine attaque provoque 5 dommages magiques supplémentaires. + + +Travail à faire +--------------- + +1. Compléter l'implémentation du guerrier et de la classe abstraite `Character`. +2. Vérifier votre travail avec les tests du guerrier. +3. Compléter l'implémentation du mage, jusqu'à passage réussi des tests. +4. Créer la classe du prêtre tel que décrit. \ No newline at end of file diff --git a/src/main/java/fr/univamu/progav/td5/Warrior.java b/src/main/java/fr/univamu/progav/td5/Warrior.java new file mode 100644 index 0000000..1090f39 --- /dev/null +++ b/src/main/java/fr/univamu/progav/td5/Warrior.java @@ -0,0 +1,35 @@ +package fr.univamu.progav.td5; + +public class Warrior extends Character { + + private static final int BASE_DAMAGE = 3; + private static final int BASE_HEALTH = 30; + public static final int RAGE_DAMAGE_THRESHOLD = 5; + + // TODO add rage + + public Warrior() { + // TODO + } + + @Override + public Blow attack() { + // TODO + return null; + } + + @Override + public void defend(Blow blow) { + // TODO + } + + @Override + public void specialAction() { + // TODO + } + + public int getRage() { + // TODO + return 0; + } +} diff --git a/src/main/java/fr/univamu/progav/td5/Wizard.java b/src/main/java/fr/univamu/progav/td5/Wizard.java new file mode 100644 index 0000000..0f75a21 --- /dev/null +++ b/src/main/java/fr/univamu/progav/td5/Wizard.java @@ -0,0 +1,36 @@ +package fr.univamu.progav.td5; + +public class Wizard extends Character { + + private static final int BASE_HEALTH = 20; + private static final int BASE_DAMAGE = 4; + private static final int BASE_SHIELD_VALUE = 8; + + // TODO add shield + + + public Wizard() { + // TODO + } + + @Override + public Blow attack() { + //TODO + return null; + } + + @Override + public void defend(Blow blow) { + // TODO + } + + @Override + public void specialAction() { + // TODO + } + + public int getShield() { + // TODO + return 0; + } +} diff --git a/src/test/java/fr/univamu/progav/td5/WarriorTest.java b/src/test/java/fr/univamu/progav/td5/WarriorTest.java new file mode 100644 index 0000000..56ac2bf --- /dev/null +++ b/src/test/java/fr/univamu/progav/td5/WarriorTest.java @@ -0,0 +1,76 @@ +package fr.univamu.progav.td5; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +class WarriorTest { + + @Test + void newWarrior() { + Warrior warrior = new Warrior(); + assertEquals(30,warrior.getHealth()); + warrior.reduceHealth(8); + assertEquals(22,warrior.getHealth()); + warrior.setHealth(25); + assertEquals(25,warrior.getHealth()); + } + + @Test + void attack() { + Warrior warrior = new Warrior(); + Blow b = warrior.attack(); + assertEquals(3,b.physicalDamage()); + assertEquals(0,b.magicalDamage()); + } + + @Test + void defend() { + Warrior warrior = new Warrior(); + warrior.defend(new Blow(10,2)); + assertEquals(23,warrior.getHealth()); + warrior.defend(new Blow(1,5)); + assertEquals(18,warrior.getHealth()); + } + + @Test + void specialAction() { + Warrior warrior = new Warrior(); + warrior.specialAction(); + Blow b = warrior.attack(); + assertEquals(6,b.physicalDamage()); + assertEquals(0,b.magicalDamage()); + b = warrior.attack(); + b = warrior.attack(); + assertEquals(6,b.physicalDamage()); + assertEquals(0,b.magicalDamage()); + b = warrior.attack(); + assertEquals(3,b.physicalDamage()); + assertEquals(0,b.magicalDamage()); + } + + @Test + void getRage() { + Warrior warrior = new Warrior(); + assertEquals(0,warrior.getRage()); + warrior.specialAction(); + assertEquals(3,warrior.getRage()); + warrior.attack(); + assertEquals(2,warrior.getRage()); + warrior.specialAction(); + assertEquals(3,warrior.getRage()); + } + + @Test + void defendIncreaseRage() { + Warrior warrior = new Warrior(); + warrior.defend(new Blow(4,4)); + assertEquals(0,warrior.getRage(), "Warrior does not enter rage by receiving a blow"); + warrior.specialAction(); + warrior.defend(new Blow(0,5)); + assertEquals(4,warrior.getRage(), "Increase rage when 5 health lost"); + warrior.defend(new Blow(0,4)); + assertEquals(4,warrior.getRage(), "Do not increase rage when <5 health lost"); + warrior.defend(new Blow(6,0)); + assertEquals(4,warrior.getRage(),"Do not increase rage when <5 health lost"); + } +} \ No newline at end of file diff --git a/src/test/java/fr/univamu/progav/td5/WizardTest.java b/src/test/java/fr/univamu/progav/td5/WizardTest.java new file mode 100644 index 0000000..4e48aa4 --- /dev/null +++ b/src/test/java/fr/univamu/progav/td5/WizardTest.java @@ -0,0 +1,65 @@ +package fr.univamu.progav.td5; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +class WizardTest { + + + @Test + void newWizard() { + Wizard wizard = new Wizard(); + assertEquals(20,wizard.getHealth()); + assertEquals(0,wizard.getShield()); + assertTrue(wizard.isAlive()); + } + + @Test + void attack() { + Wizard wizard = new Wizard(); + Blow b = wizard.attack(); + assertEquals(4, b.magicalDamage()); + assertEquals(0, b.physicalDamage()); + wizard.specialAction(); + b = wizard.attack(); + assertEquals(4, b.magicalDamage()); + assertEquals(0,b.physicalDamage()); + } + + @Test + void defend() { + Wizard wizard = new Wizard(); + assertEquals(20,wizard.getHealth()); + wizard.defend(new Blow(6,2)); + assertEquals(15,wizard.getHealth(), "Wizard loses life on physical attack, but physical damage is reduced by half of magical damage"); + wizard.defend(new Blow(0,10)); + assertEquals(15,wizard.getHealth(), "Wizard does not gain life on magical attack."); + } + + @Test + void specialAction() { + Wizard wizard = new Wizard(); + wizard.specialAction(); + assertEquals(20, wizard.getHealth()); + wizard.defend(new Blow(6, 2)); + assertEquals(20, wizard.getHealth(), "Wizard's shield absorbs physical damage"); + assertEquals(2, wizard.getShield()); + wizard.defend(new Blow(6, 2)); + assertEquals( + 17, + wizard.getHealth(), + "Wizard's shield absorbs physical damage until depleted, then normal rules apply" + ); + assertEquals(0, wizard.getShield()); + } + + @Test + void maxShieldValue() { + Wizard wizard = new Wizard(); + wizard.specialAction(); + wizard.defend(new Blow(5,0)); + wizard.specialAction(); + wizard.defend(new Blow(5,0)); + assertEquals(3, wizard.getShield(),"Wizard's special action sets shield to 8 (not an addition)"); + } +} \ No newline at end of file -- GitLab