Projet Java PR102 GROUPE 9L

Transcription

Projet Java PR102 GROUPE 9L
Projet Java PR102 GROUPE 9L
Auteur
TA Kévin et Cindy Piquet
Scénario
Un homme de la résistance doit enquêter sur un nouveau membre de la
résistance sur ordre du chef. Celui-ci va découvrir en le suivant qu’il est un
traitre et qu’il projette d’assassiner « De Gaulle » pour mettre un terme à la
résistance. Le héros devra récolter des indices sur ce membre en parlant avec
des personnes et en fouillant des lieux afin de découvrir les plans du traitre et
de le retrouver à son appartement avant qu’il n’accomplisse son méfait.
Les lieux disponibles sont : La planque, le cabaret, le bar, le vendeur d'arme, la
soupe populaire et l'appartement.
Les objets disponibles sont : La carte, le pistolet, le cookie, le téléporteur, le
planning et l'adresse.
Pour gagner, le joueur devra tuer le traitre après avoir trouvé tous les items. Si
le temps imparti expire, le joueur a perdu.
Plan du jeu
Détail des lieux
Sur le plan du jeu ci-dessus, vous trouverez les détails des lieux. Vous avez en
tout 9 pièces et 8 items. La répartition des objets dans chaque pièce est
indiquée en haut. La trapdoor se situe au niveau de la pièce Traitor où se situe
le boss. Le joueur commence le jeu dans la pièce Hideaway.
Réponse à l’exercice 7.1
L’application crée un jeu nommé Zuul. Le jeu accepte les commandes de
direction et d’aide (go, quit, help). Go permet de se déplacer dans le jeu, Quit
permet de le quitter, et Help permet de recevoir la liste des commandes. Il y a
5 pièces d’après le code source.
Réponse à l’exercice 7.2
La classe CommandWords recense les mots-clés autorisés et détermine si une
commande de l'utilisateur est valide.
La classe Command engendre une commande de l'utilisateur.
La classe Room permet de créer les pièces du jeu, une pièce représente une
scène.
La classe Parser permet de lire le texte entré par l'utilisateur et le transforme
en commande. La classe Game est la classe principale du jeu (méthode play).
Réponse à l’exercice 7.2.1
System.in désigne le clavier (comme System.out désigne l'écran)
Il faut créer un objet Scanner en lui passant le clavier en paramètre :
Scanner vScan = new Scanner( System.in );
Pour pouvoir compiler, il faut indiquer au compilateur où se trouve la classe
Scanner :
import java.util.Scanner;
Il faut créer une String pour contenir les caractères qui seront tapés au clavier :
String vLigne;
Ensuite, à chaque fois qu'on écrira l'instruction
vLigne = vScan.nextLine();
toute la ligne de caractères tapés au clavier sera stockée dans vLigne
En attendant que des caractères soient tapés au clavier, le programme reste
bloqué. Il est donc indispensable de prévenir l'utilisateur de ce qu'on attend de
lui, en affichant quelque chose comme "Veuillez taper une commande : " ou
plus simplement "> "
Réponse à l’exercice 7.5
Il faut implémenter cette méthode dans la classe « game » :
private void printLocationInfo()
{
System.out.println("Vous êtes " + currentRoom.getDescription());
System.out.print("Les sorties : ");
if(currentRoom.northExit != null) {
System.out.print("north ");
}
if(currentRoom.eastExit != null) {
System.out.print("east ");
}
if(currentRoom.southExit != null) {
System.out.print("south ");
}
if(currentRoom.westExit != null) {
System.out.print("west ");
}
System.out.println();
Pour appeler cette méthode, on recherche dans les méthodes « goRoom » et
« printWelcome » les paragraphes redondants que l’on remplace par this.
printLocationInfo() ;
Réponse à l’exercice 7.6
On ajoute une méthode « getExit » dans la classe « Room » pour déplacer le
paragraphe :
public Room getExits(String direction)
{
if(direction.equals("north"))
return northExit;
if(direction.equals("east"))
return eastExit;
if(direction.equals("south"))
return southExit;
if(direction.equals("west"))
return westExit;
return null;
}
On soulage ainsi le code de la classe « game » avec cette unique ligne :
Room nextRoom = currentRoom.getExits(direction);
Réponse à l’exercice 7.7
Je soulage la méthode « printLocationinfo » de ce paragraphe :
System.out.print("Les sorties : ");
if(currentRoom.northExit != null) {
System.out.print("north ");
}
if(currentRoom.eastExit != null) {
System.out.print("east ");
}
if(currentRoom.southExit != null) {
System.out.print("south ");
}
if(currentRoom.westExit != null) {
System.out.print("west ");
}
Et à la place, j’appelle une méthode de la classe « Room » :
public String getExitString()
{
String exitString = "Exits: ";
if(northExit != null)
exitString += "north ";
if(eastExit != null)
exitString += "east ";
if(southExit != null)
exitString += "south ";
if(westExit != null)
exitString += "west ";
return exitString;
}
Cet algorithme me permet de définir les sorties d’une salle. != correspond à
une inégalité, et += me permet de stocker la valeur de droite dans celle de
gauche. Ainsi, je définis une String exitString qui va tester toutes les valeurs
possibles. Si par exemple, la sortie « North » n’est pas nulle, extString prendra
la valeur North et ainsi de suite afin d’afficher une liste de sortie possible.
Réponse à l’exercice 7.8
Dans la classe « Room », nous modifions cette méthode :
public void setExits(Room north, Room east, Room south, Room west)
{
if(north != null)
northExit = north;
if(east != null)
eastExit = east;
if(south != null)
southExit = south;
if(west != null)
westExit = west;
}
Par celle-ci :
public void setExit(String direction, Room neighbor)
{
exits.put(direction, neighbor);
Je peux maintenant définir un lieu par direction à la place de définir les lieux
par les directions possibles.
lab.setExits(outside, office, null, null); devient :
lab.setExit("north", outside);
lab.setExit("east", office);
Réponse à l’exercice 7.8.1
Il suffit de rajouter la direction « haut » et « bas » :
office = new Room("in the computing admin office");
cellar = new Room("dans la cave");
cellar.setExit("haut", office);
office.setExit("bas", cellar) ;
Réponse à l’exercice 7.9
Le KeySet contient toutes les clés de la HashMap.
Réponse à l’exercice 7.14
Il suffit d’ajouter cette méthode dans la classe « Game » :
private void look()
{
System.out.println(currentRoom.getLongDescription());
}
Ainsi que la ligne :
else if (commandWord.equals("look"))
look();
Ainsi, quand le joueur entrera la commande look, le jeu lui donnera une
description de la pièce courante.
Réponse à l’exercice 7.15
On ajoute la commande eat qui permet d’afficher un message spécifique à
l’écran.
Réponse à l’exercice 7.16
J’ai remplacé l’ancien système commande par une boucle for afin de lister les
commandes de manière plus aisé.
Réponse à l’exercice 7.17
Plus besoin de modifier la classe Game car dorénavant, il nous suffit d’ajouter
la commande dans la classe correspondante et la boucle for va la gérer d’ellemême.
Réponse à l’exercice 7.18
getCommandList retourne une string avec les toutes les commandes du jeu.
Réponse à l’exercice 7.20
La classe Item va nous permettre d’inclure des objets dans notre jeu avec un
nom et un poids spécifique
Réponse à l’exercice 7.21
J’ai inclus dans la classe Item une string qui va permettre à la classe Game de
retourner la description d’un item.
Réponse à l’exercice 7.22
Chaque pièce possède une collection nommée items qui lui est spécifique. La
classe Room a été modifié afin d’ajouter un objet dans une salle à l’aide de la
méthode addItem().
Réponse à l’exercice 7.23
En entrant la commande back, le joueur retourne dans la pièce précédente
mais seulement une seule fois.
Réponse à l’exercice 7.26
A l’aide d’un stack nommé roomHistory qui fait office d’historique des salles
précédemment visitées, le joueur pourra retourner jusqu’à la 1ere salle visité.
Réponse à l’exercice 7.28.1
La commande test interprète un fichier texte contenant toutes les commandes
à effectuer dans l’ordre afin de finir le jeu. Cette commande permet
notamment de créer un parcours.
Réponse à l’exercice 7.29
La classe Player va nous permettre de gérer toutes les informations concernant
le joueur. Cela inclut son nom, son inventaire…
Réponse à l’exercice 7.30
J’ai inclus deux commandes take et drop afin que le joueur puisse ramasser des
items et les mettre dans son inventaire ou bien de les jeter de son inventaire.
Je supprime l’objet de la collection items et je l’inclus dans inventory et
inversement.
Réponse à l’exercice 7.31
La classe ItemList va nous permettre de créer les différentes collections
d’items, ce qui inclut items et inventory.
Réponse à l’exercice 7.32
L’attribut MaxWeight a été créé dans le but de limiter le nombre d’items
possible dans l’inventaire.
Réponse à l’exercice 7.33
A l’aide de ItemList, j’ai généré une collection nommé inventory. Je peux ainsi
visualiser mon inventaire à l’aide d’une commande ainsi que le poids total de
mon inventaire.
Réponse à l’exercice 7.34
Le magic cookie permet d’augmenter la taille de l’inventaire, il faut le ramasser
dans un lieu spécifique et, grâce à la commande eat, vous pourrez le manger.
La commande eat va vérifier si vous possédez ou non le cookie dans
l’inventaire, auquel cas, elle vous enverra un message d’erreur.
Réponse à l’exercice 7.42
Un timer a été inclus à l’aide de l’attribut TimeLimit et currentTime qui va
compter le nombre de commandes effectués par le joueur.
Réponse à l’exercice 7.43
Pour créer une trapdoor, j’ai créé une pièce qui est franchissable dans une
direction seulement afin d’empêcher le retour en arrière. Je peux prendre en
exemple la salle du boss.
Réponse à l’exercice 7.44
Le beamer permet de se téléporter en chargeant cet item à l’aide d’une
commande. On pourra alors aller dans la pièce à le beamer a été chargé, à
l’aide d’une commande fire.
Réponse à l’exercice 7.46
Grace à la pièce transporter room, le joueur va pouvoir se téléporter
aléatoirement dans une des pièces du jeu. J’associe une pièce à un numéro
avec une HashMap et la commande random me renvoie un numéro aléatoire.
Le joueur est alors téléporté dans la salle choisie. Ceci va me permettre de
simuler un état d’ivresse après un passage au bar. Malheureusement, j’ai eu
des difficultés avec la mise en place de cette fonction. Je n’ai donc que la classe
RandomRoom.
Réponse à l’exercice 7.46.1
Alea string va me permettre de forcer un numéro et alea va me permettre de
retrouver le caractère aléatoire. Même difficultés que le 7.46.
Réponse à l’exercice 7.47
Ajout de la conception de Zuul Even Better dans le projet. CommandWords
listes toutes les commandes afin de rendre les commandes valides. Ces
commandes sont alors écrites dans une classe différente et distincte. La classe
abstraire permet de gérer le second mot et d’exécuter la commande. Il faut
alors créer un attribut Player player dans GameEngine afin de rendre la
conception valide.
Réponse à l’exercice 7.47.1
Création des paquetages pkg_commands et pkg_game.
Réponse à l’exercice 7.48
Création de la classe Character afin de créer les différents personnages de mon
jeu.
Réponse à l’exercice 7.53 et 7.54
Implémentation de la méthode main() dans Game qui permet de lancer le jeu
sans IDE, donc sans BlueJ.
Source
Cette classe permet de lancer le projet. La plupart des classes et méthodes sont
tirés des exemples donnés dans les livres. J’ai également reçu l’aide du coach
concernant la commande de test. Afin de finaliser mon projet, j'ai demandé
l'aide d'Aroquiaradja Edouard en E2 concernant la complétion de la classe
Player avec son attribut player, le débugging des différentes commandes du jeu
dans le pkg_commands ainsi que les méthodes permettant de parcourir
l'ArrayList afin de trouver un objet Item ou Character. Pour le GUI, le groupe de
POON et LA groupe 9 E1 m’a indiqué la marche à suivre pour afficher mon
nouveau panel d’inventaire. Je me suis également inspiré des travaux de
BLONDIAU Rémy et Charles Athlan pour la classe RandomRoom bien qu’elle ne
fonctionne pas.