001import java.util.Stack; 002import java.io.File; 003import java.util.Scanner; 004import java.io.FileNotFoundException; 005/** 006 * This class is part of the "Pere-Noel" application. 007 * "Pere Noel" is a very simple, text based adventure game. 008 * 009 * This class creates all rooms, creates the parser. It also evaluates and executes the commands that 010 * the parser returns. 011 * 012 * @author Célia PRIOL & Benoît CHAUVEAU 013 * 014 */ 015public class GameEngine 016{ 017 private Parser parser; 018 private Player aPlayer; 019 private UserInterface gui; 020 private CommandWords commande; 021 private Item Objets; 022 private Stack<Room> stack; 023 private int aMove = 0; 024 private int aMaxMove = 30; 025 private Room salon, bibliotheque, cuisine, cour, cabane, couloir, lagrandechambre, WC, salledejeu, chambrerouge, chambrebleue, chambreverte, placard, dressing, salledebain ; 026 027 /** 028 * Constructor for objects of class GameEngine 029 */ 030 public GameEngine() 031 { 032 parser = new Parser(); 033 createRooms(); 034 stack = new Stack<Room>(); 035 aPlayer = new Player("pièce", salon); 036 } 037 038 public void setGUI(UserInterface userInterface) 039 { 040 gui = userInterface; 041 printWelcome(); 042 } 043 044 /** 045 * Print out the opening message for the player. 046 */ 047 private void printWelcome() 048 { 049 String vPrenom = javax.swing.JOptionPane.showInputDialog( "Quel est ton prénom ?" ); 050 gui.print("\n"); 051 gui.println("Bonjour" + " " + vPrenom +"."+"\n"+"\n"+"Bienvenue dans : L'enlèvement du Père Noël ! "); 052 gui.println("Le Père Noël a été capturé ! Nous avons besoin de toi, détective" + " " + vPrenom + " !" + "\n"); 053 gui.println("Clique sur ''AIDE'' si tu es bloqué. "); 054 gui.println(aPlayer.getcurrentRoom().getLongDescription()); 055 gui.showImage (aPlayer.getcurrentRoom().getImageName()); 056 } 057 058 /** 059 * Create all the rooms and link their exits together. 060 */ 061 private void createRooms() 062 { 063 //Room salon, bibliotheque, cuisine, cour, cabane, couloir, lagrandechambre, WC, salledejeu, chambrerouge, chambrebleue, chambreverte, placard, dressing, salledebain; 064 // create the rooms 065 salon = new Room("dans le salon", "images/salon.jpg"); 066 bibliotheque = new Room("dans la bibliothèque", "images/bibli3.jpg"); 067 cuisine = new Room("dans la cuisine", "images/cuisine.jpg"); 068 cour = new Room("dans la petite cour", "images/cour.jpg"); 069 cabane = new Room("dans la cabane", "images/cabane.png"); 070 couloir = new Room("dans le couloir à l'étage", "images/couloir etage.jpg"); 071 lagrandechambre = new Room("dans la grande chambre à l'étage","images/grandechambre.jpg"); 072 WC = new Room("dans les toilettes à l'étage", "images/toilettes.jpg"); 073 salledejeu = new Room("dans la salle de jeu à l'étage", "images/sallejeu.png"); 074 chambrerouge = new Room("dans la chambre rouge à l'étage", "images/chambrerouge.jpg"); 075 chambrebleue = new Room("dans la chambre bleue à l'étage", "images/chambrebleue.jpg"); 076 chambreverte = new Room("dans la chambre verte à l'étage", "images/chambreverte.jpg"); 077 placard = new Room("dans le placard", "images/penderiepn.png"); 078 dressing = new Room("dans le dressing", "images/dressing.jpg"); 079 salledebain = new Room("dans la salle de bain à l'étage", "images/sdb.jpg"); 080 081 // initialise room exits 082 salon.setExits("nord",bibliotheque); 083 salon.setExits("haut",couloir); 084 bibliotheque.setExits("nord", cuisine); 085 bibliotheque.setExits("sud",salon); 086 cuisine.setExits("est", cour); 087 cuisine.setExits("sud", bibliotheque); 088 cour.setExits("est", cabane); 089 cour.setExits("ouest",cuisine); 090 cabane.setExits("ouest", cour); 091 couloir.setExits("est", salledejeu); 092 couloir.setExits("sud",lagrandechambre); 093 couloir.setExits("bas", salon); 094 lagrandechambre.setExits("nord",couloir); 095 lagrandechambre.setExits("est", WC); 096 WC.setExits("ouest", lagrandechambre); 097 salledejeu.setExits("nord",chambrerouge); 098 salledejeu.setExits("ouest", couloir); 099 chambrerouge.setExits("nord",dressing); 100 chambrerouge.setExits("est", salledebain); 101 chambrerouge.setExits("ouest",chambrebleue); 102 chambrerouge.setExits("sud",null); 103 chambrebleue.setExits("est", chambrerouge); 104 chambrebleue.setExits("sud", chambreverte); 105 chambreverte.setExits("nord", chambrebleue); 106 chambreverte.setExits("est", placard); 107 placard.setExits("ouest", chambreverte); 108 dressing.setExits("sud", chambrerouge); 109 110 salledebain.setExits("ouest", chambrerouge); 111 salledebain.setExits("sud", salledejeu); 112 113 // creationdes items et initialisation de leur prix 114 Item cookie, cadeau1, clef, cadeau2, cadeau3, cadeau4 ; 115 // cookie = new Item("un cookie","cookie",0) ; 116 cadeau1 = new Item ( "le cadeau1","le cadeau1", 10 ); 117 cadeau2 = new Item ( "le cadeau2","le cadeau2", 10 ); 118 cadeau3 = new Item ( "le cadeau3","le cadeau3", 10 ); 119 cadeau4 = new Item ( "le cadeau4","le cadeau4", 10 ); 120 clef = new Item ( "une clef","une clef", 31 ); 121 cookie = new Item ( "un cookie","un cookie", 5 ); 122 123 //Initialise le nombre d'item dans chaque room 124 //cabane.setObjets(cadeau,2); 125 // cuisine.setObjets(cookie,1); 126 127 cuisine.setItem("cookie", cookie); 128 cabane.setItem("cadeau1", cadeau1); 129 cabane.setItem("cadeau2", cadeau2); 130 bibliotheque.setItem("clef", clef); 131 WC.setItem("cadeau3", cadeau3); 132 salledebain.setItem("cadeau4", cadeau4); 133 // piece de depart 134 //currentRoom = salon; // start game outside 135 136 } 137 138 /** 139 * Given a command, process (that is: execute) the command. 140 * If this command ends the game, true is returned, otherwise false is 141 * returned. 142 */ 143 public void interpretCommand(String commandLine) 144 { 145 gui.println(commandLine); 146 Command command = parser.getCommand(commandLine); 147 CommandWord commandWord = command.getCommandWord(); 148 149 switch(commandWord) 150 { 151 152 153 case UNKNOWN : gui.println("\n"+"Je ne vois pas ce que tu veux dire.. "+"\n"); 154 break; 155 case HELP : printHelp(); 156 break; 157 case QUIT : endGame(); 158 break; 159 case GO : goRoom(command); 160 break; 161 case LOOK : look(); 162 break; 163 case EAT : eat(command); 164 break; 165 case INVENTAIRE : inventaire(); 166 break; 167 case BACK : backRoom(); 168 break; 169 case DROP : drop(command); 170 break; 171 case TAKE : take(command); 172 break; 173 case USE: utiliser (); 174 break; 175 case LOAD : charger () ; 176 break; 177 case TEST : test(command); 178 break; 179 } 180 181 182 } 183 184// if(command.isUnknown()) { 185// gui.println("Je ne vois pas ce que tu veux dire ..."); 186// return ; 187// } 188// String commandWord = command.getCommandWord(); 189// if (commandWord.equals("help")) 190// printHelp(); 191// else if (commandWord.equals("go")) 192// goRoom(command); 193// else if (commandWord.equals("look")) 194// { 195// look(); 196// } 197// else if (commandWord.equals("eat")) 198// {eat(command); 199// } 200// else if (commandWord.equals("back")) 201// backRoom(); 202// else if (commandWord.equals("quit")) 203// { 204// if(command.hasSecondWord()) 205// gui.println("Quit what?"); 206// else 207// endGame(); 208// } 209// else if (commandWord.equals("take")) 210// { 211// take(command);//instruction à mettre après 212// }//condition pour savoir si take est entré 213// else if (commandWord.equals("drop")) 214// { 215// drop(command);//instruction à mettre après 216// }//condition pour savoir si deposer est entré 217 218 219 private void look() 220 { 221 gui.println(aPlayer.getcurrentRoom().getLongDescription()); 222 } 223 224 private void inventaire() 225 { 226 gui.print("\n"); 227 gui.println(aPlayer.getInventory()); 228 } 229 230 231 public void eat(Command command) 232 { 233 234 if(!command.hasSecondWord()) 235 { 236 gui.print("\n"); 237 gui.println("Que veux-tu manger ? "); 238 gui.print("\n"); 239 } 240 241 String vName = command.getSecondWord(); 242 243 if(aPlayer.getItem(vName) == null) 244 { 245 gui.print("\n"); 246 gui.println("Tu ne possèdes pas cet objet ! "); 247 gui.print("\n"); 248 } 249 else 250 { 251 gui.println("\n" +"Tu as mangé " + vName + ". "); 252 if (vName.equals("cookie")) 253 { 254 gui.println("Tu peux porter plus d'objets maintenant."); 255 gui.println("Le poids maximal que tu peux porter a été augmenté de 50 kg. "); 256 gui.print("\n"); 257 aPlayer.setMaxPoids(80); 258 } 259 else 260 { 261 gui.println("Tu viens de dévorer cet objet ! Quelle idée ! Tu ne l'as plus dans ton inventaire, dommage..."); 262 gui.print("\n"); 263 } 264 this.aPlayer.removeItem(vName); 265 } 266 } 267 268 /** 269 * Print out some help information. 270 * Here we print some stupid, cryptic message and a list of the 271 * command words. 272 */ 273 274 private void printHelp() 275 { 276 gui.print("\n"); 277 gui.println("Essaie de trouver des cadeaux. Il y en a 4 dans les différentes pièces de la maison. "); 278 gui.println("Et n'oublie pas non plus de retrouver le Père Noël...!" + "\n"); 279 gui.println("Attention, tu as un nombre de déplacements limité, si tu dépasse la limite, le soleil se lèvera, et les enfants n'auront "); 280 gui.println("pas leurs cadeaux."); 281 gui.println("Fais aussi attention, une pièce est piégée : la porte ne s'ouvre que d'un certain côté."); 282 gui.println("A toi de trouver ton chemin dans cette maison pas comme les autres !" + "\n"); 283 gui.println("Tes commandes sont :"+parser.showCommands()+". "); 284 gui.print("\n"); 285 286 } 287// /** 288// * Checks if the player is dead. 289// * The player dies when he has exceeded some number of moves. 290// */ 291// public boolean isDead() 292// { 293// return aMove > aMaxMove ; 294// } 295 /** 296 * Try to go to one direction. If there is an exit, enter the new 297 * room, otherwise print an error message. 298 */ 299 private void goRoom(Command command) 300 { 301 if(!command.hasSecondWord()) 302 { 303 // sans second mots nous ne savons pas ou aller 304 gui.print("\n"); 305 gui.println("Aller où ?"); 306 gui.print("\n"); 307 return; 308 } 309 310 String direction = command.getSecondWord(); 311 //Try to leave currentRoom. 312 // Try to leave current room. 313 Room nextRoom = aPlayer.getcurrentRoom().getExit(direction); 314 if (nextRoom == null) 315 { 316 gui.print("\n"); 317 gui.println("Il n'y a pas de porte ! Tu ne peux pas passer. "); 318 gui.print("\n");} 319 else { 320 stack.push(aPlayer.getcurrentRoom()); 321 aPlayer.changeRoom(nextRoom); 322 gui.println(aPlayer.getcurrentRoom().getLongDescription()); 323 if(aPlayer.getcurrentRoom().getImageName() != null) 324 gui.showImage(aPlayer.getcurrentRoom().getImageName()); 325 } 326 327 if(aMove >= aMaxMove ) 328 329 { 330 this.Dead(); 331 gui.enable(false); 332 } 333 else 334 { 335 this.aMove++ ; 336 } 337 338 Room nextRoom2 = aPlayer.getcurrentRoom(); 339 if (nextRoom2 == placard) 340 341 { 342 this.PrintVictoire(); 343 gui.enable(false); 344 } 345 } 346 347 public void PrintVictoire () 348 { 349 gui.println("\n" +"\n" +"BRAVO !" + "\n" + "\n" +"Tu as retrouvé le Père Noël !!!"+ "\n" + "Tous les enfants du monde te sont reconnaissants ( et Bernie aussi ;) ) !!"); 350 gui.println("\n" +"A bientôt pour de nouvelles aventures !"+ "\n"); 351 352 } 353 354 private void test( Command command ) 355 { 356 if ( stack.empty() == false ) { 357 gui.print("\n"); 358 gui.println( "Il est nécessaire de se trouver sur le palier pour pouvoir tester le jeu. " ); 359 gui.print("\n"); 360 return; 361 } 362 if ( !command.hasSecondWord() ) { 363 // if there is no second word, we don't know where to go... 364 gui.print("\n"); 365 gui.println( "Que veux tu tester ? " ); 366 gui.print("\n"); 367 return; 368 } 369 try { 370 File fichier= new File( command.getSecondWord() ); 371 Scanner scan= new Scanner( fichier ); 372 while ( scan.hasNextLine() ) { 373 interpretCommand( scan.nextLine() ); 374 } 375 } 376 catch ( Exception e ) { 377 gui.print("\n"); 378 gui.println( "Le fichier n'existe pas. " ); 379 gui.print("\n"); 380 } 381 } 382 383 public void backRoom() 384 { 385 if (stack.empty()==true){ 386 gui.print("\n"); 387 gui.println("Il n'y a pas de pièce. "); 388 gui.print("\n"); 389 } 390 else { 391 gui.print("\n"); 392 gui.println("Tu es dans la pièce précédente : "); 393 394 aPlayer.changeRoom((stack.pop())); 395 gui.println(aPlayer.getcurrentRoom().getLongDescription()); 396 if(aPlayer.getcurrentRoom().getImageName() != null) 397 {gui.showImage(aPlayer.getcurrentRoom().getImageName());} 398 } 399 } 400 401 private void endGame() 402 { 403 404 System.exit(0); 405 406 } 407 408 private void Dead() 409 { 410 gui.println("\n" +"\n" +"Trop tard, tu n'as pas reussi à retrouver le Père Noël à temps !"+"\n"); 411 gui.println("Merci d'avoir joué à ce jeu ! A bientôt." + "\n"+ "\n"+ "\n"); 412 413 } 414 415 /** 416 * Permet de prendre un objet 417 */ 418 419 private void take(Command command) 420 { 421 if (!command.hasSecondWord()) { 422 gui.print("\n"); 423 gui.println("Prendre quoi ? "); 424 gui.print("\n"); 425 return; 426 } 427 428 String vName = command.getSecondWord(); 429 Item vItem = this.aPlayer.getcurrentRoom().getItem(vName); 430 int vPoids = this.aPlayer.getPlayerPoids(); 431 if (vItem == null) 432 { 433 gui.print("\n"); 434 gui.println("Il n'y a pas cet objet dans la pièce ! "); 435 gui.print("\n"); 436 return; 437 } 438 else if (vItem.getItemPoids()+vPoids > this.aPlayer.maxPoids()) { 439 gui.print("\n"); 440 gui.println("Tu ne peux pas prendre cet objet car tu n'as pas assez de force pour tout porter ! "); 441 gui.print("\n"); 442 return; 443 } 444 else { 445 this.aPlayer.addItem(vName,vItem); 446 this.aPlayer.getcurrentRoom().removeItem(vName); 447 gui.println("\n" +"Tu as pris "+ vName+". "); 448 gui.println(aPlayer.getInventory()); 449 } 450 gui.println(""); 451 } 452 453 /** 454 * Command Drop 455 */ 456 457 public void drop(Command command) 458 { 459 if (!command.hasSecondWord()) 460 // if there is no second word, we don't know what to do... 461 { 462 gui.print("\n"); 463 gui.println("Déposer quoi ?"); 464 gui.print("\n"); 465 return; 466 } 467 468 String vName = command.getSecondWord(); 469 Item vItem = this.aPlayer.getItem(vName); 470 471 if (vItem == null) 472 { 473 gui.print("\n"); 474 gui.println("Tu n'as pas cet objet dans ton inventaire."); 475 gui.print("\n"); 476 } 477 else 478 { 479 aPlayer.getcurrentRoom().addItem(vName, vItem ); 480 481 aPlayer.removeItem(vName); 482 gui.println("\n" +"Tu as déposé "+vName+". "); 483 gui.print("\n"); 484 } 485 } 486 487 private void charger() { 488 aPlayer.chargeBeamer(); 489 gui.println("\n" +"Tu viens de charger ton beamer. "); 490 gui.print("\n"); 491 } 492 493 private void utiliser() { 494 495 if(aPlayer.fireBeamer()) { 496 gui.println("\n" +"Tu viens d'utiliser ton beamer avec succès ! "); 497 gui.print("\n"); 498 gui.println(aPlayer.getLongDescription()); 499 gui.showImage(aPlayer.getcurrentRoom().getImageName());} 500 501 else { 502 gui.println("\n" +"Tu n'as pas chargé ton beamer ! Charge-le dans une pièce, puis utilise-le pour t'y téléporter. "); 503 gui.print("\n"); 504 } 505 } 506}