Exercise 7

Les notes de cours et exercices seront disponibles sur le site web du cours à l'
adresse ... Tout au long de la session, de nombreuses activités formatives
contribueront à l'acquisition des compétences et à la préparation des examens.
Consignes ... Design patterns , tête la première Traduction de Marie-Cécile
Baland.

Part of the document


Exercise 7.1 Open the project zuul-bad. (This project is called 'bad'
because its
implementation contains some bad design decisions, and we want to leave no
doubt
that this should not be used as an example of good programming practice!)
Execute
and explore the application. The project comment gives you some information
about
how to run it.
While exploring the application, answer the following questions:
¦ What does this application do?
¦ What commands does the game accept?
¦ What does each command do?
¦ How many rooms are in the scenario?
¦ Draw a map of the existing rooms.
What does this application do?
L'extrait suivant du commentaire d'en-tête de la classe « Game » nous donne
la réponse. * "World of Zuul" is a very simple, text based adventure game. Users
* can walk around some scenery. That's all.
*
* To play this game, create an instance of this class and call the "play"
* method.
*
* This main class creates and initialises all the others: it creates all
* rooms, creates the parser and starts the game. It also evaluates and
* executes the commands that the parser returns. What commands does the game accept?
Les commandes acceptées peuvent être lues en début de la classe
« CommandWords » où l'on définit les champs de la classe. private static final String[] validCommands = {
"go", "quit", "help", "look"
}; On remarque que cette classe n'a pas de variables d'instance, mais
seulement une variable de classe (mot clef « static » ), à savoir le
tableau de String « validCommands ».
Ce tableau a ici cellules remplies avec les 4 commandes acceptées, à savoir
"go", "quit", "help", "look". What does each command do?
La méthode « processCommand » de la classe « Game » donne la réponse.
private boolean processCommand(Command command) if (commandWord.equals("help"))
printHelp();
else if (commandWord.equals("go"))
goRoom(command);
else if (commandWord.equals("quit"))
wantToQuit = quit(command);
return wantToQuit; La commande « look » n'est pas traitéee ! Il n'y a aucun test du type « si
command == « look » ni dans cette méthode « processCommand » ni ailleurs. La commande "help" envoie à la méthode « printhelp » de cette même classe. Cette méthode « printhelp » imprime quelques remarques et signale que les
commandes autorisées sont "go", "quit", "help". Elle « oublie » la commande
« look ». La commande « go » envoie à la méthode « goRoom ».
Cette méthode « goRoom »
. contrôle l'existence d'un 2ème mot de commande après le « go »,
. contrôle que ce 2ème mot indique une direction (north, south, east ou
west)
. positionne « nextRoom » à la Room située dans la direction indiquée
par ce 2ème mot de commande
. actualise « currentroom » par "currentRoom=nextRoom"
. indique les sorties existantes (north, south, east ou west) de la
nouvelle « currentRoom » La commande « quit » positionne « wantToQuit » au booléen retourné par la
méthode « quit ».
Cette méthode « quit » :
. imprime un message d'erreur et retourne « false » si la commande
« quit » a un 2ème mot de commande
. retourne « true » autrement. Ce « true » est un contrôle de bonne
saisie de la commande « quit ».
Donc de la méthode « quit » on remonte à la méhode « processCommand » puis
à la méthode « play » (d'où la méthode « processCommand » a été appelée)
avec « true » comme retour.
Cela positionne (dans la méthode « play » ) « finished » à « true »; ce qui
déclenche l'impression du « good bye ». How many rooms are in the scenario?
Réponse dans la méthode « createRooms » de la classe "Game" outside = new Room("outside the main entrance of the university");
theatre = new Room("in a lecture theatre");
pub = new Room("in the campus pub");
lab = new Room("in a computing lab");
office = new Room("in the computing admin office"); On a 5 Rooms : "outside", "theatre", "pub", "lab", "office". Draw a map of the existing rooms
Cette map se dresse avec les exit indiquées dans la méthode « createRooms » outside.setExits(null, theatre, lab, pub);
theatre.setExits(null, null, null, outside);
pub.setExits(null, outside, null, null);
lab.setExits(outside, office, null, null);
office.setExits(null, null, null, lab); sorties à prendre dans l'ordre nord, est, sud, ouest, comme l'indique le
prototype de la méthode « setExits » de la classe « Room » public void setExits(Room north, Room east, Room south, Room west) Exercise 7.2 After you know what the whole application does, try to find
out what
each individual class does. Write down for each class the purpose of the
class. You
need to look at the source code to do this. Note that you might not (and
need not)
understand all of the source code. Often, reading through comments and
looking at
method headers is enough. Classe Game :
. par sa (méthode "play"), demande à la méthode « getCommand » de la
classe « Parser » de lui renvoyer la commande saisie sous la forme
d'une instance « command » de classe « Command »
. demande à sa méthode « processCommand » de traiter la commande saisie
(help, goRoom, quit) comme déjà commenté.
Cette méthode « processCommand » s'appuie sur les méthodes
« isUnknown » et « getCommandWord » de la classe « Command »
appliquées à l'instance « command »
. de plus : le constructeur « Game » crée les Rooms en lançant la
méthode « createRooms » de la classe « Game » et crée une instance de
la classe « Parser » Classe Parser :
. par son constructeur "Parser", crée une instance « commands » de la
classe "CommandWords"
. par sa méthode « getCommand »,
o saisit dans la variable locale « reader » de type
« BufferedReader » la ligne tapée par l'utilisateur
o à l'aide de la variable locale "tokenizer" de type
"StringTokenizer", met le 1er et 2ème mot de la commande tapée
dans les variables locales « word1 » et « word2 » de type
« String »
o à l'aide d'une nouvelle instance de la classe Command, renvoie
« word1 » (« Null » si word1 n'est pas dans le tableau
validCommands de la classe « CommandWords ») et « word2 » à son
appelant (pour rappel : la méthode « play » de la classe
« Game » ) Classe CommandWords :
. par sa méthode « isCommand » (qui recoit en argument word1) , vérifie
que cet argument reçu est acceptable (c.a.d appartient au tableau de
string validCommands ) Classe Command :
. a 2 attributs d'instance private "commandWord" et "secondWord"
. son contructeur initialise ces 2 attributs aux 2 arguments qu'il
reçoit (word1 (ou « Null ») et word2)
. a 2 méthodes 'getCommandWord' et 'getSecondWord' pour livrer à
l'appelant ses 2 attributs private
. une méthode « isUnknown » qui renvoie « true » si le 1er attribut est
null
. une méthode « hasSecondWord » qui renvoie « true » si le 2ème attribut
n'est pas null Classe Room :
. son constructeur positionne la variable d'instance « description » de
type « string » à l'argument qu'il reçoit (de fait de la méthode
« createRooms » de la classe « Game »
. sa méthode « setExits » positionne les variables d'instance
« northExit », « southExit », « eastExit », « westExit » de classe
« Room » aux 4 arguments qu'elle reçoit
. sa méthode « getDescription » renvoie la variable « description » à
l'appelant (méthode à priori superflue, la variable « description »
étant public). Exercise 7.3 Design your own game scenario. Do this away from the computer.
Do
not think about implementation, classes, or even programming in general.
Just think
about inventing an interesting game. This could be done with a group of
people.
The game can be anything that has as its base structure a player moving
through different
locations. Here are some examples:
¦ You are a white blood cell traveling through the body in search of
viruses to attack...
¦ You are lost in a shopping mall and must find the exit...
¦ You are a mole in its burrow and you cannot remember where you stored
your food
reserves before winter...
¦ You are an adventurer who searches through a dungeon full of monsters and
other
characters...
¦ You are from the bomb squad and must find and defuse a bomb before it
goes off...
Make sure that your game has a goal (so that it has an end and the player
can 'win').
Try to think of many things to make the game interesting (trap doors, magic
items,
characters that help you only if you feed them, time limits, whatever you
like). Let your
imagination run wild.
At this stage, do not worry about how to implement these things. Exercise 7.4 Draw (on paper) a map for the game you invented in exercise
7.3. Open
the zuul-bad project, and save it under a different name (e.g. zuul). This
is the project
you will use to make improvements and modifications throughout this
chapter. You can
leave off the -bad suffix, since it will soon (hopefully) not be that bad
anymore.
As a first step, change the createRooms method in the Game class to create
the
rooms and exits you invented for your game. Test! private void createRooms()
{
Room breiffing_room, armurie, under_sea, sea, beach, forest, town,
ski_piste,
castle_front, base_stage1, base_stage2, geolier_room,
senator_prison; // create the rooms
breiffing_room = new Room("dans la salle de breiffing");
armurie = new Room("dans l'armurie");
under_sea = new Room("en milieu sous marins");
sea = new Room("en mer");
beach = new Room("sur la plage");
forest = new Room("dans l'horible et sauvage forêt");
town = new Room("dans la ville tenue par les ravisseurs");
ski_piste = new Room("sur la piste de ski");
c