Vous êtes sur la page 1sur 56

Rapport

projet JAVA

Lien site web : http://perso.esiee.fr/~blondine/

I.A) Auteur

Heir to the demon Eliott Blondin

B) Thme

Dans le Royaume de Parse, le jeune prince Arslan doit vaincre Hilmes et reprendre le trne qui lui a
t vol.

C) Rsum complet du scnario

Au travers du royaume de Parse, Arslan, jeune prince g de quinze ans, va devoir convaincre ses
allis pour ainsi, les rallier sa noble cause.
La fin se droulera dans la capitale de Parse o se trouve Hilmes et devra arriver la salle du trne
o il dfiera finalement celui qui a captur le roi.

~ 1 ~
I. D) Plan

Vue global du jeu:

Vue de la dernire pice (Ectabana)

~ 2 ~
I. E) Scnario dtaill
Une grande guerre entre deux puissants royaumes se droule: d'un ct la Lusitania, de l'autre le
Parse. Dans les plaines d'Atropatnes, Andragoras V, roi de Parse, va affronter l'arme Lusitanienne.
Arslan va ds lors participer sa premire bataille. Mais Atropatnes se rvle tre un pige mortel :
aids par un tratre et dirigs par un mystrieux gnral se dissimulant sous un masque d'argent, les
Lusitaniens infligent une dfaite aux Parses, capturent le roi et assigent le chteau de Parse. Ayant
russi chapper des assassins, Arslan va dsormais chercher des allis avec son protecteur,
Darhyl, afin de rorganiser les forces de Parse pour combattre Hilmes et ses sbires.

Sous-ensemble du scnario : Rsonner Khallan au travers dun long dialogue pour le rallier votre
cause et ainsi librer le roi AndragorasIII. Si Arslan chouait dans sa tentative de le rsonner, Khallan
tuera le roi et se fera tuer son tour par Darhyl.

I. F) Dtails des personnages, items et lieux :


Les personnages :

Arslan (vous) :

Prince hritier du Royaume de Parse et personnage principal. Durant sa premire bataille, son
royaume, Parse, est conquit par les Lusitaniens cause de la trahison de Kharlan. Il est d'apparence
fragile et peu sr de lui, contrairement son pre, et trs gentil ; il est prt mettre sa vie en jeu
pour celle de ses amis, sa famille et son royaume. Au dbut aveugle aux dfauts de Parse, il devient
plus conscient des mfaits de son pays, il dsire apprendre les croyances des Lusitaniens.

Darhyl :

Darhyl est un des cinq meilleurs guerriers de Parse. Il trs loyal envers le Roi Andragoras et le Prince
Arsln et durant la bataille d'Atropathnes, la premire bataille laquelle Arsln participe, son oncle,
l'rhan Valphreze lui demande de jurer fidlit Arsln sur son pe, ce qu'il accepte. Suite a la
dfaite des Parses, il devient le protecteur du prince Arsln et se montre particulirement protecteur
envers son seigneur, c'est aussi lui qui permet au prince de rencontrer Narsus car il estime que son
ami pourra leur tre d'une aide prcieuse dans la guerre contre les Lusitaniens. Mme aprs qu'il a
appris l'identit du gnral au masque d'argent, et aprs les accusations d'autres ennemis disant que
Arsln n'a aucune lgitimit pour rgner sur Parse, il reste tout de mme d'une loyaut sans faille
envers son jeune protg.

~ 3 ~
Andragoras III :

Roi de Parse et pre d'Arsln. Il est connu pour son caractre ttu et sa tendance utiliser la force
brute plutt que la stratgie. La trahison de Kahllan et la connaissance de Masque d'Argent des
stratgies de Parse ont conduit sa dfaite crasante. Il est en vie et maintenu prisonnier. Il est
souponn pour la mort mystrieuse de son frre an, le roi Osloes V, motive par son ambition
d'obtenir le trne et Tahamin.

Masque d'argent (personnage antagoniste) :

Il est la tte de l'arme Lusitanienne et est le principal antagoniste. Il est en ralit Hilmes, cousin
d'Arsln et fils d'Osloes V, le frre an d'Andragoras. Il mne l'invasion de Parse pour rclamer son
titre lgitime. Il hat son oncle d'une haine brlante, car ce dernier l'a dfigur en tentant de
l'assassiner aprs la mort du prcdent roi, et il s'est associ aux Lusitaniens mais aussi a une trange
secte de magiciens. Il est pyrophobe et est donc effray en prsence de flammes... depuis, il couvre
le haut de son visage, notamment la zone entourant son il droit, d'un masque d'argent qui lui vaut
son surnom.

Narsus :

Stratge de gnie, Narsus tait autrefois un conseiller et stratge du Roi Andragoras, mais il a t
banni aprs avoir contest la dcision du Roi de maintenir l'esclavage et parce qu'il estimait les
membres du gouvernement incomptents et corrompus. Il est un excellent stratge, mais aussi une
fine lame et un philosophe, mme s'il est plus fier de ses mdiocres talents de peintre que de ses
qualits. Il avait prdit que le manque de stratgie du Roi et son refus de librer les esclaves
mnerait la chute du royaume.

Kubard :

Faisant parti des Mazbharns, Kubard nest presque jamais vu sobre. En tant que guerrier vtran, il
n'a pas peur des grandes batailles. Mais choqu et en colre quand il apprit que le roi avait fui , il
cessa de combattre en dclarant quun roi qui ne protge pas son peuple nen est pas un.

Bodin :

Bodin est un croyant sanguinaire de Yaldabaoth (croyance de la Lusitanie) , qui utilise sa position et
le pouvoir de tuer indistinctement des esclaves. Il est impitoyable et sans piti et a tortur des
mazbharns de Pars pendant le sige de Ecbatana.



