• Aucun résultat trouvé

Rapport IPO/A3P : Zuul

N/A
N/A
Protected

Academic year: 2022

Partager "Rapport IPO/A3P : Zuul"

Copied!
14
0
0

Texte intégral

(1)

Rapport IPO/A3P : Zuul 2020-2021

Version 1 – 12/02/2021 Alban FERRACANI

Table des matières

I. LE JEU. 2

A. AUTEUR 2

B. THEME 2

C. RESUME ECRIT DU SCENARIO 2

D. PLAN DE LA DISPOSITION DES PIECES 2

E. SCENARIO DETAILLE 3

F. DETAILS DES LIEUX, ITEMS, PERSONNAGES 3

G. SITUATIONS GAGNANTES ET PERDANTES 4

H. ÉNIGMES 4

II. EXERCICES. 5

EX 7.5 : PRINTLOCATIONINFO() 5

EX 7.6 : GETEXIT () 6

EX 7.7 : GETEXITSTRING () 6

EX 7.8 :HASHMAP (), SETEXIT () 7

EX 7.8.1 :DEPLACEMENT VERTICAL 9

EX 7.9 : KEYSET() 9

EX 7.10 : GETEXITSTRING()-FACULTATIF 10

EX 7.10.1 : COMPLETER LA JAVADOC 10

EX 7.10.2 : GENERER LA JAVADOC 11

EX 7.11 : GETLONGDESCRIPTION() 11

EX 7.14 : LOOK () 12

EX 7.15 : EAT () 12

EX 7.16: SHOWALL, SHOWCOMMAND() 13

EX 7.17:AJOUT DUN NOUVEAU MOT COMMANDE (OPTIONNEL). 14

(2)

I. Le jeu.

A. Auteur

Alban FERRACANI, ESIEE Paris, E1 – Groupe 3 (Promo A)

B. Thème

Dans un château du Périgord, un détective doit enquêter, pour retrouver la clé de la pièce secrète, disparue depuis des générations.

C. Résumé écrit du scénario

Le scénario se déroule dans un château Périgourdin. Le but du jeu est d’arriver à accéder à la pièce secrète. Pour y parvenir, le joueur devra passer par différentes pièces, résoudre des énigmes et trouver les sorties cachées.

De plus, une fois arrivé devant la porte de la pièce secrète, le joueur devra déceler son mécanisme afin de l’ouvrir. Le mécanisme complexe, se déverrouillera en deux étapes, dans deux pièces différentes.

D. Plan de la disposition des pièces

Enceinte du château

Entrée Cuisine

Salle à manger Salle de

réception Bureau

royal

Jardin Écurie -

grange Sous-sol Passage

secret

Pièce secrète

Pièce

Niveau 0 Pièce Niveau -1 Légende :

(3)

E. Scénario détaillé

Comme décrit dans le résumé précédemment, le scénario se déroule dans un château Périgourdin. Le château se compose de différentes pièces mais également d’un jardin (voir le détail des pièces dans la section

suivante). Le but du jeu est d’arriver à accéder à la pièce secrète du château. Pour y parvenir, le joueur devra passer par différentes pièces et trouver les sorties cachées, de par les énigmes qui s’afficheront.

Le joueur, en position de détective, devra accéder à la pièce en un temps imparti.

L’une des énigmes permettra de deviner la localisation de la pièce secrète (énigme n°1 dans la partie H), les autres, permettant de comprendre comment activer les deux mécanismes nécessaires au déverrouillage de la pièce (énigmes n°2 et 3 dans la partie H).

Ces deux mécanismes, l’un situé dans la grange, l’autre dans le sous- sol, permettent de déverrouiller la porte de la pièce secrète si tous deux sont activés.

Le joueur pourra se déplacer sur deux niveau (cette notion peut être amenée à évoluer au fur et à mesure de la conception du jeu). Le premier niveau (respectivement nommé niveau 0 sur le plan de la partie D) est le niveau initial, duquel le joueur part dans sa quête aux énigmes et à la découverte de la pièce secrète. Le second niveau correspond au niveau -1 sur le plan de la partie D. Pour y accéder, il devra emprunter une

« zone de descente ».

Aussi, le joueur devra passer par toutes les pièces du château

mentionnées sur le plan mais également dans la section F suivante. Il devra soit résoudre des énigmes pour déterminer la localisation de

certaines pièces et mécanismes et/ou leur fonctionnement soit récupérer des objets comme des clefs, indispensables à l’accès de certaines

pièces, qui, si les objets adéquats n’ont pas été attrapés préalablement attrapés, seront fermées.

