:: Enseignements :: Licence :: L3 :: 2016-2017 :: Programmation Objet avec Java ::
|
TP noté L3 IMI - C'est magique!
|
On souhaite représenter des magiciens qui peuvent collecter des ingrédients et des potions et combiner les ingrédients pour faire de la magie.
Rappel: vous devez utiliser Eclipse, et configurer le workspace d'Eclipse (File > Switch WorkSpace) pour qu'il corresponde au répertoire
EXAM que vous avez dans le
home de votre session de TP noté.
Attention, ce TP est corrigé pour partie de façon automatique! Il est donc très important que les noms des classes, des champs et des méthodes que l'on vous demande soient respectés.
Vous écrirez toutes les classes de ce TP noté dans un package nommé fr.umlv.magic. Vous devez tester toutes les méthodes demandées et vous écrirez tous vos tests dans la classe
Test de ce package.
On rappelle qu'il est également possible de compiler et exécuter dans un terminal de la façon suivante. En se plaçant dans le dossier qui contient les répertoires
src et
bin:
javac src/fr/umlv/magic/*.java -d bin/
java -cp bin fr.umlv.magic.Test
Exercice 1 - Un peu de cuisine
On commence par écrire les classes représentant les ingrédients et les potions.
-
On définit une classe Ingredient pour représenter des ingrédients. Chaque
ingrédient a un nom (name) et on utilisera un booléen heal pour représenter le fait qu'un ingrédient peut être utilisé pour soigner (heal = true) ou pour provoquer des dégâts (heal = false).
Écrire une classe Ingredient avec les champs nécessaires, ainsi que le constructeur qui prend en argument tous les champs.
-
On définit une classe Potion pour représenter des potions. Chaque
potion a une couleur (color), et une puissance (power) représentée par un entier. S'il est positif, c'est une potion de soin, s'il est négatif, c'est une potion qui fait des dégâts (et s'il est nul, c'est une potion sans effet).
Écrire une classe Potion avec les champs nécessaires, ainsi que le constructeur qui prend en argument tous les champs.
-
Ajouter aux classes Ingredient et Potion ce qu'il faut pour que l'on puisse les afficher de la façon suivante (le résultat de l'affichage est dans le commentaire) :
Potion p1 = new Potion("Bleu", 4);
System.out.println(p1);
// Potion Bleu (4)
Ingredient i1 = new Ingredient("Pissenlit", true);
System.out.println(i1);
// Pissenlit (Soin)
Ingredient i2 = new Ingredient("Bave de crapaud", false);
System.out.println(i2);
// Bave de crapaud (Dégâts)
-
Ajouter ce qu'il faut pour tester si deux Potion sont identiques.
-
Les magiciens souhaitent pouvoir regrouper les ingrédients et les potions dans une même collection. Pour pouvoir faire cela, écrire une interface WizardItem avec les 2 méthodes suivantes:
public int weight();
public int power();
La méthode weight renvoie le poids d'un item (1 gramme pour un ingrédient et 3 grammes pour une potion) et la méthode power renvoie sa puissance. Dans le cas d'un ingrédient, la puissance est -1 s'il fait des dégâts et +1 s'il permet de soigner.
-
Rajouter ce qu'il faut pour que les classes Ingredient et Potion implémentent l'interface WizardItem.
Exercice 2 - Les magiciens
Nous allons maintenant créer de magiciens qui peuvent collecter des ingrédients et des potions.
-
On définit une classe Wizard pour représenter des magiciens. Chaque
magicien a un nom (name) et un sac à dos (backpack) de type ArrayList<WizardItem> pour porter ses ingrédients et ses potions. Le sac à dos a un poids maximal (maxWeight, que la somme des poids des items dans le sac ne peut pas dépasser), mais pas de limite de volume.
Écrire une classe Wizard avec les champs nécessaires, ainsi que le constructeur qui prend en argument le nom du magicien et le poids maximal du sac à dos.
-
Ajouter un constructeur qui ne prend en argument que le nom du magicien et qui appelle le précédent en fixant un poids maximal par défaut de 10.
-
Ajouter un champ weight qui va permettre de conserver le poids actuel (la somme des poids des items) du sac. Penser à l'initialiser.
-
Ajouter ce qu'il faut pour que l'on puisse afficher un magicien de la façon suivante:
Wizard harry = new Wizard("Harry Potter");
System.out.println(harry);
// Harry Potter (0/10) : []
Entre parenthèses, on indique le poids actuel du sac par rapport au poids maximal, et l'affichage du sac à dos est effectué grâce à l'affichage par défaut de ArrayList (ici, le sac à dos est vide, donc l'affichage est []).
-
Écrire une méthode add qui prend en paramètre un WizardItem et l'ajoute dans le sac à dos. Si l'item que l'on veut ajouter est trop lourd, il n'est pas ajouté et la méthode affiche simplement "Le sac est trop lourd!".
harry.add(new Potion("Bleu", 4));
harry.add(new Ingredient("Pissenlit", true));
harry.add(new Potion("Orange", 7));
harry.add(new Ingredient("Bave de crapaud", false));
harry.add(new Potion("Rouge", -5));
// Affiche: Le sac est trop lourd!
harry.add(new Ingredient("Bave de crapaud", false));
System.out.println(harry);
// Harry Potter (9/10) : [Potion Bleu (4), Pissenlit (Soin), Potion Orange (7), Bave de crapaud (Dégâts), Bave de crapaud (Dégâts)]
-
Écrire une méthode remove qui prend en paramètre un WizardItem et un entier count, et qui supprime count fois cet item du sac à dos. Attention si l'item n'est pas présent ou en nombre insuffisant, cette fonction devra lever une exception (seulement après avoir supprimé l'item autant de fois que possible).
harry.remove(new Ingredient("Bave de crapaud", false),1);
System.out.println(harry);
// Harry Potter(8/10) : [Potion Bleu (4), Pissenlit (Soin), Potion Orange (7), Bave de crapaud (Dégâts)]
harry.remove(new Ingredient("Bave de crapaud", false),3);
// Exception in thread "main" java.lang.IllegalStateException: cannot remove 2 item: no more such item
// at fr.umlv.magic.Wizard.remove(Wizard.java:47)
// at fr.umlv.magic.Test.main(Test.java:41)
-
Ajouter ce qu'il faut dans votre main de test pour que le deuxième appel à remove ci-dessus produise désormais l'affichage suivant plutôt que l'exception (évidement, vous ne devez rien changer à la méthode remove):
Au moins un item n'a pas pu être retiré
© Université de Marne-la-Vallée