~ 4 ~
Kahllan :

Un des Mazbharn de l'arme de Parse. Il trahit Parse, ce qui entrane la chute du Royaume, et sert
maintenant Lusitania.

Sam :

Fait parti des Mazbharns de Pars.

Hodir :

Un gnral Lusitanien.

Xandes :

Il est le fils de Mazbharn Khallan de Pars et un serviteur de Hilmes . Il est trs haineux , se met en
colre trs rapidement et semble ne pas tolrer l'incomptence. Il est trs fidle Hilmes.

Garshasph :

Garshasph est lun des Mazbharn de Pars, il commande 10 000 cavaliers.

Baqhman :

Il est le plus vieux des Mazbharns de Pars.

~ 5 ~
Les lieux :

-Forest : Fort prs de la plaine d'Atropanes (lieu de dpart du joueur principal : vous)

-Baldad : premire ville rencontre et la plus florissante en terme de commerce.

-Sindora : une cite prs des montagnes.



-Peshawar : un village de pcheurs.

-Ectabana : Capitale de Parse, Chteau du royaume (compos de 7 pices)

-Common Room
-Armory
-Castle courtyard
-Secret tunnel
-Kings apartements (tage "east upstairs"
-Throne room (tage "north upstairs")
-Dungeon


Les items :

-Silver Mask

- Arslans sword

-Falcon

-Armor forged in Baldad

-Caravan (magic-cookie)

I. G) Situation(s) gagnante(s) et perdante(s)


Situation(s) gagnante(s) :

Vaincre Hilmes avec laide de 3 Mazbharns minimum.

~ 6 ~

Situation(s) perdante(s) :


Avoir parmi ses allis au plus de 2 Mazbharns (gnraux) lors de laffrontement final.

Navoir pas pu vaincre votre ennemi dans le temps imparti.




I. I) Commentaires (ce qui manque, reste faire)

Exercie 7.49 (moving character) non fini.

~ 7 ~
Deuxime partie : Rponses aux exercices du projet

Ex 7.2.1 : Classe Scanner


Comprendre l'utilisation de la classe Scanner dans zuul-bad pour lire au clavier

D'aprs les informations donnes:

Comprendre l'utilisation de la classe Scanner dans zuul-bad pour lire au clavier :

System.in dsigne le clavier (comme System.out dsigne l'cran)

Il faut crer un objet Scanner en lui passant le clavier en paramtre :

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 crer une String pour contenir les caractres qui seront taps au clavier :

String vLigne; .

Ensuite, chaque fois qu'on crira l'instruction vLigne = vScan.nextLine();

toute la ligne de caractres taps au clavier sera stocke dans vLigne.

En attendant que des caractres soient taps au clavier, le programme reste

bloqu. Il est donc indispensable de prvenir l'utilisateur de ce qu'on attend

de lui, en affichant quelque chose comme "Veuillez taper une commande : "

ou plus simplement "> "

=> On comprend ds lors que la classe Scanner nous permet de rentrer des informations au clavier
que la machine pourra rcuprer et rutiliser.

Exercice 7.4 : cration des pices du jeu


Modification du code source prexistant de Zuul-bad dans un nouveau projet comme demand :

-modification de la mthode CreateRooms() dans la classe Game pour crer les pices de jeu
en remplaant le nom des pices de Zuulbad par les notres :

outside = new Room("outside the main entrance of the university");

Est devenu ainsi par exemple

~ 8 ~

Room vForest ;

vForest = new Room("dans la fort d'Atropatenes");

avec le nom de la avant avant =new Room et la description de celle-ci entre


parenthses. La room Forest a t dclare juste avant.



7. 5. printLocationInfo
w Cration d'une procdure printLocationInfo() dans la classe Game, reprenant le code

redondant des mthodes createRooms() et goRoom().

w Remplacement du code dupliqu des 2 mthodes cites par l'appel de la procdure

prcdente.


7. 6. getExit
w Ajout de l'accesseur getExit() dans la classe Room afin de rduire le niveau de couplage.

w Utilisation de l'accesseur getExit() dans la classe Game (mthode goRoom()) afin de

n'utiliser que les retours de getExit().


7. 7. getExitString
wModification de printLocationInfo() :

private void printLocationInfo()

System.out.println("You are " + aCurrentRoom.getDescription());

System.out.print(aCurrentRoom.getExitString());

System.out.println();

~ 9 ~

Dfinition de getExitString() sur le modle :

- if (getExit("west") != null)

{vWest = "west ";}

- else

{vWest = "";}

- return ("Sorties : " + vNorth + vEast + vSouth + vWest);





7. 8. HashMap, setExit
w Ajout de l'outil HashMap et changements, expliqus dans le pdf, apports.

7. 8. 1. Ajout d'un dplacement vertical


w Ajout de toutes les pices du plan (ici, niveaux Upstairs , Downstairs , EastUpstairs ,
NorthUpstairs ) : incluant les dplacements haut, bas et escaliers nord et escaliers est.

On garde les directions nord ("North"), sud ("South"), est ("East"), ouest ("West").

7. 9. keySet
w La mthode keySet() de la classe HashMap permet d'accder la liste de toutes les cls

contenues dans une HashMap.





7.10. getExitString CCM

wLa mthode getExitString() renvoie une description des sorties possibles dune pice :
-String returnString = Exits : ; //initialisation de la variable returnString (de type
String) et stockage afin de commencer la chane de caractre Exits : .

-Set<String> keys = exits.ketSet() ; //initialisation de la variable keys (de type
Set<String>) et stockage de la liste des cls de la HashMap exits, exits tant un
attribut de type HashMap de lobjet Room courant).

~ 10 ~

-for (String exit : keys) {returnString += " " + exit;} //dclaration dune variable locale
exit prenant comme valeur la prochaine cl de la HashMap.
// chaque tour de la boucle for, on concatne un espace et la valeur de exit la
chane de caractres returnString

-return returnString ; //on finit par retourner une chane de caractre par exemple :
Exits : north east west



7.11. getLongDescription

wSelon les indications expliqus dans le pdf :

on ajoute la mthode getLongDescription() dans la classe Room,
puis on modifie la mthode printLocationInfo().



7.14. look

wOn ajoute la commande look dans la classe CommandWord.

wOn ajoute galement la mthode look() dans la classe Game ainsi que
else if (commandWord.equals( look )) {look() ;} dans la classe Game.


7.15. eat
wOn ajoute la commande eat dans la classe CommandWord.
wOn ajoute galement la mhode eat() dans la classe Game ainsi que
Else if (commandWord.equals( eat )) {eat() ;} dans la mthode interpretCommand()
de la classe Game.


7.16. showAll, showCommands
wOn effectue les changements dcrits dans le pdf.

~ 11 ~

7.18. getCommandsList
wOn effectue les changements suivants :

Dans la classe CommandWords :
-On transforme la mthode showAll() en getCommandsList() :
public String getCommandsList()
{
String vCommands = ;

For (String command : validCommands)
{
vCommands += command + ;
}
return vCommands ;
}


Dans la classe Parser :
-On modifie de la procdure void showCommands() en String showCommands():

public String showCommands()
{
return commands.getCommandsList() ;
}


Dans la classe Game :
-On modifie la mthode printHelp() :
parser.showCommands() ;System.out.println(parser.showCommands() + \n ;

~ 12 ~

7.18.1. Comparer son jeu au projet zull-better

wDans la classe Game :
-Au niveau de la procdure void printLocationInfo() :
void printLocationInfo() System.out.println(aCurrentRoom.getLongDescription()) ;

dans notre classe utilis par zuul-better


wAucun changement na t effectu dans les autres classes en comparaison avec zuul-
better.



7.18.6 Etudier le projet zuul-with-images

wOn modifie le projet en fonction du modle de zuul-with-images.



7.18.7. addActionListener() et actionPerformed()

wDans la classe UserInterface :

Dans la mthode createGUI() :
On initialise la variable entryField de type JtextField (un champ servant recueillir du
texte) comme un champ de 34 caractres :
entryField = new JTextField(34);
On ajoute la classe UserInterface la liste des auditeurs de entryField.
C'est--dire que lorsqu'un vnement se produira sur l'objet entryField (lorsque l'on
validera un texte entr dans le champ), la mthode de signature public void

~ 13 ~
actionPerformed(ActionEvent e), situe dans la classe UserInterface, va tre invoque
automatiquement.
entryField.addActionListener(this);

Dans la mthode actionPerformed() :
Elle est appele automatiquement lorsque entryField est stimul et consiste appeler la
mthode processCommand() situe en dessous.


7.18.8. Ajouter au mois un bouton

Ajout des boutons : Look, Help, Quit, North, South, East, West, Upstairs, Downstairs,
UpstairsNorth, UpstairsEast.

wDans la classe UserInterface :
-On ajoute dattributs pour chaque bouton: exemple, private JButton aBoutHelp ;

Dans la mthode createGUI() :
-On initialise chaque bouton : this.aBoutHelp = new JButton("Help");
-On place le premier panel qui contient limage et laffichage dans la fentre
myFrame (premire colonne) : `

JPanel vPanel1 = new JPanel();

this.aMyFrame.getContentPane().add(vPanel1, BorderLayout.CENTER);

this.aImage = new JLabel();





~ 14 ~
-On ajoute un deuxime panel pour y mettre les boutons Help, Quit, Look (1) ces
derniers sont ajouts dans ce panel-ci (2) puis on place le panel dans la fentre
myFrame (3):

JPanel vPanel2 = new JPanel();

this.aMyFrame.getContentPane().add(vPanel2, BorderLayout.EAST);

this.aBoutRegarder = new JButton("look");
this.aBoutQuit = new JButton("quit");
this.aBoutHelp = new JButton("help");
vPanel2.setLayout(new GridLayout(2,2));
vPanel2.add(this.aBoutQuit);
vPanel2.add(this.aBoutRegarder);
vPanel2.add(this.aBoutHelp);




-On ajoute un troisime panel pour y mettre les boutons de directions (1), ces
derniers sont ajouts dans ce panel-ci (2) puis on place le panel dans la fentre
myFrame (3) :

JPanel vPanel3 = new JPanel();

this.aMyFrame.getContentPane().add(vPanel3, BorderLayout.SOUTH);
this.aBoutNorth = new JButton("North");
this.aBoutSouth = new JButton("South");
this.aBoutEast = new JButton("East");
this.aBoutWest = new JButton("West");
this.aBoutUpstairs = new JButton("Upstairs");
this.aBoutDownstairs = new JButton("Downstairs");
this.aBoutEastUpstairs = new JButton("EastUpstairs");

~ 15 ~
this.aBoutNorthUpstairs = new JButton("NorthUpstairs");

vPanel3.setLayout(new GridLayout(2,8));
vPanel3.add(this.aBoutNorth);
vPanel3.add(this.aBoutSouth);
vPanel3.add(this.aBoutEast);
vPanel3.add(this.aBoutWest);
vPanel3.add(this.aBoutUpstairs);
vPanel3.add(this.aBoutDownstairs);
vPanel3.add(this.aBoutEastUpstairs);
vPanel3.add(this.aBoutNorthUpstairs);


-Puis on ajoute :

this.aBoutRegarder.addActionListener(this);
this.aBoutQuit.addActionListener(this);
this.aBoutHelp.addActionListener(this);
this.aBoutNorth.addActionListener(this);
this.aBoutSouth.addActionListener(this);
this.aBoutWest.addActionListener(this);
this.aBoutEast.addActionListener(this);
this.aBoutUpstairs.addActionListener(this);
this.aBoutDownstairs.addActionListener(this);
this.aBoutEastUpstairs.addActionListener(this);
this.aBoutNorthUpstairs.addActionListener(this);






~ 16 ~
Dans la mthode actionPerfomed() :
-On modifie la procdure afin de diffrencier les diffrentes sources qui
dclencheront lvnement actionPerformed selon le modle suivant :
if (pE.getSource() == this.aBoutRegarder)
{
this.aEngine.interpretCommand("look");
}
/* idem pour les autres boutons */



7.19.2. Dplacer toutes les images

wOn cre le dossier Images la racine du jeu.
wOn change le chemin des noms des images associes aux Rooms dans la HashMap sous
le modle suivant : Forest.gif Images/Forest.gif


7.20. Item

wOn cre la classe Item de la sorte :
public class Item
{

private double aWeightItem;
private String aDescriptionItem;
private String aImageItem ;



public Item(final double pWeight, final String pDescription, final String pImageItem)
{
this.aWeightItem= pWeight;

~ 17 ~
this.aDescriptionItem= pDescription;
this.aImageItem = pImageItem ;
} //Item()//


public String getItemDescription()
{
return aDescriptionItem;
}


public double getWeight()
{
return aWeightItem;
}

public String getImageItem()
{
return aImageItem ;
}

public double setWeight(final double pWeightItem)
{
return this.aWeightItem = pWeightItem;
}
}






~ 18 ~
wDans la classe GameEngine :
-On cre la mthode createItems() :

Cration des items du jeu :
Item ArslanSword = new Item(4, ArslanSword) ;

Association des items du jeu des salles :
this.allRooms.get( take).addItem( Arslans sword ,
Arslans sword) ;

-Dans le constructeur GameEngine() :
On appelle la mthode createItems().



7.21. Item Description

wDans la classe Item :

public String getLongItemDescription()
{
return this.aDescriptionItem + "" + this.aWeightItem;
}

wDans la classe Room :

-On ajoute la mthode getItemString() pour indiquer au joueur les items qui sont
prsents suivant la pice dans laquelle il se trouve.

public String getItemString()
{
return this.aItem.getItemStrings ();

~ 19 ~
}

-On modifie la mthode getLongDescription() de la sorte :

public String getLongDescription ()
{
return "You are " + this.aDescription + ".\n" + getExitString () + ".\n" + getItemString() ;
}//getLongDescription




7.22. Items

wOn utilise une HashMap qui associe des cls String (cest--dire le nom de litem) des
valeurs Item (lobjet). Par exemple, ( Arslans sword, Arslans sword).


7.22.1 Justifier le choix

wOn utilise cette HashMap car cela nous permettra de rechercher plus facilement un
Item en fonction de son nom, si besoin est.


7.22.2 Intgrer les objets (items)

wLes items suivants sont intgrs dans le jeu :

Silver Mask Arslans Sword Falcon

~ 20 ~
7.23. back

wDans la classe GameEngine :

-On ajoute lattribut Room aPreviousRoom.

-On ajoute dans la mthode createRooms() :
aPreviousRoom = aCurrentRoom ;

-On ajoute linstruction aPrevious = aCurrentRoom ; dans la mthode goRoom().

-On modifie la mthode interpretCommand() pour prendre back en compte :
else if (commandWord.equals( back ))
this.back(vCommand) ;

-On ajoute la mthode back() :
private void back()
{
Room vR = aCurrentRoom ;
aCurrentRoom = aPreviousRoom ;
aPreviousRoom = vR ;

this.aGui.println( \n + aCurrentRoom.getLongDescription() + \n ) ;

if (aCurrentRoom.getImageName() != null)
{
this.aGui.showImage(aCurrentRoom.getImageName()) ;
}
}

wDans la classe CommandWords :
-On ajoute back dans le tableau de Strings aValidCommands.

~ 21 ~
7.26. Stack

wDans la classe GameEngine :

-On ajoute lattribut Stack<Room> aPreviousRoom

-On initialise dans le constructeur : this.aPreviousRoom = new Stack<Room>();

-On ajoute dans la boucle if/else de la mthode goRoom() :
this.aPreviousRoom.push(aCurrentRoom);

-On modifie la mthode back() :

private void back()
{
if(this.aPreviousRoom.empty() == true)
{
aGui.println("You can't go back...");
}

else{
Room vLastRoom = this.aPreviousRoom.pop();
this.aCurrentRoom = vLastRoom;

this.aGui.println("\n" + aCurrentRoom.getLongDescription() + "\n");

if (aCurrentRoom.getImageName() !=null)
{
this.aGui.showImage(aCurrentRoom.getImageName());
}
}
}

~ 22 ~
7.28.1 Crer une nouvelle commande test

wDans la classe CommandWord :


-On ajoute le mot test dans le tableau de String.

wDans la classe GameEngine :


-On importe : -> java.io.* ;
-> java.util.Scanner ;
-On ajoute dans la mthode interpretCommand() :
else
if (vCmd.equals("test"))
{
this.test(vCommand);
}
-On ajoute la mthode test() :
private void test(final Command pCommand)
{
if(pCommand.hasSecondWord() == false)
{
this.aGui.println("Which file do you want to test my dear ?");
}

else { String vFile = pCommand.getSecondWord();
InputStream vIS =
this.getClass().getClassLoader().getResourceAsStream(vFile+".txt");
Scanner vSc = new Scanner ( vIS );
while (vSc.hasNextLine() )
{
String vLine = vSc.nextLine();

~ 23 ~
interpretCommand(vLine);
}
vSc.close();
}
}




7.29. Player

wOn dplace la pice courante dans la classe Player. Pour linstant, notre player
possde les caractristiques suivantes : son nom, sa taille dinventaire dobjets
rcuprs et le lieu o il se trouve. Ces caractristiques-ci sont par la suite gres dans la
classe Player afin de ne pas surcharger la classe GameEngine. On cre un objet Player au
dbut du jeu pour stocker ces donnes.

wCration de la classe Player :

public class Player
{
private String aName;
public Room aCurrentRoom;
private Stack <Room> aPreviousRooms;
private double aTotalWeight ;

public Player(final String pName, final double pMaxWeight)
{
this.aName = pName;
this.aPreviousRooms = new Stack <Room> ();
this.aTotalWeight= pMaxWeight;

~ 24 ~
} //Player


public Stack <Room> getBackRoom()
{
return this.aPreviousRooms;
}


public Room getCurrentRoom()
{
return this.aCurrentRoom;
}

public String getName()
{
return this.aName;
}

public void setCurrentRoom(final Room pCurrentRoom)
{
this.aCurrentRoom= pCurrentRoom;
}

public void setMaxWeight(final double pWeight)
{
aTotalWeight= pWeight;
}


public double getMaxWeight()
{
return aTotalWeight;

~ 25 ~
}
}// Player

wDans GameEngine :

-On cre lattribut : private Player aPlayer ;

-On rajoute dans le contructeur la mthode createPlayer()

-On cre la mthode createPlayer() :

private void createPlayer()
{
aPlayer = new Player("Eliott", 50);
}

-On modifie dans la mthode createRooms() :

aPlayer.setCurrentRoom(vForest);





7.30. Take / Drop

wDans la classe CommandWords :

-On ajoute take et drop dans le tableau de Strings aValidCommands.


wDans la classe GameEngine :

-On modifie la mthode interpretCommand() pour prendre take et drop en
compte :

~ 26 ~
else if (commandWord.equals( take ))
this.take(vCommand) ;

else if(commandWord.equals( drop ))
this.drop() ;


-On ajoute les mthodes take() et drop() :


private void take(final Command pCommand)
{
String vCommand = pCommand.getSecondWord();

if (!pCommand.hasSecondWord()){
this.aGui.println("Take what?");
}

else
{
Item vItem =
this.aPlayer.getCurrentRoom().getItemList().getItem(vCommand);
double aCurrentWeight =+ vItem.getWeight();

if(this.aPlayer.getMaxWeight() - aCurrentWeight <0)
this.aGui.println("This is too heavy !");

else if (vItem == null)
{
this.aGui.println("Item doesn't exist");
}

~ 27 ~
else if (this.aPlayer.getCurrentRoom().getItemList().hasItem(vCommand)
)
{
this.aPlayer.setMaxWeight(this.aPlayer.getMaxWeight()-
vItem.getWeight());
this.aPlayer.getItemInv().addItem(vCommand,vItem);
this.aPlayer.getCurrentRoom().getItemList().removeItem(vCommand);
this.aGui.println (this.aPlayer.getItemInv().getInventoryString() + ".\n"
+this.aPlayer.getCurrentRoom().getLongDescription());
}
}
}



private void drop(final Command pCommand){

String vCommand = pCommand.getSecondWord();
Item vItem = this.aPlayer.getItemInv().getItem(vCommand);

if (!pCommand.hasSecondWord())
{
aGui.println("Drop what ?");
return;
}

else if (this.aPlayer.getItemInv().hasItem(vCommand) )
{
this.aPlayer.setMaxWeight(this.aPlayer.getMaxWeight() +
vItem.getWeight());
this.aPlayer.getItemInv().removeItem(vCommand);
this.aPlayer.getCurrentRoom().getItemList().addItem(vCommand,vItem);

~ 28 ~
this.aGui.println (this.aPlayer.getItemInv().getInventoryString() + ".\n"
+this.aPlayer.getCurrentRoom().getLongDescription());
}

else
{
aGui.println("Item doesn't exist");
}
}



7.31.1. Classe ItemList

wCration de la classe ItemList :

import java.util.ArrayList;
import java.util.HashMap;

public class ItemList
{
private HashMap <String, Item> aCollection;
private ArrayList <Item> aListe;


public ItemList()
{
this.aCollection = new HashMap <String, Item> ();
this.aListe = new ArrayList <Item> ();
} //ItemList()


public String getItemStrings ()

~ 29 ~
{

StringBuilder returnString = new StringBuilder( "Items:" );
for ( String vA : aCollection.keySet() )
returnString.append( " " + vA );
return returnString.toString();
}

public Item getItem (final String pName)
{
return aCollection.get(pName);
}

public void addItem (final String pName,final Item pItem)
{
aCollection.put(pName,pItem);
}

public void removeItem (final String pName)
{
aCollection.remove(pName);
}

} // ItemList


wDans la classe Player :

-On cre lattribut : private ItemList aInventory;
-On ajoute la mthode getItemInv() :

public ItemList getItemInv()
{

~ 30 ~
return this.aInventory ;
}

-On modifie lemplacement des objets dans les salles par :
vBaldad.getItemList().addItem("Falcon", vFalcon);



7.32. Poids Max

Dj fait prcdemment dans la classe Player et dans la classe GameEngine (mthode
take()).



7.33. Inventaire

wDans la classe CommandWords :
- On ajoute inventory dans le tableau de Strings aValidCommands.

wDans la classe GameEngine :
- On modifie la mthode interpretCommand() pour prendre inventory en
compte :
else if (commandWord.equals( inventory ))
this.inventory() ;


wDans la classe ItemList :

-On ajoute la mthode getInventoryString pour retourner une description dtaille de
linventaire :

~ 31 ~
public String getInventoryString ()
{
StringBuilder returnString = new StringBuilder( "You've got" );

for ( String vA : aCollection.keySet() ){
returnString.append( " " + vA);
for(Item vB: aCollection.values())
returnString.append("" + vB);
}
return returnString.toString();
}





7.34. magic cookie

wDans la classe GameEngine :

-On cre dans la mthode createRooms() un nouvel item (cookie) :

Item Caravan = new Item(1, "Caravan");
magicCookie.setEdible(true);

-On le place ensuite dans une salle :

vBaldad.getItemList().addItem("Caravan", magicCookie);

-On modifie dans la mthode interpretCommand() la gestion du mot de
commande eat afin de grer un second mot dans la mthode eat() :

else if (commandWord.equals( inventory ))
this.eat(vCommand) ;

~ 32 ~
-On modifie la mthode eat() de la sorte :

private void eat()
{

if(! pCommand.hasSecondWord())
{
this.aGui.println("Eat what ?");
return;
}

String vName = pCommand.getSecondWord();

if(! aPlayer.getItemInv().hasItem(vName))
{
this.aGui.println("You have not any " + vName);
return;
}

Item vItem = aPlayer.getItemInv().getItem(vName);

if(! vItem.isEdible())
{
this.aGui.println("You can't eat " + vName);
}

this.aPlayer.getItemInv().removeItem(vName);
this.aGui.println("You have " + vName);

if( vName.equals("Caravan"))
{
this.aPlayer.setMaxWeight(aPlayer.getMaxWeight() + 1000);
this.aGui.println("You can now wear more items");

~ 33 ~
}

}


wDans la classe Item :

-On cre lattribut suivant : private boolean aEdible ;

-On rajoute dans le constructeur :

this.aEdible= false;

-On ajoute deux nouvelles mthodes isEdible() et setEdible() ;

public boolean isEdible()
{
return aEdible;
}


public void setEdible(final boolean pEdible)
{
this.aEdible = pEdible;
}


wDans la classe ItemList :

-On ajoute la mthode hasItem() :

public boolean hasItem(final String pName)
{

~ 34 ~
return aCollection.containsKey(pName);
}




7.34.1. Mise jour des fichiers de test

look take Caravan
eat eat Caravan
help back
inventory take ArslanSword
go North drop ArslanSword




7.35. zuul-with-enums-v1

wOn modifie le projet en fonction du modle de zuul-with-enums-v1.



7.35.1. Switch

wDans la classe GameEngine :

-On implmente le switch pour remplacer la suite de if/else if :

switch (vCommandWord)
{
case HELP: printHelp();

~ 35 ~
break;

case GO: goRoom(vCommand);
break;

case QUIT: if (vCommand.hasSecondWord())
{
this.aGui.println("Quit what ?");
}//if
else
this.endGame();
break;

case LOOK: look();
break;

case EAT: eat(vCommand);
break;

case BACK: back();
break;

case TEST: test(vCommand);
break;

case TAKE: take(vCommand);
break;

case DROP: drop(vCommand);
break;

case INVENTORY: inventory();
break;

~ 36 ~

case TELEPORT: teleport(vCommand);
break;

case LOAD: load(vCommand);
break;

default: this.aGui.println("I don't know what you mean...");
break;
}





7.41.1. zuul-with-enums-v2

wDans lenum CommandWords :

-On ajoute les valeurs de type String sur le modle :

GO("go"), QUIT("quit"), HELP("help"), UNKNOWN("?"), LOOK("look"),
EAT("eat"), BACK("back"), TEST("test"), TAKE("take"), DROP("drop"),
INVENTORY("inventory") ;

-On ajoute le constructeur CommandWord() ainsi que la mthode toString()
explicits dans le projet zuul-with-enums-v2 :

CommandWord(final String pCommandString)
{
this.aCommandString = pCommandString;
}

~ 37 ~
public String toString()
{
return aCommandString;
}


wDans la classe CommandWords :

-On remplace dans le constructeur CommandWords() la suite de .put() par la
boucle for comme dcrite dans le modle.




7.42. Time Limit

wDans la classe GameEngine :

-On ajoute un attribut : private int aLimit ;

-On cre lobjet dans le constructeur :

this.aLimit = 100 ;

-On ajoute dans la mthode goRoom() :

aLimit --;
this.aGui.setTimer("" + aLimit);
if(aLimit <= 0)
{
this.aGui.println("Your crusade is over, young prince.");
this.endGame();
aTimer.stop();
}

~ 38 ~






7.42.1. Time Limit with Timer

wDans la classe GameEngine :

-On ajoute : import java.awt.event.ActionEvent ;
import java.awt.event.ActionListener ;
import javax.swing.Timer ;


-On cre lattribut : private Timer aTimer ;

-On ajoute dans le constructeur : this.aTimer = new Timer(1000, this) ;
this.aTimer.start() ;

-On ajoute galement dans la mthode setGui(UserInterface pUserInterface) :
this.aGui.setTimer ( + aLimit) ;

-On supprime de la mthode goRoom() :


aLimit --;
this.aGui.setTimer("" + aLimit);
if(aLimit <= 0)
{
this.aGui.println("Your crusade is over, young prince.");
this.endGame();
aTimer.stop();

~ 39 ~
}

-On cre une nouvelle mthode :

@Override public void actionPerformed( ActionEvent pE)
{
aLimit --;
this.aGui.setTimer("" + aLimit);
if(aLimit <= 0)
{
this.aGui.println("Your crusade is over, young prince.");
this.endGame();
aTimer.stop();
} }


wDans la classe UserInterface :

-On ajoute lattribut suivant : private JtextArena log, aTimer ;

-On ajoute la mthode setTimer() :

public void setTimer(String pText)
{
aTimer.setText(pText);
}

-On ajoute dans la mthode createGUI() :

aTimer = new JtextArea() ;
aTimer.setEditable(false) ;

vPanel1.add(aTimer, BorderLayout.EAST)

~ 40 ~





7.43. Trap Door

wDans la classe GameEngine :

-On modifie le else de la mthode back() de la faon suivante :

else{
if(aPlayer.getCurrentRoom().getTrapRoom())
{
this.aGui.println("You can go back anymore... you must defeat Hilmes
before backup arrive");
}

else{
Room vLastRoom = this.aPreviousRoom.pop();
this.aPlayer.aCurrentRoom = vLastRoom;
this.aGui.println("\n" + aPlayer.aCurrentRoom.getLongDescription() + "\n");

if (aPlayer.aCurrentRoom.getImageName() !=null)
{
this.aGui.showImage(aPlayer.aCurrentRoom.getImageName());
}
}
}


wDans la classe Room :

~ 41 ~
-On ajoute : import java.util.Set;
private boolean aTrapRoom;

-On cre un accesseur getTrapRoom() et un modificateur setTrapRoom() :


public boolean getTrapRoom()
{
return aTrapRoom;
}

public void setTrapRoom(final boolean pTrapRoom)
{
this.aTrapRoom = pTrapRoom;
}





7.44. Beamer

wCration dune classe Beamer qui hrite de la classe Item :

public class Beamer extends Item
{
private Room aSavedRoom;
private boolean aLoaded;


public Beamer(final double pWeight, final String pDescription)
{
super(pWeight, pDescription);
aLoaded = false;

~ 42 ~
}


public Room getSavedRoom()
{
return aSavedRoom;
}


public void setSavedRoom(final Room pSavedRoom)
{
this.aSavedRoom = pSavedRoom;
}


public boolean isLoaded()
{
return aLoaded;
}


public void setLoaded(final boolean pLoaded)
{
this.aLoaded = pLoaded;
}
}


wDans la classe GameEngine :

-On ajoute une mthode load() et une mthode teleport() de la faon suivante :

public void load(final Command pCommand)

~ 43 ~
{
Room vRoomLoad = aPlayer.getCurrentRoom();
Item vItem = aPlayer.getItemInv().getItem("beamer");

if(! pCommand.hasSecondWord())
{
this.aGui.println("\n" + "What do you want to load ?");
}//if

else {

if( pCommand.getSecondWord().equals("beamer"))
{
if(vItem == null)
{
this.aGui.println("\n" + "You don't have the teleporter with you.");
}

else {
try{ vItem = (Beamer) vItem;}
catch (final Exception ClassCastException)
{this.aGui.println("\n" + "This isn't a teleporter");
return;
}//catch

Beamer vBeamer = (Beamer) vItem;
vBeamer.setSavedRoom(vRoomLoad);
vBeamer.setLoaded(true);

this.aGui.println("The item which is loaded in the teleporter is : " +
aPlayer.getCurrentRoom().getLongDescription());
}//else
}//if

~ 44 ~

else {
this.aGui.println("You don't have this on you.");
}//else
}//else
}//load


public void teleport(final Command pCommand)
{
Item vItem = aPlayer.getItemInv().getItem("beamer");

if(vItem == null)
{
this.aGui.println("You don't have a teleporter with you.");
}

else {
try{ vItem = (Beamer) vItem;
}
catch (final Exception ClassCastException)
{
this.aGui.println("This item isn't a teleporter.");
return;
}

Beamer vBeamer = (Beamer) vItem;

if(!vBeamer.isLoaded())
{
this.aGui.println("The teleporter wasn't loaded.");
}

~ 45 ~
else {
this.aPlayer.setCurrentRoom(vBeamer.getSavedRoom());
this.aPlayer.getCurrentRoom().getLongDescription();
this.aGui.showImage(this.aPlayer.getCurrentRoom().getImageName());
}
}
}


wDans enum CommandWords :

-On ajoute la valeur teleport et load de type String :

...TELEPORT("teleport"), LOAD("load") ;





7.45.1. Fichiers de Test

look take Caravan
eat eat Caravan
help back
inventory take ArslanSword
go North drop ArslanSword
load teleport
load beamer quit




~ 46 ~
7.46. TransporterRoom

wCration de la classe TransporterRoom :


import java.util.HashMap;
import java.util.ArrayList;

public class TransporterRoom extends Room
{
private HashMap<String, Room> aRooms;
private ArrayList<Room> aArrayInRooms;
private RoomRandomizer aRandomRoom;

public TransporterRoom(final String pDescription, String pImage, final
HashMap<String, Room> pRooms)
{
super(pDescription, pImage);
this.aRooms = pRooms;
this.aArrayInRooms = new ArrayList<Room>();

for(Room vA : aRooms.values())
{
aArrayInRooms.add(vA);
}
}

@Override public Room getExit(final String pDirection)
{
this.aRandomRoom = new RoomRandomizer();
int vI = aRandomRoom.nextRoom(aRooms.size());
return this.aArrayInRooms.get(vI);
} }

~ 47 ~

wCration de la classe RoomRandomizer :

import java.util.Random;

public class RoomRandomizer
{
private Random aRandom;

public RoomRandomizer()
{
this.aRandom = new Random();
}

public int nextRoom(final int pRoom)
{
return aRandom.nextInt(pRoom);
}
}


wDans la classe GameEngine :

-On modifie dans la mthode createRooms() la pice qui va envoyer le joueur
dans une pice alatoire de la map :

TransporterRoom vThroneRoom= new TransporterRoom("in Ectabana, you're in
the throne room", "Images/Throne's room.jpg", aRooms);

-On ajoute une instruction telle que la pice dans laquelle le joueur sera envoy
par la pice nouvellement renomme TransporterRoom :

aRooms.put("vEctabana1", vCastleCourtyard);

~ 48 ~
7.47. Abstract command

wDans la classe Command :

-On modifie la classe Command de telle sorte quelle soit une classe abstraite.

-On ajoute la mthode abstraite :

public abstract void execute(final Player pPlayer) ;

-On supprime lattribut : private CommandWord aCommandWord ;

-On supprime les paramtres du constructeur :

public Command(){
}

-On modifie la mthode isUnknown() :

public void setSecondWord(final String pSecondWord)
{
this.aSecondWord = pSecondWord ;
}


wPour chaque commande, cration dune classe qui hrite de Command :

-Ainsi chaque classe sera de la forme :

public class QuitCommand extends Command
{
public QuitCommand(){
}

~ 49 ~

@Override public boolean execute(final Player pPlayer)
{
GameEngine.aGui.println("Thanks to play. See you soon.");
GameEngine.aGui.enable(false);

return true;
}
}


wLa mthode execute() remplace chaque mthode spcifique sa commande :

GameEngine execute()

Au paramtre command this.
Lattribut aPlayer pPlayer
this.aGui.println() GameEngine.aGui.println



wDans la classe GameEngine :

-On a dplac les mthodes goRoom(), help(), quit(), back(), look(), eat(), take(),
drop(), load(), teleport(), test(), inventory() dans les mthodes execute() de leurs
classes respectives (GoCommand, HelpCommand, QuitCommand etc...)

-On modifie la mthode interpretCommand() :

public static void interpretCommand(final String pCommandLine)

{
aGui.println(pCommandLine);

~ 50 ~
Command vCommand = aParser.getCommand(pCommandLine);

if(vCommand == null)
{
aGui.println("I don't know what you mean...");
}

else{
vCommand.execute(pPlayer);
}
aGui.print("\n");
}//processCommand


wDans lenum CommandWord :

-On modifie les lments de lenum de la faon suivante :

GO("go", new GoCommand()),

-On modifie ds lors le constructeur :

CommandWord(final String pCommandString, final Command pCommand)
{
this.aCommandString = pCommandString;
this.aCommand = pCommand;
}


-On ajoute un accesseur getCommand() :

public Command getCommand()
{

~ 51 ~
return this.aCommand;
}



wDans la classe CommandWords :


-On ajoute un attribut : private HashMap<String, Command> aValidCommands;


-On modifie le contructeur :


public CommandWords()
{
aValidCommands = new HashMap<String, Command>();

for(CommandWord vCommand : CommandWord.values())
{
if(vCommand != CommandWord.UNKNOWN){
aValidCommands.put(vCommand.toString(), vCommand.getCommand());
}
}
} // CommandWords()




-On ajoute la mthode get() dcrite dans le zuul-even-better :


public Command get(final String pCommandWord)
{
return (Command)aValidCommands.get(pCommandWord);
}




wDans la classe Parser :


-On modifie la fin de la mthode getCommand() :


public Command getCommand(String inputLine)
{

~ 52 ~

String word1 = null;
String word2 = null;

Scanner tokenizer = new Scanner(inputLine);

if(tokenizer.hasNext()){
word1 = tokenizer.next();
if(tokenizer.hasNext()){
word2 = tokenizer.next();
}
}

Command vCommand = aValidCommands.get(word1);

if(vCommand != null)
{
vCommand.setSecondWord(word2);
}

return vCommand;
}



7.47.1. Paquetages

wCration de 5 paquetages :

- pkg_mechanics qui contient les classes GameEngine et UserInterface ,

- pkg_commands qui contient les classes CommandWord, CommandWords,
Command, Parser, GoCommand, HelpCommand...

- pkg_items qui contient les classes Item, Beamer et ItemList,

- pkg_characters qui contient la classe Player

- pkg_rooms qui contient les classes RoomRandomizer, Room et
TransporterRoom.

~ 53 ~
7.48. Character

wCration de la classe Characters :

public class Characters
{
private String aNameCharacters;
private String aTalk;

public Characters(final String pNameCharacters, final String pTalk) {
this.aNameCharacters = pNameCharacters;
this.aTalk = pTalk;
}

public String getNameCharacters()
{
return this.aNameCharacters;
}


public String getTalk()
{
return this.aTalk;
}
}







~ 54 ~
wDans la classe Room :

-On ajoute un attribut : private Characters aCharacters;

-On ajoute dans le constructeur : this.aCharacters = new Characters(null, null);

-On ajoute les mthodes addCharacters() et getCharacters()


public void addCharacters(final Characters pCharacters)
{
this.aCharacters = pCharacters;
}

public Characters getCharacters()
{
return aCharacters;
}



wDans la classe GameEngine :

-On cre tous les characters de la faon suivante :

Characters vHilmes = new Characters("Hilmes ", "Arslan...The humiltation and hardship
that I have suffered to this day...I will make sure that you suffer the same as I have!" );


-On les implmente dans leur pice :

vThroneRoom.addCharacters(vHilmes);

~ 55 ~
IV. Dclaration obligatoire anti-plagiat

wA Axel Aboyeji pour lemprunt de code aux exercices 7.32 (Poids Max) et 7.46 (classes
TransporterRoom et RoomRandomizer).

wA Nicolas hahn pour lemprunt de code suivant au niveau de la boucle else if(mais avec
quelques modifications de ma part) :

...

else if (!vCharacters.getNameCharacters().equals(getSecondWord()))
{
GameEngine.aGui.println("There is no one who's named " + getSecondWord());
}

else{
GameEngine.aGui.println(vCharacters.getTalk());
}
}

return false;
}//else
}//TalkCommand

~ 56 ~

Vous aimerez peut-être aussi