Rapport
Transcription
Rapport
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
Ciras’ Quest
L’objectif de ce projet A3P est d’apprendre le langage de
programmation JAVA par la création d’un jeu vidéo seul ou
en binôme. Notamment grâce au chapitre 7 du livre Objects
first with Java de David J. Barneset Michael Kolling. Ce
rapport vise à définir le scénario de notre jeu mais aussi à
expliquer les exercices réalisés et incorporés dans notre jeu.
Site Internet du jeu
http://esiee.fr./~yanv
Ciras’ Quest
Page 1
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
I.1) Auteurs
YAN Victor
PERRIER Alexandre
I.2) Thème (phrase type)
Dans une contrée imaginaire, le seul survivant du massacre de son
village doit tuer le chef ennemi.
I.3) Résumé du scénario (complet)
Ciras, héros du jeu, voit à son retour de la chasse, son village dévasté
et en cendre. Au loin, le chef des bandits du village revendique ce
désastre et incite Ciras à venir le voir dans son antre. Pour venger
l’honneur de son village, Ciras doit récupérer 5 items (casque, armure,
épée, bouclier et bottes) ainsi que 3 bonus (bonus de vitesse, bonus
de force et bonus de super force). Ces objets sont dispersés dans
toute la carte du jeu. Ces items collectés, il doit passer les gardes qui
surveillent le château ennemi pour ensuite vaincre son pire ennemi,
Torik.
I.4) Plan (complet)
Ciras’ Quest
Page 2
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
I.5) Scénario (complet)
Ciras se retrouve dans une première forêt. Pour commencer son
périple, il doit se diriger vers la gauche (west). Il voit alors son village
dévasté mais aussi deux items, les bottes et le bonus vitesse, qui sont
de l'autre côté de la rivière. Ces objets sont pour l'instant
inaccessibles. Ciras se dirige alors au nord. Il se retrouve devant une
intersection. S’il le décide, il peut aller visiter la forêt de la sorcière à
l'est et manger sa pomme. Ainsi, son inventaire grandit et peut
contenir plus d’éléments. En continuant son aventure, Ciras se dirige à
Little Town au nord.
Trois chemins s'offrent à lui, le nord, l'est et l'ouest. La foret des
crânes se trouve à l'est. S’il répond correctement à sa réponse, il aura
alors accès à la fameuse épée de Feu. Ciras décide d'aller à l'est pour
rendre visite à l’Hermite. Dans sa foret se trouve un nouvel objet de
quête, le casque ! En parlant à l’Hermite, Ciras sait maintenant nager
dans les cours d'eau. Ainsi il peut récupérer les deux objets qui se
trouvaient dans son village. En héros observateur, il remarque que la
rivière qui se situe avant la forêt de l'hermite est suspecte. Il nage
alors pour aller jusqu'au nord et trouve le bouclier Ancestral ainsi que
le bonus de super force. Toujours grâce à ses talents de chasseur,
Ciras remarque le bonus de force qui se trouvait à l'intersection avant
Little Town. Il ne lui manque plus qu'un seul item, l'armure dorée !
Elle se trouve au nord-est de Little Twon, au milieu du Lac Sacré.
Maintenant, Ciras peut enfin passer les gardes pour se rendre
dans le labyrinthe de la Montagne, dernière épreuve avant d'affronter
Torik. En passant par l'ouest et en longeant les murs jusqu'au nord,
Ciras trouve enfin la sortie ! Désormais, Torik, chef des bandits,
criminelle sans cesse rechercher se trouve devant lui. En répondant
correctement à ses trois questions, Torik avoue que les gens du village
de Ciras se trouve au sud-ouest de Little Twon, derrière les arbres
dorés...
C'est ainsi que Ciras vainquit Torik et retrouva ses bien-aimés...
I.6) Lieux, Items, personnages
15 rooms : Foret initiale, village de Ciras, Plaine de Little Twon, Foret
de la sorcière, la forêt caché, LittleTown, la forêt des cranes, la rivière
de l'Hermite, la foret de l'Hermite, l'île cachée, la plaine dévastée, le
Ciras’ Quest
Page 3
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
Lac Sacré, Le Couloir du Labyrinthe, le Labyrinthe de la Montagne, le
château de Torik.
10 items : la casque, l'armure, l'épée, le bouclier, les bottes, la
pomme, une clé, le bonus vitesse, le bonus de force, le bonus de super
force.
19 personnages : Ciras, Torik, l'Hermite, la Sorcière, les 2 gardes, les 5
sbires de Torik, les 8 villageois.
I.7) Situations gagnante et situation perdante
Situation perdante :
-Le joueur répond mal aux questions posées par le crâne.
-Mort au bout de 100 déplacements ( improbable )
-Fin du temps imparti dans The Deadly Labyrinth.
Situation gagnante : Le joueur répond correctement aux questions de
Torik.
I.8) Enigmes
Penses-tu être assez fort pour me battre ?
Combien y a-t-il d’arbres dorés dans la troisième room ?
Combien y a-t-il de ruines en feu dans le village de Ciras ?
Donne le prénom d’un des deux développeurs du jeu !
II. Réponses aux exercices
7.0 Page web du jeu
http://esiee.fr./~yanv
7.1 Découverte de « Zuul-Bad »
Que fait cette application ?
Ciras’ Quest
Page 4
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
L’application ouvre une fenêtre textuelle d’où l’on rentre des
commandes pour naviguer dans le jeu.
Quelles commandes le jeu accepte-t-il ?
Le jeu accepte les commandes : “help”, “go”, “quit”.
Que fait chaque commande ?
Help : Cette commande permet de connaitre la situation géographique
du joueur dans le jeu ainsi que les commandes possibles.
Go : se déplacer dans les 4 directions cardinales ( si les
sorties/entrées existent dans la room actuelle)
Quit : termine le jeu.
Combien y a-t-il de pièces dans le jeu ?
Le jeu contient 5 pièces.
7.1.1 - Choix du thème
Dans une contrée imaginaire, le seul survivant du massacre de son
village doit tuer le chef ennemi.
7.2 - Rôles des classes
Parser : cette commande permet de lire le texte entré par le joueur et
le transforme en en commande ( si la commande est connue )
Command : crée une commande tapée par le joueur.
Game : classe principale du Zuul-Bad.
Room : représente les pièces ( rooms ) du jeu, en fonction des entrées
et sorties.
CommandWords : recense les mots-commandes autorisés et exécute
cette commande si elle est présente dans le tableau d’objets.
7.2.1 - Classe Scanner
A SAVOIR EXPLIQUER
La classe Scanner récupère les données entrées et tapées sur le
clavier par le joueur. On crée dans le code un objet scanner qui
récupère les entrées saisie en passant le clavier en paramètre :
Scanner vScan = new Scanner ( System.in );
(System.in) est pour le clavier.
(System.out) est pour l’écran.
Il faut tout d’abord importer la classe scanner par :
Ciras’ Quest
Page 5
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
import.java.util.Scanner
7.3.2 Plan du jeu
Création du plan du jeu avec 15 rooms ayant au minimum une
sortie/une connexion.
7.4 Zuul-v1, rooms , exits
Modification de createRooms() se situant dans la classe Game :
Par l’ajout/modification des 15 rooms : Foret initiale, village de
Ciras, Plaine de Little Twon, Foret de la sorcière, la forêt caché, Little
Town, la forêt des cranes, la rivière de l'Hermite, la foret de l'Hermite,
l'île cachée, la plaine dévastée, le Lac Sacré, Le Couloir du
Labyrinthe, le Labyrinthe de la Montagne, le château de Torik.
Respectant les entrées et sorties en accord avec le plan du jeu :
7.5 printLocationInfo
Procédure dans la classe GameEngine reprenant le code des méthodes
currentRoom() et goRoom()
7.6 getExit()
Ajout de l’accesseur getExit() dans la classe Room permettant
d’obtenir les sorties possibles de la room actuelle.
7.7 getExitString
Modification dans la méthode printLocationInfo de la classe Game et
ajout de la méthode dans la classe Room.
7.8 HashMap, setExit
Modifier la classe Room par l’introduction de l’outil HashMap
7.8.1 Déplacement vertical
Déplacement vertical descendant dans la room 9
Ciras’ Quest
Page 6
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.9 keySet
Objet de type HashMap permettant d’accéder à la liste des clés de la
HashMap
public String getExitString()
{
String returnString = “Exits:”;
Set<String> keys = exits.keySet();
for ( String exit : keys){
returnString += “ ”+ exit;
return returnString ;
}
7.10 getExitString
Méthode renvoyant une description des sorties actuelles de
la room
HashMap : Tableau associatif dont les clefs sont associées à un
ensemble correspondant de valeurs. Chaque clef est associée à une
valeur, formant des paires de manière {(clé,valeur)}.
keySet() : méthode qui retourne l’ensemble des clefs de la HashMap.
Set : ensemble qui ne peut pas comporter deux fois le même élément.
7.10.1 Compléter la JavaDoc // 7.10.2 Générer la JavaDoc
Générer la JavaDoc complète et remplie pour chaque méthode et
chaque classe sur la page internet du jeu.
7.11 getLongDescription
- Ajout de la méthode getLongDescription dans la classe Room
donnant une description de la room actuelle.
public String getLongDescription()
{
return "You are " + this.aDescription + ".\n " + getExitString();
}
- Modification de la méthode printLocationInfo
7.14 Commande look
private void look ()
Ciras’ Quest
Page 7
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
{
System.out.println( player.getCurrentRoom().getLongDescription());
System.out.println("Your current weight is " +
player.getCurrentWeight());
System.out.println("Your maximum weight is " +
player.getmaximumWeight());
}
Méthode look() dans la classe Game qui permet d’obtenir les
informations sur le player mais aussi sur la room actuelle. Cette
méthode fait appel aux méthodes getCurrentRoom et
getLongDescription. On ajoute donc le commande look dans la classe
CommandWords.
private void look ()
{
System.out.println( player.getCurrentRoom().getLongDescription());
}
7.15 Commande eat
Méthode eat() dans la classe Game qui permet d’utiliser les objets tels
que « pomme » afin de modifier le player ( exemple : « eat apple »
=> « You just ate an apple... wait what? What's happening? It seems
that my inventory size has increased, great !” ). Cette méthode fait
appel aux méthodes getInventory et getLongDescription. On ajoute
donc la commande eat dans la classe CommandWord. De la même
manière que pour la commande look, on ajoute la commande eat dans
la méthode interpretCommand() dans la classe Game.
7.16 showAll, showCommands
La méthode showAll ajouté dans la classe CommandWords permet
d’afficher les commandes valides à rentrer dans le terminal, présentes
dans le tableau validCommands.
public void showAll()
{
for ( String command : validCommands) {
System.out.println(command + ‘’ ‘’ ) ;
}
System.out.println();
}
private void printHelp()
{
Ciras’ Quest
Page 8
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
System.out.println("You are still searching for your biggest
ennemy. Your command words are:");
aParser.showCommands();
}
Pour obtenir les commandes utilisables par le joueur, on
implémente ce code dans la Game.
A savoir expliquer
La boucle for each s’utilise pour parcourir une collection.
o for ( typeElement vElement : tableau)
s’utilise pour parcourir un tableau et d’afficher les éléments présent
dans ce même tableau
typeElement : type de la variable
vElement : nom qui désigne les éléments du tableau étudié
tableau : nom du tableau étudié
o for ( TypeElement vElement : ensemble)
typeElement : type de la variable
vElement : nom qui désigne les éléments de l’ensemble étudié
7.18 getCommandList
On modifie la méthode showAll() par getCommandsList() tel que :
public void getCommandsList()
{
for(String command : validCommands) {
System.out.print(command+ ‘’ ‘’) ;
}
}
7.18.1 Zuul-Better
Pas de changement dans les classes Room, Parser, CommandWords et
Command si ce n’est les changements déjà spécifiés.
Zuul-Better a remplacé la méthode void printLocationInfo() par la
méthode System.out.println(currentRoom.getLongDescription()) ;
7.18.2 Stringbuilder
Stringbuilder implémenté dans la méthode getExitString de la classe
Room permet de modifer les String
public String getExitString()
{
StringBuilder vSorties = new StringBuilder ("Exits :");
Ciras’ Quest
Page 9
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
Set<String> keys = exits.keySet();
for ( String exit : keys)
vSorties.append(" " + exit);
return vSorties.toString();
}
7.18.3 Chercher des images
Création des images grâce à une interface graphique propre
7.18.4 Titre du jeu
Ciras’ Quest
7.18.5 Objet Room
7.18.6 Zuul-with-images
Après comparaison avec notre projet actuel qui utilise aussi une
interface graphique élaborée, nous avons crée trois nouvelles classes
grâce à cette comparaison:
-UserInterface qui gère tout type d’interface graphique mais aussi des
divers événements.
-GameEngine qui permet au jeu de fonctionner. Cette classe appel à
toutes les classes déjà crées. Par comparaison avec Zuul-with-images,
nous avons instaurer un nouvel attribut gui, de type UserInterface.
-Game qui permet de lancer le jeu.
7.18.7 addActionListener() / actionPerformed()
actionPerformed() est appelée automatiquement lorsque entryField
est stimulé. Elle consiste à appeler la méthode processCommand()
dans le corps
7.18.8 Ajouter au moins un bouton
Ajout d’un seul bouton HELP grâce aux imports :
Ciras’ Quest
Page 10
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
public class UserInterface implements ActionListener
{
private GameEngine engine;
private JFrame myFrame;
private JTextField entryField;
private JTextArea log;
private JLabel image;
private JButton boutonHelp;
/**
* Construct a UserInterface. As a parameter, a Game Engine
* (an object processing and executing the game commands) is
* needed.
*
* @param gameEngine The GameEngine object implementing the
game logic.
*/
public UserInterface(GameEngine gameEngine)
{
engine = gameEngine;
createGUI();
}
Après avoir crée GUI, notre interface graphique, on ajoute désormais
notre bouton:
private void createGUI()
{
myFrame = new JFrame("Ciras' Quest");
entryField = new JTextField(34);
boutonHelp = new JButton("Help");
[…]
/**
* Actionlistener interface for entry textfield.
*/
public void actionPerformed(ActionEvent e)
{
// no need to check the type of action at the moment.
// there is only one possible action: text entry
if (e.getSource() == entryField) {processCommand();}
if (e.getSource() == boutonHelp) {
engine.interpretCommand("help");
Ciras’ Quest
Page 11
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
}
}
A savoir expliquer
ActionListener() : interface qui permet de gérer les évènements
addActionListener() : interface qui permet de détecter les événements
( phrase d’action rentrées dans la boite de commande par exemple )
actionPerformed() si un événements est détecté, cette méthode
applique les instructions correspondantes au type d’action demandé
par le joueur.
ActionEvent classe qui permet de savoir si un événement se produit
getActionCommand() getter qui permet de retourner la commande de
l’action
getSource() getter qui permet de connaitre l’objet de l’événement
7.19
Movie-View-Controller
Le patron modèle-vue-contrôleur tout comme les patrons modèle-vueprésentation ou Présentation, abstraction, contrôle, est un modèle
destiné à répondre aux besoins des applications interactives en
séparant les problématiques liées aux différents composants au sein
de leur architecture respective.
Selon Wikipedia.
7.19.1 Zuul-MVC
Comparaison du projet actuel avec Zuul-MVC
7.19.2 Déplacer toutes les images
Chaque room à sa propre image placée dans un dossier ressource. Les
différents objets placés dans l’interface graphique se trouve dans le
fichier test.png.
Ciras’ Quest
Page 12
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.20 Item
Création de la classe Item avec 2 attributs ( aItemsWeight et
aItemsDescription ) :
public class Items
{
private String aItemsDescription;
private int aItemsWeight;
public Items(final String pItemsDescription, final int pItemsWeight )
{
this.aItemsDescription = pItemsDescription;
this.aItemsWeight = pItemsWeight;
}// fin constructeur naturel ItemWeight ItemDescription.
Création de 2 getters pour ces 2 attributs :
public int getWeight ()
{
return this.aItemsWeight;
}
public String getDescription ()
{
return this.aItemsDescription;
}
Création de 2 setters pour ces 2 attributs :
public void setDescription(final String pDescription)
{
this.aItemsDescription = pDescription;
}
public void setWeight (final int pWeight)
{
this.aItemsWeight = pWeight;
}
Dans la classe Room:
Ciras’ Quest
Page 13
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
Les Items se trouvent dans les rooms du jeu, il est ainsi impératif de
modifier la classe Room du Zuul
Création d’un attribut private HashMap<String, Items> objet;
Déclaration de la collection “objet” objet = new HashMap<String,
Items> ();
Modification de getLongDescritpion
public String getLongDescription()
{
return "You are " + this.aDescription + ".\n " + getExitString() +
".\n" + getItemString();
}
Implémentation de 2 autres méthodes getItemsDescription et
itemDescritption (décrites dans l’exercice 7.21)
Méthode getItemString qui permet de connaitre les différents objets
de la room actuelle:
public String getItemString ()
{
StringBuilder returnString = new StringBuilder( "There are the
following items in this room : " );
for ( String vS : objet.keySet() )
returnString.append( vS + " - ");
return returnString.toString();
}
Dans la classe GameEngine:
Création d’une collection d’items
private void createItems()
{
this.AllItem = new HashMap<String,Items>();
[…]
Implémentation des items en fonction de leur emplacement dans le
jeu suivant ce modèle ( item “cookie” dans la premiere room du jeu
this.allRooms.get(1).addItem("cookie", cookie);
Appel de la méthode createItems() dans le constructeur de
GameEngine
public GameEngine() {
aParser = new Parser();
Ciras’ Quest
Page 14
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
createItems()
}
7.22 items
Utilisation d’une HashMap ( exemple : (“epee”, epee); ) qui associe
des clés String aux Items du jeu précedement crées
7.22.1 Justification du choix
Une HashMap permet de regrouper ici tous les items et permet de
récupérer les données voulues en fonction de données spécifiques.
7.22.2 Intégrer les items
Objets de quête : casque, armure, épée, bouclier, bottes, bonus
vitesse, bonus de force, bonus de super force.
Objets secondaire : beamer, palmes, pomme ( magic cookie )
7.23 back & Stack
Classe GameEngine
Ajout de l’attribut Room previousRoom sous forme de Stack
Cette instruction permet de revenir dans la room précédente d’où
l’utilisation d’une Stack
Ajout du mot "back" dans le tableau de Strings validCommands
Room aPreviousRooms = new Stack<Room>;
private void back ()
{
if (! this.aPreviousRooms.empty() )
{
aPlayer.setCurrentRoom(this.aPreviousRooms.pop());
pkg_game.Game2DEngine.getPlayer().changelevel(
this.aPlayer.getCurrentRoom().getNumber());
}
else this.aPreviousRoom = this.aPlayer.getCurrentRoom();
gui.println("\n"+this.aPlayer.getCurrentRoom().getLongDescription()+"\n"
);
}
Ciras’ Quest
Page 15
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.26.1 Générer les 2 javadocs
Création des fichiers JavaDocs
7.28.1 test
Remplissage des fichiers test.
go
go north
go south
go west
go east
eat
look
back
help
Procédure test :
private void test(Command pCommand)
{
Scanner scan= null;
if (! pCommand.hasSecondWord()) {
gui.println("\nWhich file do you want to open ?\n");
return;
}
String fichier = pCommand.getSecondWord();
try {scan = new Scanner(new File("./" + fichier+".txt"));}
catch (java.io.FileNotFoundException pException) {
gui.println("File not found.");
return;}
while (scan.hasNextLine()) {
String ligne = scan.nextLine();
interpretCommand(ligne);
}
scan.close();
}
Ciras’ Quest
Page 16
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.29 Classe Player
3 attributs Room aCurrentRoom, double aMaximumWeight,
previousRoom
Constructeur naturel
public PlayerBis()
{
this.aCurrentRoom = null;
previousRoom = new Stack<Room>();
this.maximumWeight = 10;
}
1 getter getCurrentRoom()
1 setter setCurrentRoom()
Dans la classe GameEngine:
creation d’un nouvel attribut aPlayer
private void createPlayer()
{
player = new PlayerBis();
}
Les méthodes de GameEngine utilise désormais l’attribut
aCurrentRoomsur sur aPlayer:
aPlayer.setCurrentRoom() par exemple
7.30 / 7.31 take / drop items
Ajout d’un attribut de type HashMap<String, Item> aInventory pour
répertorier les items pris par le joueur dans le jeu.
Initialisation de cet attribut dans le constructeur de la classe Player()
Ajout de getInventory
Dans le constructeur :
this.aInventory = new HashMap<String, Items>();
Ajout de getInventory()
Ciras’ Quest
Page 17
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
public HashMap<String, Items> getInventory()
{
return this.aInventory;
}
/**
* Ajoute un item à l'inventaire
* @param pName le nom de l'item
* @param pItem l'Item
*/
public void addInventory(final String pName, final Items pItem)
{
this.aInventory.put(pName, pItem);
}
/**
* Enlève un item à l'inventaire
* @param pName le nom de l'item
*/
public void removeInventory(final String pName)
{
this.aInventory.remove(pName);
}
Ajout de la méthode take():
private void take(Command command)
{
if(!command.hasSecondWord()) {
gui.println("What do you want to take?");
}
else {
String objet = command.getSecondWord();
Items newItem =
this.player.getCurrentRoom().getItems().get(objet);
if ( newItem == null)
{
gui.println("This item isn't in this room ! :(");
}
else {
Ciras’ Quest
Page 18
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
if((newItem.getWeight() + player.getCurrentWeight() >
player.getmaximumWeight()))
{
gui.println("This item is way too heavy for you, you should drop
something if you really want to take that item.");
}
else
{
player.setCurrentWeight(player.getCurrentWeight()+newItem.getW
eight());
player.addInventory(objet,newItem);
player.getCurrentRoom().getItems().remove(objet);
gui.println ("Hey ! You just took " + newItem.getDescription()+" !" );
}
}
}
}
Ajout de la méthode drop ():
private void drop(Command command)
{
if(!command.hasSecondWord()) {
gui.println("What do you want to drop? ");
}
else {
String objet = command.getSecondWord();
Items newItem = this.player.getInventory().get(objet);
if ( newItem == null)
{
gui.println("This item is not in your inventory.");
}
else {
player.getCurrentRoom().getItems().put(objet,newItem);
player.removeInventory(objet);
player.setCurrentWeight(player.getCurrentWeight()newItem.getWeight());
gui.println("You just dropped " + newItem.getDescription()+" !" );
}
}
}
Ciras’ Quest
Page 19
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.32 Maximum Weight
Ajout dans take de :
else {
if((vNewItem.getWeight() + this.aPlayer.getCurrentWeight() >
this.aPlayer.getmaximumWeight()))
gui.println("This item is way too heavy for you, you should drop something
if you \nreally want to take that item, or maybe you should see the witch.");
}
else
{ //can take
Dans le classe Player :
/**
* Retourne le poids maximum de l'inventaire
* @return aMaximumWeight le poids max
*/
public int getmaximumWeight()
{
return this.aMaximumWeight;
}
/**
* Modifie de poids maximum de l'inventaire
* @param pMaxWeight le poids max spécifié
*/
public void setMaximumWeight(final int pMaxWeight)
{
this.aMaximumWeight = pMaxWeight;
}
/**
* Modifie le poids actuel de l'inventaire
* @param pCurWeight le poids actuel que nous allons mettre
*/
public void setCurrentWeight (final int pCurWeight)
{
this.aCurrentWeight = pCurWeight;
}
/**
* retourne le poids actuel de l'inventaire
* @return aCurrentWeight le poids actuel
Ciras’ Quest
Page 20
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
*/
public int getCurrentWeight()
{
return this.aCurrentWeight;
}
7.33 Inventory
Ajout du mot de commande "inventory"
private void inventaire()
{
gui.println("You have in your inventory : "
+this.aPlayer.getItemString());
gui.println("Your current weight is " +this.aPlayer.getCurrentWeight());
gui.println("Your maximum weight is "
+this.aPlayer.getmaximumWeight());
}
7.34 magic cookie
Dans le projet, il est nécessaire de mentionner que le magic cookie qui
augmente aCurrentWeight est représenté par la pomme.
Création de la “pomme” dans la room 4 dans la procédure void
createItems():
Items pomme= new Items("a red apple", 1);
this.AllItem.put("apple", pomme);
this.allRooms.get(4).addItem("apple", pomme);
Ajout de l’instruction qui augmente aCurrentWeight dans la méthode
eat() ( cf exercice 7.15 )
private void eat (final Command pCommand)
{
if(!pCommand.hasSecondWord()) {
gui.println("What do you want to eat?");
}
else if (pCommand.getSecondWord().equals("apple") ){
player.setMaximumWeight(30);
Ciras’ Quest
Page 21
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
player.setCurrentWeight(player.getCurrentWeight()player.getInventory().get("apple").getWeight());
player.removeInventory("apple");
gui.println("You just ate an apple... wait what? What's
happening?");
gui.println("It seems that my inventory size has increased, great !");
} else {gui.println("Are you crazy? You can't eat this !"); }
}
//dans la classe player => modification de max’ weight
7.34.1 MàJ des fichiers txt
test provisoire :
take jaguarspirit
go west
take boots
go north
go east
take apple
eat apple
go north
load
fire
go east
talk
answer sdfsdf
answer Torik
take sword
go west
go west
go west
take helmet
take bearspirit
7.35 / 7.35.1 Zuul-with-enums-V1
Création de CommandWord ( enum )
public enum CommandWord
{
GO("go"), QUIT("quit"), HELP("help"), UNKNOWN("?"),
LOOK("look"), EAT("eat"), TAKE("take"), BACK("back"),
DROP("drop"), TEST("test"), INVENTORY("inventory"), LOAD("load"),
FIRE ("fire") ;
}
Ciras’ Quest
Page 22
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
Modification de l’ancien attribut String[] par un atttribut de type
HashMap HashMap<String,CommandWord> validCommands;
Constructeur de CommandWords():
public CommandWords()
{
validCommands = new HashMap<String, CommandWord>();
/*
validCommands.put("go", CommandWord.GO);
validCommands.put("help", CommandWord.HELP);
validCommands.put("quit", CommandWord.QUIT);
validCommands.put("look", CommandWord.LOOK);
validCommands.put("eat", CommandWord.EAT);
validCommands.put("back", CommandWord.BACK);
validCommands.put("take", CommandWord.TAKE);
validCommands.put("drop", CommandWord.DROP);
validCommands.put("test", CommandWord.TEST);
validCommands.put("inventory", CommandWord.INVENTORY);*/
for(CommandWord command : CommandWord.values()) {
if(command != CommandWord.UNKNOWN) {
validCommands.put(command.toString(), command);
}
}
}
Méthode isCommand mise à jour :
public boolean isCommand(String aString)
{
return validCommands.containsKey(aString);
}
Ajout de la méthode getCommandWord() :
public CommandWord getCommandWord(String commandWord)
{
CommandWord command = validCommands.get(commandWord);
if(command != null) {
return command;}
else {
return CommandWord.UNKNOWN;
}
}
Changement du type de commandeWord en CommandWord, donc
ainsi, le constructeur Command() est modifié
Ciras’ Quest
Page 23
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
public Command(final CommandWord pCommandWord, final String
pSecondWord)
{
this.aCommandWord = pCommandWord;
this.aSecondWord = pSecondWord;
}
Changement logique dans isUnknown()
public boolean isUnknown()
{
if(this.aCommandWord == CommandWord.UNKNOWN) return
true;
return false;
}
Modification de la méthode interpetCommand():
Command command = aParser.getCommand(commandLine);
Dans la classe UserInterface:
Modification dans la méthode actionPerformed
if (e.getSource() == boutonHelp) {
engine.interpretCommand("help");
}
7.35.2 switch
Dans la classe GameEngine:
on utilise switch dans la méthode interpretCommand() pour alléger le
codage des if/else if :
switch(commandWord)
{
case UNKNOWN : gui.println("Aucune commande n'est associée à
ce mot !"); break;
case HELP : printHelp(); break;
case GO : goRoom(command); break;
case LOOK : look();break;
case EAT : eat(command); break;
case BACK : back(); break;
case TAKE : take(command); break;
case DROP : drop(command); break;
case TEST : test(command); break;
case INVENTORY : inventaire(); break;
Ciras’ Quest
Page 24
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
case LOAD: loadBeamer(command); break;
case FIRE : fireBeamer(command); break;
case QUIT : vQuit= quit(command); break;
// default: gui.println("Aucune commande n'est associée à ce
mot !"); break;
}
7.37 Translate
L’implémentation d’une HashMap<String, CommandWords>
validCommands dans la classe CommandWords permet de répertorier
en tableau les Strings et de simplifier la recherche des commandes et
boutons valides. La traduction est donc par la même occasion
simplifiée.
7.38
Si l’on veut changer la String “help” en “aide”, la compilation
fonctionne mais le message d’introduction affiche toujours la String
“help”.
En effet, la méthode printWelcome() contient dans son corps “help”.
On fait alors appel à CommandWord.HELP qui redirige vers la String de
la fonction help correspondante. Toutefois, on doit déclarer un attribut
CommandWord aCommand dans le constructeur de GameEngine().
7.41.1 Zuul-with-enums-v2
On fait correspondre une String “HELP” dans le switch HELP(“help”)
De plus, dans le constructeur de CommandWords, on remplace la suite
de put par une boucle for ( comme indiqué dans Zuul-with-enums-v2 )
7.42 Time limit
Pour limiter le nombre de déplacement à 100:
int aTimeLimit; //attribute
this.aTimeLimit = 0;//dans le constructeur
private void checkTimeLimit()
{
if(this.aTimeLimit == 100)
{
Ciras’ Quest
Page 25
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
endgame(false);
}
else
this.aTimeLimit = this.aTimeLimit + 1;
}
Et finalement, l’appel de checkTimeLimit(); quand le joueur change de Room
(procédure goRoom())
7.42.1 Time Limit
/**
* Timer de 50 secondes du labyrinthe, si le délai est passé, le joueur perd.
* Besoin de l'utilisation d'un thread sinon la boucle while freeze le jeu.
*/
public void StartTimer()
{
Thread Timer = new Thread() {
public void run() {
long vBegin = System.currentTimeMillis();
long vCurrentTime = 0;
while (vCurrentTime - vBegin < 50000) {//50 secondes
vCurrentTime = System.currentTimeMillis();
}
if(aPlayer.getCurrentRoom() == aLevel15) //joueur est toujours dans
la room, game over.
{
endgame(false);
}
}
};
Timer.start()
}
D’après
http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-enjava/executer-des-taches-simultanement
Explication des threads, utile pour notre Timer
Ciras’ Quest
Page 26
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.43 Trap door
Entrée qui se ferme après avoir été franchie dans une room précise, ici
la room 15. On supprime la ligne de code de retour dans la room
précédente:
//vLevel15.setExit("south",vLevel9);//level de la montagne
7.44 Beamer
On crée la classe Beamer qui contient 2 attributs boolean aCharged et
Room aRoomChargee;
Constructeur naturel Beamer():
boolean aCharged;
Room aRoomChargee;
/**
* Le constructeur du Beamer
*/
public Beamer(final String pDescription, final int pPoids)
{
super(pDescription, pPoids);
this.aCharged = false;
}
/**
* Retourne si le Beamer est chargé ou non
* @return vrai si Beamer chargé
*/
public boolean isLoaded()
{
return this.aCharged;
}
/**
* Retourne la Room où le Beamer a été chargé
* @return Room la Room chargée
*/
public Room getRoomChargee()
{
return this.aRoomChargee;
}
Ciras’ Quest
Page 27
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
/**
* Charge le Beamer
* @param pRoom la pièce dans laquelle on va charger le Beamer
*/
public void charge(final Room pRoom)
{
this.aRoomChargee = pRoom;
this.aCharged = true;
}
/**
* Decharge le Beamer
*/
public void discharge()
{
this.aCharged = false;
}
Dans la classe GameEngine:
On crée l’attribut du beamer de la même façon que pour les autres
items mais on crée aussi deux cases pour les actions du beamer :
case LOAD: loadBeamer(command); break;
case FIRE : fireBeamer(command); break;
Le beamer se trouve dans la room 6 et doit être chargé avant d’être
utilisé :
private void loadBeamer(final Command pCommand)
{
vBeamer.charge(this.player.getCurrentRoom());
gui.println("The beamer has been successfully loaded !");
}
private void fireBeamer(final Command pCommand)
{
if(vBeamer.isCharged())
{
this.player.setCurrentRoom(vBeamer.getRoomChargee());
src.Gameuh.Game.getPlayer().changelevel(
player.getCurrentRoom().getNumber());
Ciras’ Quest
Page 28
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
gui.println("Wow !");
printLocationInfo();
vBeamer.discharge();
}
else
{
gui.println("The beamer isn't loaded...");
}
}
Le beamer permet de se téléporter dans la room où il a été chargé. On
peut l’utiliser notamment dans la room de la trap door ou dans la room
de la trap room ( si elle est implémentée )
7. 45. 1. Mettre à jour les fichiers de test
test provisoire:
take jaguarspirit
go west
take boots
go north
go east
take apple
eat apple
go north
load
fire
go east
talk
answer sdfsdf
answer Torik
take sword
go west
go west
go west
take helmet
take bearspirit
go east
go north
take shield
go south
go east
go south
go south
take boots
go north
Ciras’ Quest
Page 29
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
take lionspirit
go north
go north
go east
take armor
go east
go down
go north
go north
talk
answer 4
answer 7
answer red
answer Alexandre
7. 46. TransporterRoom
On crée une nouvelle classe, TransporterRoom qui hérite des
méthodes et attributs de la classe mère Room car c’est bien UNE
SORTE de Room :
public class TransporterRoom extends Room {
Un attribut:
static RoomRandomizer aRoomRand;
Un constructeur:
public TransporterRoom(final String pDescription, final int pNumber,
final String pComments)
{
super(pDescription, pNumber, pComments);
}
Un mutateur qui spécifie l’objet:
public void setAllRooms(final HashMap<Integer, Room> pAllRooms)
{
this.aRoomRand = new RoomRandomizer(pAllRooms);
}
Ciras’ Quest
Page 30
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
On redéfini la méthode la classe mère getExit pour pouvoir
transformer les sorties pour la TransporterRoom :
@Override
public Room getExit(final String pDirection)
{
return this.aRoomRand.findRandomRoom();
}
On crée une nouvelle classe, RoomRandomizer :
Ajout de deux attributs static :
static HashMap<Integer, Room> allRooms;
static ArrayList<Room> aRoomsInArray;
Création du constructeur :
public RoomRandomizer(final HashMap<Integer, Room> pAllRooms)
{
this.allRooms = pAllRooms;
this.aRoomsInArray = new ArrayList<Room>();
fillArrayList();
}
Création de la méthode fillArrayList() :
private void fillArrayList()
{
for (int vR : this.allRooms.keySet()) {
this.aRoomsInArray.add(this.allRooms.get(vR));
}
}
Création de la méthode findRandomRoom() :
public Room findRandomRoom()
{
Random vRandomizer = new Random();
int vSize = this.aRoomsInArray.size();
return this.aRoomsInArray.get(vRandomizer.nextInt(vSize));
Ciras’ Quest
Page 31
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
}
L’utilisation d’attributs static dans les deux classes précedement crées
oblige la modification de la classe GameEngine
Dans la classe GameEngine :
On modifie donc la méthode creatRooms()
TransporterRoom .aLevel12 = new TransporterRoom ("You are in
the Throne Chamber",12, "ME: This room looks amazing");
Nous souhaitons que la transporter Room nous fasse sortir
uniquement dans un room qui a une sortie nord (car la transporter
Room a une seule sortie, celle du sud), donc nous créons une HashMap
qui va prendre toutes les Rooms qui ont une sortie nord
HashMap <Integer , Room> vGoodRooms = new
HashMap<Integer , Room>(); //uniquement les rooms qui ont une
sortie nord
for(Room vRoom : aAllRooms.values())
{
if(vRoom.getExit("north") != null)
vGoodRooms.put(vRoom.getNumber(), vRoom);
}
vGoodRooms.remove(aLevel15);//enleve le labyrint
((TransporterRoom)aLevel12).setAllRooms(vGoodRooms);
7.46.1 alea()
Incompréhension, demande d’aide mais sans résultat.
Ciras’ Quest
Page 32
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.46.2 L’héritage
L’héritage est utilisé a plusieurs reprises, notamment dans la classe
Beamer et TransporterRoom.
7.46.3 Javadoc et regénérer les javadocs
Mise à jour des compléments d’informations sur le code. Les javadocs
userdoc et progdoc sont régénérés sur le site www.esiee.fr/~yanv .
7.47 abstract Command
On modifie la classe Command en classe abstraite
Nous n’avons hélàs pas eu le temps de faire cet exercice, nous en
sommes désolé, mais un exemple d’abstract est situé dans le package
pkg_2DGraphics.pkg_carreau, ici la classe carreau est abstraite et
grâce à cela nous avons créé tous nos carreaux des levels.
7.47.1 Paquetages
Création de 3 paquetages stage, carreaux et Zuulbad
Stage : -level
-levelManager
Carreaux :- 55 classe de carreaux, toutes héritant de <<abstract>>
carreau
Zuulbad :-Command, CommandWords, <<enum>>CommandWord,
Parser, GameEngine, UserInterface,
Character
- PlayerBis
-Room, TransporterRoom, RoomRandomizer
-Items, ItemList, Beamer
On indique que telle classe apparatient à tel paquetage avec par
exemple une ligne de code
package src.Gameuh.carreau;
Ciras’ Quest
Page 33
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
On spécifie que la classe « herbe » appartient au paquetage carreau,
qui se trouve lui-même dans la paquetage principal Gameuh.
On peut aussi importer des paquetages pour utiliser les classes qui
sont dans celui-ci :
import src.Gameuh.carreau.*;
Ceci est les package de la version ultérieure, et non de la version
actuelle.
7.48 Character
Création de la classe Character dans la paquetage Zuulbad avec trois
attributs, 1 constructeur et trois getter :
public class Character
{
private String aName;
private String aSpeech;
private String aTalk;
/**
* Constructor for objects of class Character
*/
public Character(final String pName, final String pSpeech, final
String pTalk)
{
this.aName = pName;
this.aSpeech = pSpeech;
this.aTalk = pTalk;
}
public String getName()
{
return this.aName;
}
public String getSpeech()
{
Ciras’ Quest
Page 34
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
return this.aSpeech;
}
public String getTalk()
{
return this.aTalk;
}
}
Conformément à notre jeu, l’utilisateur interagit avec les différents
personnages. Notamment lorsqu’il rentre dans une room, il peut savoir
quel personnage se trouve dans la currentRoom :
private void checkCharacters()
{
if(AllCharacters.containsKey(player.getCurrentRoom()))
{
gui.println("ME: Oh, " +
AllCharacters.get(player.getCurrentRoom()).getName());
gui.println(AllCharacters.get(player.getCurrentRoom()).getSpeech());
}
else{
gui.println("ME: I'm alone in this room. :(");
}
On implémente la méthode answer, qui permet d’avancer dans le jeu
en répondant correctement suivant les questions du SKULL ou de
Torik :
public void answer(final Command pCommand)
{
if(!pCommand.hasSecondWord())
{
gui.println("ME: I want to answer by saying nothing. I think I'm
smart.");
return;
}
if(player.getCurrentRoom() == vLevel13)
{
if(pCommand.getSecondWord().equals("Torik")
||pCommand.getSecondWord().equals("torik"))
Ciras’ Quest
Page 35
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
{
gui.println("SKULL: Good. Well done.\nSKULL: *unlocks the
sword*\nSKULL: Good luck. Take care of that sword.");
levelmanager.getCurrentLevel().setRocherSpecial();
}
else
gui.println("SKULL: tssssss... you don't deserve that sacred
sword.");
return;
}
On crée les différents personnages conformément à la
HashMap<Room, Character()>. De plus, on associe à chaque room le
personnages présent avec son dialogue informatif sur la situation du
joueur dans le jeu :
private void createCharacters()
{
Character vHermit = new Character("a hermit", "HERMIT: Hoho,
somebody is here!", "ME : I need help, is there any chance I can
defeat Torik?\nHERMIT: Oh, this will be a hard task...\nHERMIT: but
there's a chance ! \nHERMIT: Find the divine sword and you may have
a chance. \nHERMIT: You better know how to swim. Good luck !\nME :
Thanks !");
Character vWitch = new Character("a witch", "WITCH: a
humain..","WITCH: Your backpack is so small...\nWITCH:You can't
equip yourself with this kid !\nWITCH:I just finished my magic apple...
eat it.");
Character vGuards = new Character("some guards", "GUARDS: Stay at
home playing video games little kid","GUARDS: YOU WANT TO KILL
TORIK? AHAHAHAHAHAHAHAHHAHAHAHA\nGUARDS:AHAHAHHAHA
STOP I'M DYING AHAHAH");
Character vBoss = new Character("the Boss", "BOSS: You're still
alive, good for you. Prepare your funeral.","TORIK: How many yellow
trees have you seen?");
Ciras’ Quest
Page 36
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
Character vSkull = new Character("a skull", "SKULL: Yes, I can
talk.","SKULL: Wanna get that sword? Then play with me.\nSKULL:
What's the boss name?");
AllCharacters = new HashMap<Room, Character>();
AllCharacters.put(vLevel8,vHermit);
AllCharacters.put(vLevel4,vWitch);
AllCharacters.put(vLevel9,vGuards);
AllCharacters.put(vLevel12,vBoss);
AllCharacters.put(vLevel13,vSkull);
}
Le joueur a le droit à un monlogue de Ciras si aucun personnage ne se
trouve dans la room et que l’utilisateur utilise la commande talk :
private void talk()
{
if(AllCharacters.containsKey(player.getCurrentRoom()))
{
gui.println(AllCharacters.get(player.getCurrentRoom()).getTalk());
}
else{
gui.println("ME: Nobody is here... maybe I should talk to myself.");
gui.println("ME: Hey Ciras, how's going?");
gui.println("ME: Good, thanks Ciras, how about you?");
gui.println("ME: Fine too ! You look so beautiful Ciras");
gui.println("ME: *Ciras becomes shy*");
}
}
7.48 MovingCharacter
Moving Character est une sorte de Character
public class MovingCharacter extends Character
Dans notre scénario, nous avons juste fait en sorte que quand le joueur parle
à l’Hermitte, celui-ci va partir pecher (donc partir de la Room) et ensuite se
perdre pour se retrouver au final dans la room cachée.
private Room aRoom;
private String aNewSpeech;
/**
Ciras’ Quest
Page 37
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
* Constructeur naturel du Moving Character
*/
public MovingCharacter(final String pName, final String pSpeech, final
String pTalk, final Room pRoom, final String pNewSpeech)
{
super(pName,pSpeech,pTalk);
this.aRoom = pRoom;
this.aNewSpeech = pNewSpeech;
}
/**
* Retourne la Room où le MovingCharacter va se déplacer
* @return aRoom
*/
public Room getDestinationRoom()
{
return this.aRoom;
}
/**
* Change de Speech du Moving Character selon celui qui a été définit dans
le construteur
*/
public void setNewSpeech()
{
super.setNewSpeech(this.aNewSpeech);
}
7.49.2 Elements restant à implementer
Le joueur ne peut acceder qu’à la deuxieme partie du jeu seulement si il
possède tous les objets ( décris au début du rapport )
if(player.getInventory().containsKey("helmet") &&
player.getInventory().containsKey("armor") &&
player.getInventory().containsKey("boots") &&
player.getInventory().containsKey("shield") )
this.aGotEverything = true;
Ajout de la commande answer. On considère que l’utilisateur répond
correctement dès lors qu’il tape la commande answer suivit de la bonne
String :
Ciras’ Quest
Page 38
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
public void answer(final Command pCommand)
{
if(!pCommand.hasSecondWord())
{
gui.println("ME: I want to answer by saying nothing. I think I'm
smart.");
return;
}
if(player.getCurrentRoom() == vLevel13)
{
if(pCommand.getSecondWord().equals("Torik")
||pCommand.getSecondWord().equals("torik"))
{
gui.println("SKULL: Good. Well done.\nSKULL: *unlocks the
sword*\nSKULL: Good luck. Take care of that sword.");
levelmanager.getCurrentLevel().setRocherSpecial();
}
else
gui.println("SKULL: tssssss... you don't deserve that sacred sword.");
return;
Lorsque le joueur répond aux questions de Torik, this.aFinishBoss retourne
true. Ainsi, le arbres jaunes de la room 3 deviennent traversables :
if( (pCommand.getSecondWord().equals("victor") ||
pCommand.getSecondWord().equals("Victor") ||
pCommand.getSecondWord().equals("alexandre") ||
pCommand.getSecondWord().equals("Alexandre")) && this.aQuestion == 3)
{
gui.println("TORIK: ..............................\nTORIK:
..............................\nTORIK: ..............................\nTORIK: well done ciras.
You deserve the truth.\nTORIK: I didn't kill your friends. I just wanted to
test my destruction power.\nTORIK: I can change the world as I want it. I
have control on everything.\nTORIK: *INVOKES POWER
AAAHSSQHDSQ*\nYou have a new power !\nTORIK: I just gave you the
ability to walk through yellow trees.\nTORIK: Now get out.");
levelmanager.getCurrentLevel().setArbreSpecial();
src.Gameuh.carreau.arbrejaune.setTraverse(true);
this.aFinishBoss = true;
}
else if (this.aQuestion == 3) gui.println("TORIK :" +
pCommand.getSecondWord() + "? Who is this?");
Le jeu se fini lorsque le joueur rentre dans la room cachée
Ciras’ Quest
Page 39
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.50 Maximum
On peut calculer le maximum entre deux réels x et y grâce à la méthode de la
classe java.lang.Math :
public staic int max( int x, int y)
7.51 Static
On utilise des méthodes static de la classe Math car on manipule des
paramètres qui n’ont pas besoin de stockers des données particulière.
7.53 main()
On peut créer la méthode main dans la classe Java par :
public static void main(String [] pArgs){
Game game = new Game ()
}
7.54 Sans BlueJ
Pour ouvrir le fichier sans BlueJ, il suffit de créer un fichier.jar ( Projet
=> Exporter… et cocher les deux cases ) avec Game comme main
class.
7.58 Execution sous Windows
On
crée un fichier .jar conformément à 7.54. Après avoir ouvert le
terminal cmd.exe, si le fichier se trouve dans le dossier A3P :
cd C:\Users\9J\A3P
On ouvre le fichier :
java –jar cirasquest.jar
Le terminal lance sans problème le jeu.
Ciras’ Quest
Page 40
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.58.1 Execution sous Linux
Les commandes sont similaires :
cd /home/A3P
java jar cirasquest.jar
7.59.1 Test de l’applet
L’applet en HTML s’intègre parfaitement au site du jeu:
http://www.esiee.fr./~yanv
7.60 / 7.60.1 Application et Applet
Le fichier Jar de 7.59 est utilisable en directement application et en
applet.
7.60.4 Génerer les deux Javadocs
On génère les deux javadocs ( progdoc et userdoc ) du jeu avec :
javadoc –d progdoc –author –version –private –linksource pkg_* *
.java
javadoc –d userdoc –author –version pkg_* *.java
7.63
3 scénarios de test
Création des 3 fichiers .txt qui permettent de tester respectivement, la
façon de gagner, toutes les fonctions du jeu, ainsi que l’exploration de
toutes les rooms avec :
-test testwin:
take jaguarspirit
go west
go north
Ciras’ Quest
Page 41
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
go east
take apple
eat apple
go west
go north
go east
talk
answer Torik
take sword
go west
go west
go west
take helmet
take bearspirit
go east
go north
take shield
go south
go east
go south
take lionspirit
go south
take boots
go north
go north
go north
go east
take armor
go west
go down
go north
go north
talk
answer 4
answer 7
answer red
answer Victor
-test testfonc:
take jaguarspirit
go west
take boots
go north
go east
take apple
eat apple
go north
load
fire
Ciras’ Quest
Page 42
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
go east
talk
answer sdfsdf
answer Torik
take sword
go west
go west
go west
take helmet
take bearspirit
go east
go north
take shield
go south
go east
go south
go south
take boots
go north
take lionspirit
go north
go north
go east
take armor
go east
go down
go north
go north
talk
answer 4
answer 7
answer red
answer Alexandre
help
inventory
drop helmet
drop hhjl
go rggs
-test testrooms:
take jaguarspirit
go west
take boots
go north
go east
take apple
eat apple
go north
Ciras’ Quest
Page 43
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
load
fire
go east
talk
answer sdfsdf
answer Torik
take sword
go west
go west
go west
take helmet
take bearspirit
go east
go north
take shield
go south
go east
go south
go south
take boots
go north
take lionspirit
go north
go north
go east
take armor
go east
go down
go north
go north
talk
answer 4
answer 7
answer red
answer Alexandre
help
inventory
drop helmet
drop hhjl
go rggs
Le test des rooms est en réalité le même que pour le testwin. En effet,
pour effectuer toutes les actions, il est obligatoire d’atteindre la salle
du boss et de répondre à ses questions.
7.63.1 Tout recompiler
La recompilation du jeu entier fonctionne, aucuns avertissements.
Ciras’ Quest
Page 44
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
7.63.2 / 7.63.3 Compléter notre scénario
Le scénario est complet est définitif depuis la réalisation de l’exercice
7.49.2.
7.63.4 Regénération des Javadocs
Les deux Javadocs du projet sont à nouveaux régénérées et mise à
jour sur le site www.esiee.fr/~yanv
Ciras’ Quest
Page 45
2013/2014 [A3P IGI-1002 GROUPE 9J ESIEE PARIS]
III. Déclaration anti-plagiat
Afin de respecter les conventions d’écriture propre aux
auteurs de différents codes présents dans le projet, il est
obligatoire de notifier les sources de certains codes.
- M.Denis BUREAU :
http://www.esiee.fr/~bureaud/Unites/In101/Cours/fichier
sJava.htm
Pour les différents précisions autour des lectures / écritures
http://www.esiee.fr/~bureaud/Unites/Zuul/applette.htm
Pour le fonctionnement et la compréhension de la génération
de l’applet. Notamment pour l’implémentation de l’applet sur
le site HTML.
http://fr.openclassrooms.com/informatique/cours/apprenez
-a-programmer-en-java/executer-des-taches-simultanement
Explication des threads, utile pour notre Timer
http://stackoverflow.com/questions/6045384/playing-mp3and-wav-in-java
Utilisation de la musique, lire le fichier .wav
http://fr.openclassrooms.com/informatique/cours/apprenez
-a-programmer-en-java/notre-premiere-fenetre
Explication sur les JFrame
Ciras’ Quest
Page 46