Examen 3h30 sur machine

Consignes

L'examen est composé de 5 exercices qui doivent être traités dans l'ordre proposé. Il est tout à fait possible de passer un exercice mais il faut avoir lu l'énoncé pour comprendre l'exercice suivant.


Rappel : vous devez configurer le workspace d'Eclipse (File > Switch WorkSpace) pour qu'il corresponde au répertoire EXAM présent dans le home de votre session de TP noté.

Vérifiez que tous vos fichiers sont bien dans le répertoire EXAM. Tout ce qui n'est pas dans ce répertoire est perdu quand vous vous déconnectez (ou en cas de panne).

Vous avez le droit de consulter les transparents du cours.

La Javadoc est disponible ici

Attrapez les tous !

Dans ce sujet, nous allons créer un très simple simulateur de combat de Pokémon.

Le sujet est composé comme suit:

D'un point de vue fonctionnel, le code demandé est très simple. Vous allez être évalué sur vos choix dans l'architecture du code: organisation des classes, choix des visibilités pour les champs et les méthodes, absences de duplication de code, respect des principes SOLID, choix des design-patterns...

Dans tout le sujet, votre code ne doit en aucun cas utiliser les switch introduit par Java 17.

Téléchargement des pokémons

Toutes les classes demandées dans cet exercice doivent se trouver dans le package fr.uge.pokemon.retrieve. Votre code ne doit en aucun cas utiliser les switch introduit par Java 17.

Dans cet exercice, vous allez travailler sur une application qui permet de récupérer des informations sur des pokémons et de les afficher. Les informations qui nous intéresse pour un pokémon sont:

Pour accéder aux informations, nous disposons d'une libraire appelée PokemonAPI. Cette librairie présente des choix de design douteux mais vous n'avez pas le droit de la modifier du tout. Elle permet:

On part de l'application PokeRetrieverqui est fonctionnelle. Elle utilise la librairie PokemonAPI et elle permet d'afficher la liste de tous les noms des pokémons connus et d'afficher les informations détaillées pour un pokémon à partir de son nom.

Téléchargez la librairie PokemonAPI et l'application PokeRetriever. Vérifiez que l'application fonctionne correctement et que vous comprenez son code. Il n'est pas nécessaire de lire le code précis de PokemonAPI.

Le but de cette exercice est de faire évoluer l'application. La première évolution qui vous aie demandée est de permettre l'utisation d'une autre librairie pour récupérer les informations sur les pokémons. Cette libraire s'appelle Pokedex.java. Téléchargez là et lisez la très simple javadoc qu'elle contient pour vous familiariser. Vous n'avez pas de le droit de modifier cette librairie. On vous demande de faire évoluer l'application PokeRetriever pour que si l'on passe l'argument --pokedex sur la ligne de commande elle utilise la libraire Pokedex et sinon elle utilise PokemonAPI.

Implémentez l'évolution demandée. En commentaire en haut du fichier PokeRetriever, donnez le nom du design pattern que vous avez utilisé.

On veut maintenant que si l'application est démarrée avec l'option --cache, les informations sur un même Pokémon ne soit jamais demandée deux fois à la librairie. Ce choix doit fonctionner aussi bien avec la librairie Pokedex que la libraire PokemonAPI.

Implémentez l'évolution demandée. En commentaire en haut du fichier PokeRetriever, donnez le nom du design pattern que vous avez utilisé.

On veut maintenant que si l'application est démarrée avec l'option --limited, on ne puise pas faire plus de 1000 appels de méthodes à la libraire que l'on utilise. Si les 1000 appels ont été effectués, on veut que l'application affiche "Maximum number of operations allowed reached" et qu'elle s'arrête. Ce choix doit fonctionner aussi bien avec la librairie Pokedex que la libraire PokemonAPI.
On parle bien ici du nombre d'appels aux différentes méthodes publiques des API Pokedex ou PokemonAPI.

Implémentez l'évolution demandée. En commentaire en haut du fichier PokeRetriever, donnez le nom du design pattern que vous avez utilisé.

Création

Toutes les classes demandées dans cet exercice doivent se trouver dans le package fr.uge.pokemon.create. Votre code ne doit en aucun cas utiliser les switch introduit par Java 17.

Dans cet exercice, vous allez travailler sur une classe représentant un Pokemon que vous pouvez télécharger Pokemon.java.

On vous demande de modifier la classe Pokemon de manière à rendre plus agréable la création d'un Pokemon.

Copiez la classe Pokemon dans une classe PokemonEasy et implémentez les modifications demandées. En commentaire en haut de cette classe, donnez le nom du design-pattern que vous avez utilisé.

En repartant de la classe Pokemon que vous pouvez télécharger ici: Pokemon.java. On vous demande de faire en sorte qu'on ne puisse pas créer deux Pokemons ayant le même nom.

Copiez la classe Pokemon dans une classe PokemonUnique et implémentez toutes les modifications nécessaires. Cette question est complètement indépendante de la première et il faut repartir de la classe de base. En commentaire en haut de cette classe, donnez le nom du design-pattern que vous avez utilisé.

Pokémons equipés

Toutes les classes demandées dans cet exercice doivent se trouver dans le package fr.uge.pokemon.items. Votre code doit être utilisable avec ou sans les switch introduit par Java 17.