Ainsi après avoir parcouru toutes les pièces du château, tout en ayant récupéré les objets essentiels et résolu certaines énigmes au fur et à mesure, le joueur, en position d’enquêteur devra déverrouiller et

accéder à la pièce secrète pout gagner le jeu.

F. Détails des lieux, items, personnages

Jardin (point de départ du jeu) : Ludovic, le détective privé se trouve dans la cour du jardin du château. Il commence son enquête pour

commencer la recherche de tous les indices pour trouver la clé de la pièce secrète.

Entrée : Il s’agit du carrefour du château. Depuis ce lieu, on peut

accéder à de multiples pièces. Pas d’objets clés dans cette salle.

(4)

Salle de réception : Il s’agit de la salle servant à recevoir le public dans le château et qui servait autrefois à organiser de grandes

réceptions. Pas d’objets clés dans cette salle.

Salle a manger : Il s’agit du lieu où les convives se restaurent.

Cuisine : S’y trouvent Clément et Chantale, les deux cuisiniers du château. On y trouve la clé menant à la cave, pièce de stockage de nombreux aliments et ustensiles de cuisine.

Bureau royal : Il s’agit du lieu où l’ancien propriétaire jouait et rangeait de précieux objets (2

ème

lieu après la pièce secrète où il

rangeait ses biens de grande valeur). Sans issue sur le passage secret, le bureau cache une clé nécessaire à l’activation du mécanisme de

l’écurie et un indice pour découvrir la localisation du mécanisme n°1.

Écurie – grange : Bâtiment extérieur au château, dont l’accès se fait exclusivement par le jardin. On y trouve néanmoins un mécanisme

