/**
* 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
}
}
}