02 Classes, héritages, interfaces, ...
Pour la suite de ce TP, nous nous inspirerons de l’univers d’un jeu vidéo bien connu à savoir Warcraft.
Notre première classe: Peon
Comportements & attributs de base
Nous allons créer une première classe "Peon". Celle-ci doit contenir les attributs permettant d’identifier le péon (son nom), ses points de vie et ses points de mana.
Elle doit également fournir un constructeur par défaut, un constructeur paramétré, une surcharge de la méthode toString ainsi qu’une méthode talk permettant de faire parler l’unité dont la signature est la suivante "public void talk()".
Complexifions notre objet
L’une des caractéristiques des unités dans Warcraft est leurs phrases devenues cultes prononcés lors de leurs sélections par le joueur. Nous allons donc ajouter un attribut à notre classe qui sera une collection de différentes phrases. Lors de l’appel à la méthode talk, l’une de ces phrases devra être sélectionnée "aléatoirement" pour varier un peu les paroles de l’unité.
Un exemple de génération d’entier aléatoire
public static int randInt(int min, int max){
Random rand = new Random();
return rand.nextInt((max - min) + 1) + min;
}
N’oublier pas les getters, setters et le nommage des packages.
Une histoire d'héritage
Avec un seul type d’unité notre jeu risque d’être passablement ennuyeux. Il convient donc d’ajouter de nouveaux types d’unité.
Grunt, une seconde classe
Ajoutons une nouvelle classe que nous appellerons "Grunt". Avant de vous jeter sur votre IDE, il convient de prendre le temps de réfléchir quelque peu à la conception de notre projet. La classe "Peon" et "Grunt" partagent de nombreux points communs.
Nous allons pouvoir rassembler tous ces attributs et méthodes communes au sein d’une classe mère que nous nommerons "Unit".
Unit, des points communs
Créer une classe mère dont les classes "Peon" et "Grunt" hériteront. Vous êtes libres des attributs et méthodes que vous jugerez utiles de créer, toutefois celle-ci doit au moins posséder les attributs suivants:
- Nom (name),
- Race (race),
- Point de vie (HP),
- Point de force (minimunDamage),
- Point de chance (randomDamage),
- Porté (range),
- Point d'armure (armor),
- Est en vie (isAlive)
Ainsi que les méthodes suivantes:
- public abstract String talk();
- public void dance();
Nous avons créé des unités pour la race des orcs, pourquoi ne pas en créer quelques-unes pour les humains à savoir "Peasant" et "Footman".
Une aventure sous contrats
Pour faire interargir nos unités il faut leur fournir des contrats à remplir.
Une première interface, estOrganique
Dans cet exercice crée une simple interface "isOrganic" qui contient un attribut i_isPoissoned et une méthode bool isPoissoned();. Cette interface devra être implémentée au sein des classes que nous avons créées précédemment.
Une seconde interface, estGuerrier
L’interface précédente était un simple entrainement pour vous familiariser avec la syntaxe des interfaces. Les choses sérieuses commencent ici avec l’implémentation d’une interface "isWarrior".
Cette interface permet de faire combattre nos unités, pour celle-ci doit fournir une méthode public void attack(Unit p_Unit);.
Quelques indications:
- On vérifie bien évidemment si l’unité est encore en vie.
- Calcul des dégats si Point de chance = 0:
v_Damage = minimumDamage * (1 - unit.getArmor() / 10).
- Calcul des dégats si Point de chance != 0:
v_Damage = randInt(minimumDamage, randomDamage) * (1 - unit.getArmor() / 10).
- Il serait judicieux d’ajouter une méthode dans la classe Unit pour absorber les dégâts.