Skip to content
Snippets Groups Projects
Commit 7fc59188 authored by Guyslain's avatar Guyslain
Browse files

ajout td5

parent 3667213e
No related branches found
No related tags found
No related merge requests found
package fr.univamu.progav.td5;
public record Blow(int physicalDamage, int magicalDamage) {
}
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();
}
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
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;
}
}
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;
}
}
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
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment