1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
| /**
* Cette classe est la classe principale de l'application "le monde de Zuul".
* "Le monde de Zuul" est un jeu d'aventures très simple en mode texte.
* Les utilisateurs peuvent se promener dans le décor. C'est tout.
* Elle devrait vraiment être étendue pour rendre le jeu plus intéressant !
*
* Pour jouer à ce jeu, créez une instance de cette classe
* et appelez la méthode "play".
*
* Cette classe principale crée et initialise toutes les autres :
* elle crée toutes les pièces, crée l'analyseur syntaxique et démarre le jeu.
* Elle évalue aussi et exécute les commandes renvoyées par l'analyseur syntaxique.
*
* @author Michael Kolling et David J. Barnes
* @version 2008.03.30
*/
public class Game
{
private Parser parser;
private Room currentRoom;
/**
* Création du jeu et initialisation de sa carte interne.
*/
public Game()
{
createRooms();
parser = new Parser();
}
/**
* Création des pièces et des liens entre les sorties des pièces
*/
private void createRooms()
{
Room outside, theatre, pub, lab, office;
// création des pièces
outside = new Room("à l'extérieur de l'entrée principale de l'Université");
theatre = new Room("dans un amphithéâtre");
pub = new Room("à la cafétéria");
lab = new Room("dans la salle informatique");
office = new Room("au bureau des techniciens");
// initialisation des sorties des pièces
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);
currentRoom = outside; // début de la partie ailleurs
}
/**
* Fonction principale de jeu. Boucle jusqu'à la fin du jeu.
*/
public void play()
{
printWelcome();
// Entrée dans la boucle principale des commandes. Ici, nous
// répétons la lecture et l'exécution des commandes jusqu'à la fin du jeu.
boolean finished = false;
while (! finished) {
Command command = parser.getCommand();
finished = processCommand(command);
}
System.out.println("Merci d'avoir joué. Au revoir.");
}
/**
* Affichage du message d'accueil au joueur.
*/
private void printWelcome()
{
System.out.println();
System.out.println("Bienvenue au jeu de Zuul !");
System.out.println("Zuul est un nouveau jeu d'aventure terriblement ennuyeux.");
System.out.println("Tapez 'aide' si vous avez besoin d'aide.");
System.out.println();
System.out.println("Vous êtes dans " + currentRoom.getDescription());
System.out.print("Les sorties : ");
if(currentRoom.northExit != null) {
System.out.print("nord ");
}
if(currentRoom.eastExit != null) {
System.out.print("est ");
}
if(currentRoom.southExit != null) {
System.out.print("sud ");
}
if(currentRoom.westExit != null) {
System.out.print("ouest ");
}
System.out.println();
}
/**
* Etant donné une commande, traiter (exécuter) la commande.
* @param command La commande à traiter.
* @return true Si la commande termine le jeu, false autrement.
*/
private boolean processCommand(Command command)
{
boolean wantToQuit = false;
if(command.isUnknown()) {
System.out.println("Je ne comprends pas cette commande...");
return false;
}
String commandWord = command.getCommandWord();
if (commandWord.equals("aide"))
printHelp();
else if (commandWord.equals("aller"))
goRoom(command);
else if (commandWord.equals("quitter"))
wantToQuit = quit(command);
return wantToQuit;
}
// implantation des commandes :
/**
* Affichage de l'aide.
* Nous affichons ici quelques messages stupides, mystérieux et
* une liste des ordres.
*/
private void printHelp()
{
System.out.println("Vous êtes perdu. Vous êtes seul. Vous errez");
System.out.println("dans l'université.");
System.out.println();
System.out.println("Les commandes sont :");
System.out.println(" aller quitter aide");
}
/**
* Essai de déplacement dans une direction. Si une sortie existe,
* entrer dans la nouvelle pièce, sinon afficher un message d'erreur.
*/
private void goRoom(Command command)
{
if(!command.hasSecondWord()) {
// en cas d'absence du deuxième mot, nous ne savons pas où aller...
System.out.println("Aller où ?");
return;
}
String direction = command.getSecondWord();
// nous essayons de quitter la pièce courante.
Room nextRoom = null;
if(direction.equals("nord")) {
nextRoom = currentRoom.northExit;
}
if(direction.equals("est")) {
nextRoom = currentRoom.eastExit;
}
if(direction.equals("sud")) {
nextRoom = currentRoom.southExit;
}
if(direction.equals("ouest")) {
nextRoom = currentRoom.westExit;
}
if (nextRoom == null) {
System.out.println("Il n'y a pas de porte !");
}
else {
currentRoom = nextRoom;
System.out.println("Vous êtes " + currentRoom.getDescription());
System.out.print("Les sorties : ");
if(currentRoom.northExit != null) {
System.out.print("nord ");
}
if(currentRoom.eastExit != null) {
System.out.print("est ");
}
if(currentRoom.southExit != null) {
System.out.print("sud ");
}
if(currentRoom.westExit != null) {
System.out.print("ouest ");
}
System.out.println();
}
}
/**
* "Quitter" vient d'être saisi. Vérification du reste de la commande
* pour s'assurer que nous voulons réellement quitter le jeu.
* @return true si cette commande arrête le jeu, false autrement.
*/
private boolean quit(Command command)
{
if(command.hasSecondWord()) {
System.out.println("Quitter quoi ?");
return false;
}
else {
return true; // informe que nous voulons quitter le jeu
}
}
} |
Partager