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.