Parcours
/
Java
Java
/
Exercices
/
Sorciers et guerriers
Sorciers et guerriers

Sorciers et guerriers

Exercice d'apprentissage

Introduction

L’héritage

L’héritage est un concept fondamental de la POO (programmation orientée objet). Il représente une relation de type EST-UN. En programmation, cela veut littéralement dire la même chose qu’en anglais : hériter de caractéristiques d’un parent (en programmation, ces caractéristiques sont généralement des fonctions et des variables).

Prenons une classe Animal, comme ci-dessous :

//Creating an Animal class with bark() as a member function.
public class Animal {

    public void bark() {
        System.out.println("This is an animal");
    }

}

Animal est une classe parente, car les propriétés de cette classe peuvent être étendues à tous les animaux en général.

Prenons un animal nommé Lion, avec une classe comme celle-ci :

//Lion class is a child class of Animal.
public class Lion extends Animal {

    @Override
    public void bark() {
        System.out.println("Lion here!!");
    }

}
Note

L’annotation Override indique qu’une méthode d’une sous-classe redéfinit une méthode de sa superclasse. Elle n’est pas strictement nécessaire, mais c’est une bonne pratique de l’utiliser.

Maintenant, chaque fois qu’on écrit :

Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();

Remarque : on initialise la classe Animal avec Lion. Le résultat ressemblera à ceci :

Lion here!!

Selon la POO, il existe de nombreux types d’héritage, mais Java n’en prend en charge que quelques-uns (multi-niveaux et hiérarchique). Pour en savoir plus, lis ceci.

Instructions

Dans cet exercice, on joue à un jeu de rôle où différents types de combattants peuvent s'affronter. Le jeu a des règles différentes pour chaque type de combattant. On va se concentrer sur deux types bien précis : les Wizards et les Warriors.

Pour un Warrior, voici les règles :

  • Un Warrior n'est jamais vulnérable.
  • Un Warrior inflige 6 points de dégâts si le combattant qu'il attaque n'est pas vulnérable.
  • Un Warrior inflige 10 points de dégâts si le combattant qu'il attaque est vulnérable.

Pour un Wizard, voici les règles :

  • Un Wizard peut préparer un sort à l'avance.
  • Un Wizard est vulnérable à moins d'avoir préparé un sort à l'avance.
  • Un Wizard inflige 12 points de dégâts s'il a préparé un sort à l'avance.
  • Un Wizard inflige 3 points de dégâts s'il n'a pas préparé de sort à l'avance.

1. Crée la classe Warrior

Crée une nouvelle classe appelée Warrior. Cette classe doit hériter de la classe Fighter existante.

2. Décris un Warrior

Mets à jour la classe Warrior pour que sa méthode toString() décrive le type de combattant qu'il représente. La méthode doit renvoyer la string "Fighter is a Warrior".

Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"

3. Rends les Warriors invulnérables

Mets à jour la classe Warrior pour que sa méthode isVulnerable() renvoie toujours false.

Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false

4. Calcule les points de dégâts d'un Warrior

Mets à jour la classe Warrior pour que sa méthode getDamagePoints(Fighter) calcule les dégâts infligés par un Warrior selon les règles ci-dessus.

Warrior warrior = new Warrior();
Wizard wizard = new Wizard();

warrior.getDamagePoints(wizard);
// => 10

5. Crée la classe Wizard

Crée une autre nouvelle classe appelée Wizard. Cette classe doit aussi hériter de la classe Fighter existante.

6. Décris un Wizard

Mets à jour la classe Wizard pour que sa méthode toString() décrive le type de combattant qu'il représente. La méthode doit renvoyer la string "Fighter is a Wizard".

Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"

7. Permets aux Wizards de préparer un sort et rends-les vulnérables lorsqu'ils n'ont pas préparé de sort

Mets à jour la classe Wizard pour ajouter une méthode appelée prepareSpell(). La classe doit se souvenir du moment où cette méthode est appelée et faire en sorte que sa méthode isVulnerable() ne renvoie false que lorsqu'un sort est préparé.

Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false

8. Calcule les points de dégâts d'un Wizard

Mets à jour la classe Wizard pour que sa méthode getDamagePoints(Fighter) calcule les dégâts infligés par un Wizard selon les règles ci-dessus.

Wizard wizard = new Wizard();
Warrior warrior = new Warrior();

wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Java Exercism

Prêt à commencer Sorciers et guerriers ?

Inscris-toi sur Exercism pour apprendre et maîtriser Java avec 26 concepts158 exercices, et un vrai mentorat humain, le tout gratuitement.