/** * This class is the main class of the "World of Zuul" application. * "World of Zuul" is a very simple, text based adventure game. Users * can walk around some scenery. That's all. It should really be extended * to make it more interesting! * * 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. * * @author Michael Kolling and David J. Barnes * @version 2006.03.30 */ public class Game { private Parser parser; private Room currentRoom; /** * Create the game and initialise its internal map. */ public Game() { createRooms(); parser = new Parser(); } /** * Create all the rooms and link their exits together. * Opprettet objektet which represent the room. */ private void createRooms() { Room outside, theatre, pub, lab, office, gymroom, bathroom, bedroom, livingroom, kitchen; // create the rooms 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"); // Her oppretter vi de rommene vi la til. gymroom = new Room("in the gymroom"); bathroom = new Room("in the bathroom"); livingroom = new Room("in the living room"); kitchen = new Room("in the kitchen"); // initialise room exits outside.setExit("east", theatre); outside.setExit("south", lab); outside.setExit("west", pub); // Her lager vi "utganger" fra de forskjellige rommene.. // Vi vil f.eks. at hvis vi går mot "north" når vi er outside så skal vi komme til livingroom outside.setExit("north", livingroom); // Da vil det være naturlig at når man går south fra livingroom, så kommer man til outside livingroom.setExit("south", outside); // I tillegg er det jo kjekt om bathroom ligger i nærheten av living room :-) livingroom.setExit("west", bathroom); // For at vi skal komme oss fra bathroom til livingroom igjen, så må vi ha en exit i bathroom også bathroom.setExit("east", livingroom); // Nå har vi liksom brukt opp alle himmelretningene (north, south, east, west) for rommet "outside" // Men det betyr ikke at vi ikke kan lage flere exits // Vi later som det er en magisk portal som fører til kjøkkenet outside.setExit("through the magical portal", kitchen); // Da er det jo kjekt å kunne gå gjennom portalen tilbake igjen også. kitchen.setExit("back through the magical portal", outside); // I tillegg kan vi jo ha en utgang fra kjøkkenet til gymrommet kitchen.setExit("down the stairs", gymroom); // Da må vi ha en vei opp igjen til kjøkkenet også gymroom.setExit("up the stairs", kitchen); // Her kommer alle utgangene som var der fra før.. har ikke gjort noen endringer her theatre.setExit("west", outside); pub.setExit("east", outside); lab.setExit("north", outside); lab.setExit("east", office); office.setExit("west", lab); currentRoom = outside; // start game outside } /** * Main play routine. Loops until end of play. */ public void play() { printWelcome(); // Enter the main command loop. Here we repeatedly read commands and // execute them until the game is over. boolean finished = false; while (! finished) { Command command = parser.getCommand(); finished = processCommand(command); } System.out.println("Thank you for playing. Good bye."); } /** * Print out the opening message for the player. */ private void printWelcome() { System.out.println(); System.out.println("Welcome to the World of Zuul!"); System.out.println("World of Zuul is a new, incredibly boring adventure game."); System.out.println("Type '" + CommandWord.HELP + "' if you need help."); System.out.println(); System.out.println(currentRoom.getLongDescription()); } /** * Given a command, process (that is: execute) the command. * @param command The command to be processed. * @return true If the command ends the game, false otherwise. */ private boolean processCommand(Command command) { boolean wantToQuit = false; CommandWord commandWord = command.getCommandWord(); if(commandWord == CommandWord.UNKNOWN) { System.out.println("I don't know what you mean..."); return false; } if (commandWord == CommandWord.HELP) { printHelp(); } else if (commandWord == CommandWord.GO) { goRoom(command); } else if (commandWord == CommandWord.QUIT) { wantToQuit = quit(command); } // else command not recognised. return wantToQuit; } // implementations of user commands: /** * Print out some help information. * Here we print some stupid, cryptic message and a list of the * command words. */ private void printHelp() { System.out.println("You are lost. You are alone. You wander"); System.out.println("around at the university."); System.out.println(); System.out.println("Your command words are:"); parser.showCommands(); } /** * Try to go to one direction. If there is an exit, enter the new * room, otherwise print an error message. */ private void goRoom(Command command) { if(!command.hasSecondWord()) { // if there is no second word, we don't know where to go... System.out.println("Go where?"); return; } String direction = command.getSecondWord(); // Try to leave current room. Room nextRoom = currentRoom.getExit(direction); if (nextRoom == null) { System.out.println("There is no door!"); } else { currentRoom = nextRoom; System.out.println(currentRoom.getLongDescription()); } } /** * "Quit" was entered. Check the rest of the command to see * whether we really quit the game. * @return true, if this command quits the game, false otherwise. */ private boolean quit(Command command) { if(command.hasSecondWord()) { System.out.println("Quit what?"); return false; } else { return true; // signal that we want to quit } } }