/**
* 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.
*/
private void createRooms()
{
Room startingArea, darkForest, bigTree, treetop, riverside, shinyCoin, splitPath, oldManHut, boss;
// create the rooms
startingArea = new Room("You wake up, alone and frightened." +
" Birds shreik overhead, low mumbles and growls radiate from the bushes.");
darkForest = new Room("The path ahead is overgrown and shrouded in thick trees!" +
" There are monster's everywhere! You'll need something to defend yourself" +
" and to cut through this grass...");
bigTree = new Room("An enourmous tree towers overhead. The bark is very rough" +
", maybe you could climb it...");
treetop = new Room("You make it to the top of the giant tree. A magpie sits, " +
"guarding a key. \n\"SQUAK!!!\" she screams. \n\"YOU\'RE ONLY GETTING MY KEY\"" +
"\n\"SQUAK!!!\"\n \"If you give me something SHINIER!\"");
riverside = new Room("You stumble upon a beautiful flowing river." +
"Perhaps something will have washed up on its banks?");
shinyCoin = new Room("You find a shiny coin in the mud of the river's banks!");
splitPath = new Room("The path through the forest splits east and west." +
"There's a brooding sense of doubt eminating from the western path...");
oldManHut = new Room("You stumble upon a beautiful flowing river." +
"Perhaps something will have washed up on its banks?");
boss = new Room("You stumble upon a beautiful flowing river." +
"Perhaps something will have washed up on its banks?");
// initialise room exits
startingArea.setExits(splitPath, riverside, darkForest, bigTree);
darkForest.setExits(startingArea, null, null, null);
bigTree.setExits(treetop, startingArea, null, null);
treetop.setExits(null, null, bigTree, null);
riverside.setExits(shinyCoin, null, null, startingArea);
shinyCoin.setExits(null, null, riverside, null);
splitPath.setExits(null, oldManHut, startingArea, boss);
oldManHut.setExits(null, null, null, splitPath);
boss.setExits(null, splitPath, null, null);
currentRoom = startingArea; // 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 'help' if you need help.");
System.out.println();
printLocationInfo();
}
/**
* Print out information on the current location
*/
private void printLocationInfo()
{
System.out.println(currentRoom.getDescription());
System.out.print("Exits: ");
System.out.println(currentRoom.getExitString());
}
/**
* 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;
if(command.isUnknown()) {
System.out.println("I don't know what you mean...");
return false;
}
String commandWord = command.getCommandWord();
if (commandWord.equals("help"))
printHelp();
else if (commandWord.equals("go"))
goRoom(command);
else if (commandWord.equals("quit"))
wantToQuit = quit(command);
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:");
System.out.println(" go quit help");
}
/**
* 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);
printLocationInfo();
}
/**
* "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
}
}
}
/**
* Class Room - a room in an adventure game.
*
* This class is part of the "World of Zuul" application.
* "World of Zuul" is a very simple, text based adventure game.
*
* A "Room" represents one location in the scenery of the game. It is
* connected to other rooms via exits. The exits are labelled north,
* east, south, west. For each direction, the room stores a reference
* to the neighboring room, or null if there is no exit in that direction.
*
* @author Michael Kolling and David J. Barnes
* @version 2006.03.30
*/
public class Room
{
private String description;
private Room northExit;
private Room southExit;
private Room eastExit;
private Room westExit;
/**
* Create a room described "description". Initially, it has
* no exits. "description" is something like "a kitchen" or
* "an open court yard".
* @param description The room's description.
*/
public Room(String description)
{
this.description = description;
}
/**
* Define the exits of this room. Every direction either leads
* to another room or is null (no exit there).
* @param north The north exit.
* @param east The east east.
* @param south The south exit.
* @param west The west exit.
*/
public void setExits(Room north, Room east, Room south, Room west)
{
if(north != null)
northExit = north;
if(east != null)
eastExit = east;
if(south != null)
southExit = south;
if(west != null)
westExit = west;
}
/**
* @return The description of the room.
*/
public String getDescription()
{
return description;
}
public Room getExit(String direction)
{
if (direction.equals("north")) {
return northExit;
}
if (direction.equals("east")) {
return eastExit;
}
if (direction.equals("south")) {
return southExit;
}
if (direction.equals("west")) {
return westExit;
}
return null;
}
/**
* Return a description of the room's exits,
* for example, "Exits: north west"
* @return: A description of the available exits.
*/
public String getExitString() {
String exitString = "";
if(northExit != null)
exitString += "north ";
if(eastExit != null)
exitString += "east ";
if(southExit != null)
exitString += "south ";
if(westExit != null)
exitString += "west ";
return exitString;
}
}
Basically, regardless of which room the player is in the program will print the details for the room that is set to "currentRoom" in the Game class. I'm assuming this is because currentRoom is never set to anything else, but isnt that what the line
Room nextRoom = currentRoom.getExit(direction);
does?
If anyone can offer a suggestions it would be greatly appreciated.


Sign In
Create Account


Back to top