Dans cet exercice, vous allez travailler sur une classe représentant un Pokemon que vous pouvez télécharger Pokemon.java. Pour le reste de l'exercice, vous n'êtes pas autorisés à modifier la classe Pokemon à part pour la renommer et la faire implémenter une interface.

On veut pouvoir équiper nos Pokémons de 3 types d'objets différents:

Chaque objet à une stat qui est un nombre strictement positif. Quand on équipe un objet sur un pokémon, cet objet va modifier sa force ou sa défense comme suit:

Si on équipe un pokémon avec 5 de force et 10 de défense avec un chapeau à 5 et un épée à 7. Le pokémon aura une force de 12 et une de défense de 15. Les effets des objets s'appliquent dans l'ordre où on les équipent. Par exemple, si sur un pokémon avec 10 de défense, on équipe un chapeau à 5 puis un bouclier à 2, on obtiendra un pokémon avec (10+5)*2=30 de défense. Si sur ce même pokémon, on équipe d'abord un bouclier à 2 puis un chapeau, on obtiendra (10*2)+5=25. On peut bien entendu équiper plusieurs chapeaux, etc.

Ecrivez les classes permettant de créer ces objets et de les équiper sur les Pokemons. Dans le main d'une classe Application construisez un Pokemon appelé Bob avec un attaque de 5, une défense de 10 et 200 hitPoints. Donnez le code permettant d'obtenir ce Pokemon equipé d'un chapeau à 5 puis un bouclier à 2 puis enfin d'une épée à 7. En commentaire en haut de votre classe Application, donnez le nom du design pattern que vous utilisez.
Vous n'êtes pas autorisés à modifier la classe Pokemon à part pour la renommée et la faire implémenter une interface.

Vérifiez si la méthode toString de vos pokémons équipés d'objets fonctionnent correctement. Si ce n'est pas le cas modifiez votre code.

Arena

Toutes les classes demandées dans cet exercice doivent se trouver dans le package fr.uge.pokemon.arena. Votre code ne doit en aucun cas utiliser les switch introduit par Java 17.

Le but de cet exercice est d'écrire classe Arena qui prend à la construction une liste de pokémons (en utilisant la classe Pokemon.java fournie à l'exercice précédent) et qui permet de les faire s'affronter. La méthode startFight va tirer au hasard un pokemon attaquant et un pokemon defenseur et faire l'attaque correspondante. Si le defenseur est mort, il est supprimé des combatants et ce jusqu'à ce qu'il ne reste plus qu'un pokemon vivant.

On vous fournit une implémentation simpliste de cette classe Arena.java.

Le but de cet exercice est de faire évoluer cette classe en respectant les principes SOLID.

La première évolution est qu'on veut pouvoir choisir comment l'attaquant et le defenseur sont choisis à chaque round. Par exemple au lieu de tirer les deux au hasard, on veut pouvoir faire une arène où le pokémon attaquant est celui ayant le moins de hitPoints et le pokémon défenseur est celui qui a le plus de hitPoints.

Modifier la classe Arena pour permettre cette évolution.
En commentaire en haut du fichier Arena indiquez quel design pattern vous avez utilisé.
Dans le main de la classe Arena, donnez le code permettant de construire un Arena où l'attaquant et le défenseur sont choisis au hasard et le code d'une permettant de construire une Arena dans laquelle l'attaquant est le pokémon ayant le plus petit nombre de hitPoints et le défenseur est le pokémon ayant le plus grand nombre de hitPoints.

La deuxième évolution est que l'on veut réaliser plusieurs actions au cours du combat:

Modifier la classe Arena pour permettre cette évolution. Au lieu d'utiliser une API pour envoyer des mails, tweets et des posts Facebook, on vous demande simplement de faire un simple affichage.
En commentaire en haut du fichier Arena indiquez quel design pattern vous avez utilisé.

Scripts pour les pokémons

Toutes les classes demandées dans cet exercice doivent se trouver dans le package fr.uge.pokemon.scripts. Votre code ne doit en aucun cas utiliser les switch introduit par Java 17.

Le but de cet exercice est de réaliser une petite librairie qui permet de parser des fichiers qui décrivent les aventures de nos pokémons.

Le fichier contient un évènement par ligne du fichier. Il y a trois types d'évènements:

Le format pour chacun des évènement est le suivant:

type vaut soit HAT,SHIELD ou SWORD.

Par exemple, un fichier peut ressembler à ce qui suit.

ENCOUNTER_POKEMON;Bulbizar;10;5;600
ENCOUNTER_POKEMON;Ronflex;6;5;400
PICK_UP_ITEM;HAT;5
PICK_UP_ITEM;SWORD;7
ENCOUNTER_POKEMON;Miaouss;6;5;400
EQUIP_ITEM;SHIELD;5

Ecrivez une libairie PokeScript qui permet de parser les fichiers au format décrit précédemment. Attention votre librairie doit pouvoir être utilisée par d'autres applications qui veulent travailler avec ce format de fichier.

Dans le main d'une classe Application, écrivez une petite application qui prend en ligne de commande le nom d'un fichier de script et qui va simuler les événements qu'il contient. Idéalement vous utiliserez le code des questions précédentes mais si vous avez décidé de passer certaines questions, vous pouvez faire un simple affichage.