permettant d’ouvrir la porte menant au passage secret (l’écurie étant située au-dessus de la pièce secrète mais sans accès directs.

Passage secret : Il s’agit d’un passage entre le sous-sol et la pièce secrète. Pour voir ce passage se dévoiler, une fois le mécanisme de l’écurie activé, il faut se pencher sur un système d’ouverture de la porte très innovant a été mis au point par les ingénieurs de l’époque : une combinaison d’actions à effectuer notamment sur des bouteilles de vin stockées dans la cave.

Pièce secrète : Le lieu tant convoité par Ludovic ainsi que par les héritiers du château. Il renferme des objets encore inconnus mais supposés précieux.

G. Situations gagnantes et perdantes

Pour gagner le jeu, le joueur doit trouver et activer tous les

mécanismes essentiels à l’ouverture de la porte du passage secret et de celle de la pièce secrète.

Si le détective y arrive dans une certaine limite de temps, la partie est gagnée.

Si non, il faut recommencer ou quitter le jeu.

H. Énigmes

N°1 : « Mieux vaut cacher ses objets les plus précieux proche du sol, à l’abris d’intrus ou d’incendies ».

N°2 : « Trouver le premier mécanisme est comme trouver une aiguille dans une botte de foin »

N°3 : « Le verre des vieilles bouteilles de vin est fragile, alors

appuyez avec délicatesse ! »

(5)

II. Exercices.

Ex 7.5 : printLocationInfo()

Réponse :

La procédure était inacceptable avant cette amélioration, car on avait de la duplication de code, le pire ennemi de la programmation. En cas de modification, on peut oublier de modifier une partie du code dupliqué ce qui nuirait à son bon fonctionnement.

Pour y remédier, on a donc crée une procédure printLocationInfo() et on y a inséré le code dupliqué.

Cela permet d’appeler cette procédure pour savoir la pièce actuelle ainsi que les sorties disponibles sous la forme d’une chaîne de caractères (String).

Enfin, on supprime la partie de code de printWelcome() (encadrée en orange ci-dessous) qui constitue maintenant la procédure printLocationInfo(). En plus d’être appelée dans printWelcome() ,la méthode printLocationInfo()sera aussi appelée dans goRoom().

(6)

Ex 7.6 : getExit ( )

Réponse :

Dans cet exercice, nous avons d’abord modifié getExit() en utilisant un accesseur comme indiqué dans le livre pour réduire le couplage, et pour éviter que la classe Game utilise directement les attributs de la classe Room. Nous avons ainsi modifié une première fois la classe Game dès lors qu’on accédait à une variable de sortie. Puis nous l’avons re-simplifiée en remplaçant la partie où l’on testait les 4 directions (if

pdirection.equals(‘’…..’’){ vNextRoom = …}) par la ligne de code encadrée en orange ci-dessous.

On a donc implémenté la fonction getExits() dans Room. Cela permet de simplifier et raccourcir le code.

Ex 7.7 : getExitString ( )

Réponse :

On va désormais demander à la procédure de donner directement les informations sur les sorties disponibles sous la forme d’une chaîne de caractère. Pour cela, on utilise getExitString() qui permet de retourner les sorties disponibles dans toutes les directions.

On doit donc modifier la procédure printLocationInfo().

(7)

Ex 7.8 : HashMap ( ), setExit ( )

Réponse :

On a tout d’abord importé le package java HashMap.

On a aussi remplacé les attributs de la classe Room faisant référence aux sorties de chaque pièce par un attribut de type HashMap qui a pour objectif de créer un lien entre une String et une Room et qui le stocke dans « exits ».

De par cette nouvelle forme de HashMap, on a redéfini la méthode createRooms(), et redéfini les sorties sous la forme : « pDirection, neighbor ». Nous avons ainsi pu attribuer plus facilement les sorties et directions aux pièces.

(8)

On a également dû adapter la méthode setExits() à la nouvelle forme qu’impose le « HashMap ». Cela permet néanmoins de diminuer considérablement la taille de la méthode et ainsi simplifier sa maintenance, lecture et compréhension.

Enfin, il est également nécessaire de modifier la fonction getExitString() , puisque les sorties ne sont plus stockées de la même façon que dans Room.

La seconde partie de l’exercice consiste à adapter le concept du Hashmap à mon jeu, en configurant mes pièces, les sorties que j’ai définies dans le plan (cf. D partie 1). Pour cela, on modifie la procédure

createRooms() de la classe Game.

(9)

Ex 7.8.1 : Déplacement vertical

Réponse :

J’ai ajouté au scénario un déplacement vertical (en hauteur). En effet, le joueur peut maintenant se diriger vers la cave du château (niveau -1) qui se situe en bas de l’étage principal (niveau 0).

Ex 7.9 : keySet( )

Réponse :

Comme nous l’avons vu précédemment, le concept de la HashMap est de stocker et lister une association de clés dans un tableau non-ordonné (associatif).

L’appel à la méthode keySet() permet de répertorier toutes les entrées du tableau et donc de récupérer les sorties de la Room actuelle. Enfin, les sorties des Rooms sont ici représentées par les clés de la HashMap.

Pour cela, on a tout d’abord importé la classe java Set.

Puis, on a modifié la fonction getExitString() pour l’adapter à notre HashMap (boucle for each).

(10)

Maintenant que l’on a adapté la fonction getExitString() au HashMap, on peut également modifier la méthode printLocationInfo().

Ex 7.10 : getExitString( ) - Facultatif

Réponse :

Reprenons la fonction

getExitString()et expliquons les différentes étapes.

è La ligne 115 ci-dessus permet de retourner une chaîne de caractère qui précèdera le nom des sorties disponibles.

è La ligne 116 permet d’assigner à keys les clefs de type String que sont exit.

è La ligne 118 est une boucle for each comme mentionné dans l’exercice précédent. Elle est différente d’une boucle for classique et elle s’arrête de tourner lorsque tous les éléments ont été parcourus.

è La ligne 119 est équivalente à la notation suivante mentionnée dans le livre : A = A + B. On peut également noter cette dernière sous une forme raccourcie à savoir A += B, cela est totalement équivalent.

Cette ligne 119 accompagnée de la boucle for each permet de retourner une chaine de caractères donnant les sorties disponibles les unes après les autres comme l’on peut le voir dans le terminal BlueJ ci-dessous encadré en orange.

Ex 7.10.1 : compléter la javadoc

Réponse :

Fait. Se référer à la javadoc.

(11)

Ex 7.10.2 : générer la javadoc

Réponse :

La classe Game contient beaucoup moins de méthodes que celle de la classe Room. Cela peut s’expliquer par le fait que la classe Game ait beaucoup de méthodes privées, qui n’apparaissent donc pas dans la javadoc.

La javadoc est générée et peut être retrouvée dans le dossier du projet,

Ex 7.11 : getLongDescription( )

Réponse :

On ajoute la méthode getLongDescription() à la classe Room. On retourne une description détaillée de la pièce (pièce actuelle et les sorties disponibles).

De plus, on modifie et simplifie la méthode printLocationInfo()qui se trouve dans la classe Game. On retire les deux lignes grisées (ici que j’ai laissé sous la forme d’un bloc de commentaires) et on les remplace par l’appel à la méthode dans Room getLongDescription().

Désormais, quand nous voudrons donner une description plus exhaustive de la pièce, nous n’aurons qu’à modifier une unique classe : la classe Room. Cela permet de simplifier grandement la « maintenance » et de fait les éventuelles évolutions possibles du jeu.

(12)

Ex 7.14 : look ( )

Réponse :

On ajoute dans la classe Game une méthode look() qui permettra d’afficher la description longue de la pièce actuelle. Cette méthode sera appelée lorsqu’on tapera look dans le terminal et est amenée à être complétée par la suite.

Pour cela, on ajoute dans la classe CommandWords le tableau de mots connus.

Puis on ajoute la méthode look() dans la classe Game.

Enfin, on ajoute un cas pour la commande dans la méthode processCommand()de la classe Game, qui appellera la méthode look() quand la commande « look » sera reconnue.

Ex 7.15 : eat ( )

Réponse :

On ajoute une autre commande au jeu que l’on nommera eat. Celle-ci permettra de « manger » des objets comme des aliments, qui permettront de faire évoluer je joueur dans le jeu.

Pour cela, on doit d’abord ajouter le mot « eat » dans le tableau de la classe CommandWords, de manière à ce que le mot soit reconnu par le programme.

On doit également ajouter une procédure eat() à la classe Game qui sera appelée lors de la reconnaissance par CommandWords du mot « eat ». Cette dernière affiche le message suivant :

(13)

Enfin, on doit ajouter dans la Classe Game et plus précisément la fonction processCommand() la condition d’appel de la méthode eat().

Enfin, on vérifie le bon fonctionnement de l’utilisation du mot et de l’appel de la méthode qui en résulte.

Ex 7.16: showAll, showCommand( )

Réponse :

On ajoute la méthode showAll() à la classe CommandWords. Elle a pour objectif d’afficher les commandes lisibles par le terminal, en se mettant à jour automatiquement (on n’a plus à modifier la méthode

printHelp() de la classe Game à chaque fois que l’on ajoute un nouveau mot dans le tableau de la classe CommandWords.

Puis plutôt que d’afficher les mots de commande comme dans le commentaire de la méthode printHelp() de la classe Game, on appelle dans cette méthode la méthode showCommands() de la classe Parser.

L’explication de la raison de ce choix de ne pas lier la classe Game à la classe CommandWords est dans le paragraphe suivant.

Pour limiter le couplage de la classe Game, et pour ne pas à avoir à créer un lien direct entre la classe Game et la classe CommandWords, on décide d’implémenter une méthode showCommands() dans la classe Parser afin d’appeler la méthode shawAll() de la classe CommandWords.

(14)

Néanmoins, on rencontre une erreur : on doit mettre la méthode shawAll() de la classe CommandWords en static. Cette méthode doit être statique car on appelle une méthode d’une autre classe sans forcément utiliser un objet de cette autre classe. C’est ce qui explique cette erreur signalée par le ompilateur de Bluej. Cela résout les erreurs de compilation. On peut ainsi tester son bon fonctionnement, on voit bien la nouvelle commande « eat » apparaître dans les « command words » (cf. encadré orange ci-dessous).

Ex 7.17: Ajout d’un nouveau mot commande (Optionnel).

Réponse :

Si l’on ajoute un nouveau mot de command dans le tableau aValidCommands[], on n’a pas besoin de modifier la méthode printHelp(), puisqu’elle appelle la méthode showCommands() de la classe Parser et qui appelle elle-même la méthode showAll() comme nous l’avons vu dans l’exercice 7.16.

Néanmoins, l’automatisation se fait seulement pour la méthode printHelp() ; on doit néanmoins continuer de mettre à jour la fonction processCommand().

Références

Documents relatifs

Après avoir lu et bien compris la leçon sur les accents, tu recopies ces exercices sur ton cahier du jour... 1)Ecris ces mots en ajoutant les accents aigus

 Il y a donc proportionnalité lorsque tous les couples de nombres (non nuls) qui se correspondent donnent le même quotient. Si les points marqués sur un graphique sont alignés

Travail préalable : En petit groupe, jeu d’association trace/animal en s’aidant du nom inscrit+ jeux mémory Consigne : Découpe et colle les animaux et associe-les à leurs traces

PAR M. On sait que la méthode de Newton est quelquefois en défaut, c'est-à-dire que la correction qu'elle fournit, ajoutée à la première valeur approchée de la racine,

» les astronomes , sous le titre de Grand Sindhind.. Tare égal à ce sinus, qui formait un élément fondamental dans la construction de la Table indienne, et qu'on a Uni par donner

1) Réalisation du DCF : diagramme conceptuel des flux. Il va permettre d’analyser les flux en entrée et en sortie de l’entreprise. Le tableau des opérations permet

La vitesse moyenne d’un mobile sur une distance et pendant une durée est une vitesse fictive vitesse fictive vitesse fictive vitesse fictive correspondant à la

[r]