$30
Projet POO : Programmation Orient´ee Objet Premi`ere ann´eeF Modalit´es Ce projet est `a r´ealiser en binˆome. Vous indiquerez la composition de votre binˆome dans un fichier d´enomm´e AUTHORS (plac´e `a la racine du r´epertoire de votre projet) qui doit contenir les noms et logins UNIX des membres du groupe, un par ligne. Travail `a rendre : Vous devez rendre un mini-rapport de projet (5 pages maximum, format pdf) en plus de vos fichiers sources. Vous y d´etaillerez les difficult´es auxquelles vous avez ´et´e confront´e, et comment vous les avez r´esolues. Vous indiquerez ´egalement le nombre d’heures pass´ees sur les diff´erentes ´etapes de ce projet (conception, codage, tests, r´edaction du rapport) par chaque membre du groupe. Comment rendre votre projet : Vous d´eposerez sur ARCHE une archive (.zip ou .tar.gz) contenant le code source (toutes les classes, avec documentation) de votre projet ainsi que votre rapport. http://arche.univ-lorraine.fr/mod/assign/view.php?id=176315 Avant le 25 mars 2015, a` 23h55. (aucune soumission en retard ne sera accept´ee) ´ Evaluation : Un projet ne compilant pas sera sanctionn´e par une note ad´equate. Aucune soumission par email ne sera accept´ee. Des soutenances individuelles de projet seront organis´ees `a une date ult´erieure. Vous serez jug´e sur la qualit´e de votre programme et de sa documentation, celle de votre rapport et votre capacit´e `a expliquer son fonctionnement. F Travail personnel et honnˆetet´e Ne trichez pas! Ne copiez pas! Si vous le faites, vous serez lourdement sanctionn´es. Nous ne ferons pas de distinction entre copieur et copi´e. Vous n’avez pas de (bonne) raison de copier. En cas de probl`eme, nous sommes prˆet `a vous aider. Encore une fois : en cas de doute, envoyez un courriel `a vos enseignants, ¸ca ne les d´erange pas. Par tricher, nous entendons notamment : — Rendre le travail d’un coll`egue avec votre nom dessus; — Obtenir une r´eponse par GoogleTM ou autre et mettre votre nom dessus; — R´ecup´erer du code et ne changer que les noms de variables et fonctions ou leur ordre avant de mettre votre nom dessus (“moving chunks of code around is like moving food around on your plate to diguise the fact that you havn’t eated all your brussel sprouts”); — Permettre `a un coll`egue de s’inspirer de votre travail. Assurez vous que votre r´epertoire de travail n’est lisible que par vous mˆeme. Il est plus que tr`es probable que nous d´etections les tricheries. Chacun a son propre style de programmation, et personne ne code la mˆeme chose de la mˆeme mani`ere. De plus, il existe des programmes tr`es efficaces pour d´etecter les similarit´es douteuses entre copies (MOSS, http://theory.stanford.edu/~aiken/moss/). En revanche, il est possible (voire conseill´e) de discuter du projet et d’´echanger des id´ees avec vos coll`egues. Mais vous ne pouvez rendre que du code ´ecrit par vous-mˆeme. Vous indiquerez dans votre rapport toutes vos sources d’inspiration (comme les sites internet de vulgarisation de l’informatique que vous auriez consult´e). F Bibliographie Le probl`eme pr´esent´e a ´et´e initialement propos´e par John DeNero, Tom Magrino, and Eric Tzeng en 2014 en tant que Nifty Assignment au groupe d’int´erˆet ACM Special Interest Group on Computer Science Education (SIGCSE). Le sujet original peut ˆetre consult´e `a l’adresse suivante : Projet 2015-2016 http://nifty.stanford.edu/2014/denero-ants-vs-somebees/ Il a ´et´e adapt´e pour le langage Java par Joel Ross : http://faculty.washington.edu/joelross/courses/archive/f14/cs261/hwk/2/ La documentation de l’API Java : http://docs.oracle.com/javase/8/docs/api/. F Pr´esentation du probl`eme : Fourmis contre Abeilles Dans ce projet, vous allez cr´eer un jeu de type ? tower defense ?, appel´e ? Fourmis contre Abeilles ?, inspir´e du jeu ? Plants vs. Zombies ?. Dans ce jeu, vous pouvez contrˆoler la reine des fourmis, et ´equiper votre colonie avec les fourmis les plus courageuses que vous pouvez trouver. Vos fourmis devront prot´eger leur reine des abeilles malveillantes qui attaquent votre territoire. En jetant des feuilles aux abeilles, les fourmis pourront ´enerver les abeilles et les faire fuir. Si vous n’arrivez pas `a prot´eger votre reine, elle sera attaqu´ee par les abeilles et risque de mourir. Pour impl´ementer ce jeux, on profitera des avantages de la programmation orient´ee objet, en utilisant l’h´eritage et le polymorphisme pour simplifier la programmation et ´eviter la duplication de code. De plus, ce projet vous permettra de vous entraˆıner `a travailler avec un large projet existant, notamment `a le lire et comprendre. F Objectifs — S’entrainer `a la programmation objet avec h´eritage et polymorphisme — S’entrainer `a la lecture, compr´ehension et modification de code existant F Fichiers n´ecessaires Vous trouverez sur ARCHE (http://arche.univ-lorraine.fr/course/view.php?id=7973), un fichier .zip contenant les images et squelettes du programme. Ce fichier contient un grand nombre de fichiers Java, qui impl´ementent le cœur du jeu. Il vous faudra importer ces fichiers dans Eclipse. — Le fichier .zip contient d’autres fichiers additionnels. Le r´epertoire img contient des images et icˆones pour les fourmis, et le fichier antlist.properties contient de l’information sur quel image va avec quel type de fourmis (ceci est un bon exemple de l’utilisation d’un fichier externe pour stocker de l’information, ce qui permet de r´eutiliser et modifier le programme sans recompiler). Il vous faudra mettre ces fichiers dans le r´epertoire principal de votre projet Eclipse, pour obtenir ceci : (Attention : le r´epertoire img et le fichier antlist.properties se trouvent `a l’int´erieur du r´epertoire projet, et pas dans src!) F Le jeu Vous pouvez lancer le jeu en ex´ecutant la m´ethode principale de la classe AntsVsSomeBees.java. Vous devriez voir une interface ressemblant `a ceci (les commentaires en bleu d´ecrivent comment jouer) : 2 Projet 2015-2016 Le jeu est prˆet `a ˆetre jou´e! Vous pouvez placer des fourmis et essayer de d´efendre votre reine contre les abeilles. (Dans le code initial, les fourmis ne consomment pas de nourriture.) Ce jeu est compos´e de plusieurs composantes : — Colony : Les fourmis vivent dans une colonie, c’est-`a-dire un ensemble de tunnels, qui sont repr´esent´es par des objets de type Place. La colonie a un stock de nourriture, n´ecessaire `a la reproduction des fourmis. Seulement une fourmi peut occuper une Place (un endroit dans le tunnel), mais il n’y a pas de limite sur le nombre d’abeilles! — Ants : Cr´eer une fourmi suppl´ementaire consomme de la nourriture; la quantit´e de nourriture n´ecessaire varie en fonction du type de fourmi `a cr´eer. Chaque type de fourmi peut faire des actions diff´erentes. Les deux types les plus simples sont la HarvesterAnt, qui produit une unit´e de nourriture par tour, et la ThrowerAnt, qui jette une feuille vers les abeilles chaque tour. — Bees : Les abeilles vont voler `a travers les tunnels vers la reine, qui se situe tout `a gauche. Si une fourmi bloque le trajet d’une abeille, elle va s’arrˆeter et piquer la fourmi. Un jeu de ? Fourmis contre Abeilles ? se joue en une s´erie de tours. Dans chaque tour, des abeilles peuvent entrer dans la colonie. (Vous pouvez rajouter des fourmis `a tout instant.) Apr`es, tous les insectes (fourmis, puis abeilles) ex´ecutent leurs actions : les abeilles piquent les fourmis, et les fourmis jettent des feuilles vers les abeilles. Le jeu se termine dans deux cas : soit la reine a ´et´e atteinte par une abeille (et vous avez perdu), soit toutes les abeilles ont ´et´e ´elimin´ees par vos fourmis (et vous avez gagn´e). F Le code L’impl´ementation de ce jeu utilise plusieurs classes – comme pour tout programme orient´e objet bien con¸cu, chaque concept dans le jeu est impl´ement´e par sa propre classe. — La classe AntColony mod´elise une colonie de fourmis. Elle contient les endroits dans la colonie, avec une interface publique qui restreint l’acc`es `a ces endroits. Les endroits sont repr´esent´es par la classe Place, qui mod´elise un seul placement dans un tunnel, et les insectes qui y r´esident. La classe Hive est une sous-classe de Place, elle contient des champs et m´ethodes suppl´ementaires pour tracer l’invasion des abeilles. — Les insectes eux-mˆemes sont mod´elis´es par la classe Insect, avec une sous-classe pour les fourmis et une sous-classe pour les abeilles. Tout insecte a un emplacement (Place), une valeur de ARMOR, et une m´ethode action() qui ex´ecute les actions de l’insecte `a chaque tour. La classe Ant a d’autres sous-classes pour les diff´erents types de fourmis, avec des variables et actions propres. Les deux classes de base, HarvesterAnt et ThrowerAnt, sont d´ej`a fournies pour que vous puissiez tester le jeu. — Le jeu lui-mˆeme est g´er´e par la classe AntGame. Cette large classe est un JPanel sur lequel les fourmis et abeilles sont affich´ees. De plus, il y a un Timer qui affiche de fa¸con r´ecurrente de nouvelles instances du jeu pour visualiser son ´evolution. 3 Projet 2015-2016 — Vous pouvez lancer le jeu avec la classe AntsVsSomeBees, qui contient la m´ethode principale. Cette m´ethode instancie un objet AntColony (vous pouvez regarder son JavaDoc pour plus de d´etails) et un objet Hive, puis d´emarre le jeu. Quelques options qui pourront vous servir pour jouer : — AntColony colony = new AntColony(1, 8, 0, 2); //is the default testing layout (one tunnel) — AntColony colony = new AntColony(1, 8, 0, 10); //testing layout with 10 food — AntColony colony = new AntColony(3, 8, 0, 2); //makes a full tunnel layout — AntColony colony = new AntColony(3, 8, 3, 2); //makes a full tunnel layout with water (see below) — Hive hive = Hive.makeTestHive(); //makes a simple hive with just a couple bees — Hive hive = Hive.makeFullHive(); //makes a hive full of bees — Hive hive = Hive.makeInsaneHive(); //makes a challenging hive! Vous pouvez modifier et m´elanger ces constructeurs afin de jouer `a des configurations de partie diff´erentes. — Le code est organis´e dans deux paquetages. Le paquetage core contient la majorit´e des classes (le coeur du jeu). Le paquetage ants contiendra tous les diff´erents types de fourmis que vous allez cr´eer! Vous serez amen´es `a modifier certaines de ces classes fournies, comme expliqu´e dans la suite. Il est conseill´e de lire le code pour avoir une id´ee de son fonctionnement. Pour cela, vous pouvez commencer avec la classe principale. Sachez que le code contient des concepts avanc´es que vous n’avez peut-ˆetre pas encore vus, comme des Maps, des listes chaˆın´ees ou de la r´eflexion. F Travail `a r´ealiser Il est recommand´e de lire une premi`ere fois l’ensemble des consignes avant de commencer! Le projet est compos´e de nombreuses (mais g´en´eralement petites) tˆaches que vous devez compl´eter. Les sections marqu´ees d’une ´etoile (*) sont plus cons´equentes et plus complexes donc pensez `a organiser votre temps en fonction. Nourriture et moissonneuses Pour le moment, il n’y a pas de couˆt de d´eploiement pour aucun type de fourmi, donc il n’y aucun d´efi dans le jeu. Il vous faut ajouter des couˆts en nourriture. — Remarquez que les fourmis ont un couˆt en nourriture de 0. Vous pouvez r´ed´efinir cela dans les sous-classes (ThrowerAnt et HarvesterAnt). ´Etant donn´e que la variable de couˆt de nourriture (foodCost) est prot´eg´ee (protected), il est facile de le faire. — Si vous allez plus loin dans les consignes, vous verrez que toutes les fourmis auront des couˆts en nourriture et des valeurs d’armure diff´erentes. Comme ces valeurs seront toutes les mˆemes au d´epart, elles seront sp´ecifi´ees dans le constructeur pour chaque type de fourmi. ´Etant donn´e que nous devons tout de mˆeme appeler le constructeur de la classe parente de tous les types de fourmis, il serait int´er´essant d’avoir un constructeur de la classe parente qui inclut ces deux valeurs pour ainsi les initialiser plus facilement. Ajoutez ce type de constructeur. — Sp´ecifiez le couˆt en nourriture pour les classes de fourmis HarvesterAnt et ThrowerAnt (voir tableau ci-dessous), et v´erifiez que vous ne pouvez pas d´eployer une fourmi si vous n’avez pas assez de nourriture! 4 Projet 2015-2016 Classe Nourriture Armure HarvesterAnt 2 1 ThrowerAnt 4 1 Vous utilisez maintenant de la nourriture, mais il n’y a aucun moyen d’en produire plus! Pour rem´edier `a cela, finissez d’impl´ementer la classe HarvesterAnt. En terme d’action (d´efinie dans la m´ethode action()), les fourmis moissonneuses doivent produire 1 de nourriture pour la colonie `a chaque tour. — Vous pouvez appeler la m´ethode appropri´ee sur le param`etre AntColony pour ajouter cette nourriture. Essayez de lancer le jeu `a nouveau. Quand vous aurez plac´e une HarvesterAnt, vous devriez `a pr´esent accumuler de la nourriture `a chaque tour. Vaincre les abeilles est `a nouveau possible avec la configuration par d´efaut du jeu! Fourmis murailles Maintenant vous allez cr´eer votre premi`ere nouvelle fourmi. Vous allez ajouter de la protection `a votre glorieuse colonie en impl´ementant la classe WallAnt qui est une fourmi qui ne fait rien `a chaque tour mais qui poss`ede une valeur d’armure forte. Classe Nourriture Armure WallAnt 4 4 — N’oubliez pas de cr´eer la classe WallAnt dans le package ants. Faites aussi attention de bien nommer vos fourmis correctement (la m´ecanique du jeu s’appuie sur les noms sp´ecifiques des fourmis pour fonctionner). — La classe WallAnt aura besoin d’inclure la m´ethode action() (pourquoi?) mais elle n’a pas besoin de faire quoi que ce soit. Fourmis affam´ees Impl´ementez une nouvelle unit´e offensive appel´ee la fourmi affam´ee (HungryAnt) qui d´evorera une abeille au hasard `a la mˆeme place, tuant instantan´ement l’abeille! Cependant, apr`es avoir aval´e une abeille, la fourmi doit passer 3 tours `a la dig´erer avant de pouvoir en manger de nouveau. Classe Nourriture Armure HungryAnt 4 1 — Vous pouvez impl´ementer cette fonctionnalit´e en d´eterminant la m´ethode action() que la fourmi soit en train de dig´erer ou non. Vous pouvez utiliser des variables d’instance pour garder une trace du temps que la fourmi a pass´e `a dig´erer. — Vous pouvez d´eterminer combien de d´egats doit ˆetre fait `a une abeille pour la tuer en utilisant la m´ethode getArmor(). 5 Projet 2015-2016 Fourmis de feu Impl´ementez `a pr´esent la fourmi de feu (FireAnt). Une fourmi de feu ne r´ealise aucune action `a chaque tour. Cependant, elles poss`edent une comp´etence sp´eciale : quand la valeur d’armure d’une fourmi de feu atteint zero (ou moins), les valeurs d’armure de toutes les abeilles au mˆeme endroit dans le tunnel (Place) que la fourmi de feu sont r´eduites du montant de l’attribut de d´egat (damage) de la fourmi (3 par d´efaut). Classe Nourriture Armure FireAnt 4 1 — Pour impl´ementer cela, vous devez r´ed´efinir la m´ethode reduceArmor() de la fourmi pour y ajouter cette fonctionnalit´e. Assurez-vous d’appeler la version de la m´ethode de la classe parent pour conserver le fonctionnement de base. — Assurez-vous de donner `a votre fourmi de feu une variable de d´egat (damage) pour pouvoir la modifier facilement; ne codez pas en dur la valeur des d´egats dans la m´ethode reduceArmor()! — Regardez la classe Place pour voir les m´ethodes qui vous permettront d’acc´eder `a la liste des abeilles `a blesser. Une fois la classe FireAnt impl´ement´ee, assurez-vous que celle-ci fonctionne et testez votre programme en jouant une partie ou deux! Une fourmi de feu devrait d´etruire toutes les abeilles au mˆeme endroit du tunnel que votre fourmi lorsque celle-ci meurt. Vous pouvez d´emarrer une partie avec 10 nourritures en sp´ecifiant la valeur appropri´ee dans la m´ethode principale de la classe AntsVsSomeBees. Eau* Maintenant que vous avez ajout´e le feu, nous allons ajouter l’eau! Pour rendre les choses plus int´eressantes, vous allez ajouter un nouveau type de Place, repr´esentant un tunnel rempli d’eau dans la colonie. Notez que cela sera une des tˆaches les plus complexes de votre travail, car vous serez ammen´es `a modifier certaines parties du programme coeur (core). — Cr´eer une nouvelle classe Water qui sera une sous-classe de Place (assurez-vous de cr´eer cette classe dans le paquetage core). — Vous aurez besoin de modifier AntColony afin qu’il inclut Water parmi les endroits/places possibles. Dans le constructeur, modifiez les boucles afin qu’au lieu de cr´eer un nouvel objet Place, cela cr´ee p´eriodiquement un nouvel objet Water en fonction du param`etre moatFrequency. — Astuce : ajoutez une simple instruction if pour d´eterminer si le tunnel doit ˆetre une Place ou de l’eau (Water). Vous devrez ˆetre capable d’instancier de nouveaux objets Water en utilisant les mˆemes types de param`etres que le code actuel pour cr´eer une nouvelle Place. Assignez le nouvel objet Water `a la variable curr et tout doit fonctionner. — Vous devrez cr´eer un objet Water tout les moatFrequency places. Vous pourrez faire cela en v´erifiant si chaque variable step est divisible par la valeur cible. Par exemple, si vous voulez inclure Water toutes les troisi`emes places, vous pouvez placer Water en 0, 3, 6, etc. (Mais r´eellement, vous devrez ajouter 1 pour que ce soit les places 1, 4, 7, etc). — Cela peut ˆetre d´elicat – rappelez vous de l’op´erateur modulo %! — Rappelez vous aussi de ne pas inclure d’eau si moatFrequency vaut 0! — Ensuite, vous aurez besoin de modifier la classe AntGame afin que l’eau soit visible. Cela peut ˆetre difficile, car beaucoup de choses sont g´er´ees dans AntGame! — Regardez la m´ethode qui dessine une colonie. Dans cette m´ethode, vous devriez voir que la ”bordure” de la place est dessin´ee comme un simple rectangle. Vous pouvez dessiner l’eau (Water) en remplissant simplement un rectangle bleu avant de dessiner cette bordure! — Vous aurez besoin de d´eterminer si une Place correspond `a de l’eau (rappelez-vous que le polymorphisme signifie que Water est ´egalement une Place). C’est le bon endroit pour utiliser l’op´erateur instanceof. 6 Projet 2015-2016 — Testez si l’eau apparaˆıt effectivement dans le jeu! Une fois l’eau ajout´ee, vous devrez vous assurer que les insectes y r´eagissent. Seuls certains insectes (watersafe) peuvent ˆetre plac´es sur une place Water. — Ajoutez un nouvel attribut watersafe `a la classe Insect pour conserver cette propri´et´e. Cet attribut doit ˆetre `a faux par d´efaut. — Vous aurez probablement besoin d’une m´ethode d’acc`es (un getter) pour cet attribut. — Comme les abeilles peuvent voler, leur attribut watersafe sera vrai, red´efinissez la valeur par d´efaut dans ce cas. — Une fois que cela fonctionne, vous ne devriez plus pouvoir placer des fourmis sur des points d’eau! Fourmis sous-marines Cr´eez un nouveau type de fourmis qui peuvent ˆetre d´eploy´ees sur des points d’eau! Ajoutez une fourmi ScubaThrowerAnt qui est un type de ThrowerAnt qui ne craint pas l’eau (watersafe), mais qui est identique `a la classe parent sinon. Class Food Armor ScubaThrowerAnt 5 1 Fourmis ninja Ajoutez une fourmi NinjaAnt, qui endommagent toutes les abeilles (Bees) qu’elle rencontre, mais qui n’est jamais vue par celles-ci (donc permettant les abeilles de la traverser). Class Food Armor NinjaAnt 6 1 — Une fourmi NinjaAnt ne peut pas ˆetre attaqu´ee par une abeille car elle est cach´ee, ni ne peut bloquer le chemin d’une abeille car elle la survole. Pour implanter ce comportement, ajoutez un nouvel attribut `a la classe Ant qui indique si une fourmi bloque le chemin d’une abeille (ce qui sera faux pour une fourmi NinjaAnt). — Modifiez la m´ethode isBlocked() de la class Bee afin qu’une abeille ne soit pas bloqu´ee si une fourmi ne la bloque pas. Maintenant, les abeilles devraient pouvoir survoler correctement les fourmis ninja. — Enfin, faites en sorte que NinjaAnt endommage toutes les abeilles qui la survolent. La m´ethode action() de NinjaAnt doit endommager toutes les abeilles qui sont sur la mˆeme place au travers de la valeur damage (qui doit valoir 1 par d´efaut). Comme challenge, essayez de gagner un jeu par d´efaut en utilisant uniquement des fourmis HarversterAnt et NinjaAnt! Fourmis boucliers* Pour l’instant, vos fourmis sont fragiles. Nous aimerions leur donner un moyen de tenir plus longtemps sous l’assaut des abeilles. C’est l`a qu’entre en sc`ene la fourmi bouclier (BodyguardAnt). Class Food Armor BodyguardAnt 5 2 7 Projet 2015-2016 La fourmi bouclier diff`ere d’une fourmi normale car elle peut occuper la mˆeme Place qu’une autre fourmi. Lorsq’une fourmi bouclier est ajout´ee sur l’emplacement d’une autre fourmi, elle la prot`ege des d´egats. Les attaques doivent impacter la fourmi bouclier en premier, puis l’autre fourmi une fois que la fourmi bouclier a p´eri. L’implantation de cette fourmi se fait en plusieurs ´etapes : — Normalement, seule une fourmi peut occuper une Place `a un moment donn´e. La premi`ere chose `a faire est de changer cela. Il faut pouvoir d´efinir un nouveau type de fourmi qui est capable de ”contenir” une autre fourmi. Il est envisageable d’avoir besoin un jour de plusieurs types de ”fourmis contenantes” (par exemple des sous-classes d’autres types de fourmis). Ce comportement doit ˆetre sp´ecifi´e en utilisant une interface nomm´ee Containing. — L’interface Containing doit supporter trois m´ethodes : la capacit´e d’ajouter l’insecte contenu (qui doit indiquer si l’insecte a bien ´et´e ajout´e ou non), la capacit´e de supprimer l’insecte contenu (qui doit indiquer si l’insecte a bien ´et´e supprim´e ou non), et la capacit´e d’obtenir l’insecte contenu. — Maintenant,vous avez besoin de modifier la classe Place afin qu’elle puisse recevoir une fourmi Containing qui peut elle-mˆeme contenir une autre fourmi. Vous devez modifier la m´ethode d’ajout d’une fourmi de la mani`ere suivante : (a) Si la fourmi occupant d´ej`a la Place est une Containing, ajouter la nouvelle fourmi `a celle Containing. (b) Si la fourmi que vous essayer d’ajouter est une Containing, prendre la fourmi d´ej`a en place, ajouter celle-ci `a la Containing, et ajouter enfin la fourmi Containing `a la place de la premi`ere. (c) Si la Containing ne peut pas contenir la fourmi sp´ecifi´ee (addContenantInsect() retourne faux), afficher la mˆeme erreur que pr´ec´edemment. (d) Si aucune des fourmis n’est une Containing, afficher la mˆeme erreur que pr´ec´edemment. — Vous aurez ´egalement besoin de modifier la m´ethode removeInsect(Ant) de telle sorte que, si la fourmi `a supprimer est `a l’int´erieur d’une Containing, elle soit supprim´ee depuis celle-ci. De mˆeme, si la fourmi `a supprimer est une Containing, celle-ci est supprim´ee et si elle contient une autre fourmi, cette derni`ere prend sa place. — Vous aurez ´egalement besoin de mettre `a jour la m´ethode getAllAnts() de AntColony de telle sorte qu’`a la fois la fourmi Containing et la fourmi contenue soient incluses dans la r´eponse. — Vous devrez aussi vous assurer que les deux fourmis apparaissent dans le jeu. Pour ce faire, vous devrez modifier la m´ethode drawColony() de AntGame une nouvelle fois. Apr`es avoir v´erifi´e si une Place a une fourmi, v´erifiez si cette fourmi est une Containing et, si tel est le cas, dessinez la fourmi contenue en plus de la Containing. — Vous pouvez utiliser les mˆemes param`etres de positionnement pour la m´ethode g2d.drawImage(). Dessinez simplement la fourmi contenue en premier (pour qu’elle apparaisse `a l’arri`ere), et ensuite la Containing. — Une fois tout pr´epar´e, vous pouvez cr´eer la classe BodyguardAnt! Cette classe doit bien suˆr implanter l’interface Containing! — Pour avoir acc`es `a la fourmi contenue dans une BodyguardAnt, utilisez une variable d’instance. Elle sera initialis´ee `a null pour indiquer qu’aucune fourmi n’est actuellement prot´eg´ee. Veillez `a faire une encapsulation propre (variable priv´ee!). — Vous devrez vous assurer que la fourmie contenue continue d’effectuer ses propres actions. Surchargez la m´ethode action() du BodyguardAnt en fonction. Soyez rigoureux lors de l’´elaboration de cette fourmi bouclier. Elle touche en effet de nombreuses parties du code qui peuvent produire de nombreuses erreurs. La Reine* Pour finir, vous rendrez possible le positionnement de la reine elle-mˆeme dans une galerie. 8 Projet 2015-2016 Classe Nourriture Armure QueenAnt 6 1 La reine (QueenAnt) est r´esistante `a l’eau (waterproof) et attaque `a distance (comme ScubaAnt, que vous devriez utiliser en tant que classe parente). La reine galvanise les fourmis `a proximit´e. En effet, elle double les dommages caus´es par les fourmis voisines (Celles de la place d’entr´ee et de sortie). — Pour vous assurer que vous ne doubliez pas la mˆeme fourmi deux fois, vous pouvez conserver une liste des fourmis qui ont d´ej`a ´et´e galvanis´ees. — Vous pouvez avoir besoin d’ajuster l’h´eritage de l’attribut damage afin d’interagir avec n’importe quelle fourmi, quelque soit son type. Vous pouvez ´egalement ´ecrire une interface Damaging, avec des accesseurs et modificateurs appropri´es. Un grand pouvoir implique de grandes responsabilit´es... La reine est soumise `a trois r`egles sp´eciales : (a) Si une abeille entre sur la place occup´ee par la reine, alors les abeilles gagnent imm´ediatement la partie. Le jeu termine, mˆeme si la reine est prot´eg´ee par une fourmi bouclier (BodyGuardAnt). Les abeilles gagent ´egalement dans le cas ou` l’une d’entre elles atteint la fin d’une galerie (L`a ou` r´eside, en temps normal, la reine). — La m´ethode queenHasBees() de la classe AntColony indique si l’une des abeilles a atteint la reine. Ceci est d´etermin´e en v´erifiant si this.queenPlace.getBees().length 0. Actuellement, la variable queenPlace est une place ordinaire. Impl´ementez QueenPlace, une sous-classe de Place. Cette derni`ere repr´esente concr`etement deux places : Ou` est actuellement la reine, et la place queenPlace qui termine toutes galeries. — Indice : Ce devrait ˆetre une place qui en contient une seconde; cette seconde place fait r´ef´erence `a la position actuelle de la reine. — Vous aurez besoin de red´efinir l’accesseur getBees() afin qu’il renvoie les abeilles de la premi`ere et de la seconde place. — Dans la m´ethode action() de QueenAnt, mettez `a jour l’attribut queenPlace de la colonie, avec une nouvelle instance de QueenPlace comprenant la place courante de la reine. — Il est n´ecessaire d’ajouter un accesseur et un modificateur pour l’attribut queenPlace. (b) Il ne peut y avoir qu’une vraie reine en jeu. Toutes les autres reines sont des imposteurs et devraient mourir instantan´ement (armure r´eduite `a 0) avant d’engager une action (Elle n’attaque pas et ne galvanise pas les fourmis voisines). De plus, elles ne devraient pas affecter l’attribut queenPlace de la colonie. — Pour ce faire, vous pouvez utiliser une variante du patron de conception Singleton1 (Vous l’aborderez certainement en g´enie logiciel). — Son impl´ementation se r´esume `a conserver le nombre de fois que la classe QueenAnt a ´et´e instanci´ee. Vous devrez utiliser une variable de classe (statique). Chaque fois qu’une reine est cr´e´ee, incr´ementez cette variable de un. Vous ne devriez pas avoir besoin de parcourir la colonie de place en place pour trouver les imposteurs. (c) La vraie reine ne devrait pas pouvoir ˆetre supprim´ee; toutes tentatives de suppression, ne devrait avoir aucun effet. — Id´ee : Vous pourriez´ecrire une interface que la classe QueenAnt et d’autres pourrait impl´ementer et utiliser un test de type pour d´eterminer si l’insecte est supprimable. Vous ˆetes arriv´e·e·s `a la fin! Alors? Parvenez-vous `a battre ces abeilles dans le mode fou (insane-mode)? 1. Voir https://fr.wikipedia.org/wiki/Singleton_(patron_de_conception) 9 Projet 2015-2016 F Bonus Il y a de nombreuses mani`eres d’enrichir ce jeu! Nous vous avons fourni des images (et leur support dans l’interface graphique) pour de nouveaux types de fourmi. Vous pouvez ´egalement concevoir vos propres types de fourmi! Classe Nourriture Armure Description SlowThrowerAnt 4 1 Applique un effet de ralentissement de trois tours. Une abeille ralentie effectue une action apr`es en avoir pass´e 2. StunThrowerAnt 6 1 Applique un effet d’´etourdissement pour 1 tour. Une abeille ´etourdie passe son tour. ShortThrowerAnt 3 1 Une ThrowerAnt qui lance des feuilles aux abeilles situ´ees au plus `a 2 places de la fourmi. LongThrowerAnt 3 1 Une ThrowerAnt qui lance des feuilles aux abeilles situ´ees au moins `a 4 places de la fourmi. Vous pourriez aussi cr´eer de nouveaux types d’abeilles (Cette extension peut demander un grand nombre de modifications et d’ajouts). Les extensions peuvent vous rapporter jusqu’`a 2 points de bonus. Assurez-vous toutefois que les fonctionnalit´es rudimentaires sont impl´ement´ees et fonctionnent correctement. 10