229 lines
7.2 KiB
Java
229 lines
7.2 KiB
Java
package de.szut.zuul;
|
|
|
|
/**
|
|
* 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 Kölling and David J. Barnes
|
|
* @version 2016.02.29
|
|
*/
|
|
|
|
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 marketsquare, templePyramid, tavern, sacrificialSite, hut, jungle, secretPassage, cave, beach, basement, wizardsRoom;
|
|
|
|
// create the rooms
|
|
marketsquare = new Room("on the market square");
|
|
templePyramid = new Room("in a temple pyramid");
|
|
tavern = new Room("in the tavern at the market square");
|
|
sacrificialSite = new Room("at a sacrificial site");
|
|
hut = new Room("in a hut");
|
|
jungle = new Room("in the jungle");
|
|
secretPassage = new Room("in a secret passage");
|
|
cave = new Room("in a cave");
|
|
beach = new Room("on the beach");
|
|
basement = new Room("in a basement");
|
|
wizardsRoom = new Room("in a wizards room");
|
|
|
|
// initialise room exits
|
|
marketsquare.setExits(tavern, templePyramid, null, sacrificialSite, null, null);
|
|
templePyramid.setExits(hut, null, null, marketsquare, wizardsRoom, basement);
|
|
tavern.setExits(null, hut, marketsquare, null, null, null);
|
|
sacrificialSite.setExits(null, marketsquare, null , null, null, cave);
|
|
hut.setExits(null, jungle, templePyramid, tavern, null, null);
|
|
jungle.setExits(null, null, null, hut, null, null);
|
|
secretPassage.setExits(null, basement, null, cave, null, null);
|
|
cave.setExits(null, secretPassage, beach, null, sacrificialSite, null);
|
|
beach.setExits(cave, null, null, null, null, null);
|
|
basement.setExits(null, null, null, secretPassage, templePyramid, null);
|
|
wizardsRoom.setExits(null, null, null, null, null, templePyramid);
|
|
|
|
currentRoom = marketsquare; // start game on marketsquare
|
|
}
|
|
|
|
/**
|
|
* 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();
|
|
printRoomInformation(currentRoom);
|
|
}
|
|
|
|
/**
|
|
* 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("through the jungle. At once there is a glade. On it there a buildings...");
|
|
System.out.println();
|
|
System.out.println("Your command words are:");
|
|
System.out.println(" go quit help");
|
|
}
|
|
|
|
/**
|
|
* Try to go in 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 = null;
|
|
if(direction.equals("north")) {
|
|
nextRoom = currentRoom.northExit;
|
|
}
|
|
if(direction.equals("east")) {
|
|
nextRoom = currentRoom.eastExit;
|
|
}
|
|
if(direction.equals("south")) {
|
|
nextRoom = currentRoom.southExit;
|
|
}
|
|
if(direction.equals("west")) {
|
|
nextRoom = currentRoom.westExit;
|
|
}
|
|
if(direction.equals("up")) {
|
|
nextRoom = currentRoom.upExit;
|
|
}
|
|
if(direction.equals("down")) {
|
|
nextRoom = currentRoom.downExit;
|
|
}
|
|
|
|
if (nextRoom == null) {
|
|
System.out.println("There is no door!");
|
|
}
|
|
else {
|
|
currentRoom = nextRoom;
|
|
printRoomInformation(currentRoom);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* "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
|
|
}
|
|
}
|
|
private void printRoomInformation(Room currentRoom)
|
|
{
|
|
System.out.println("You are " + currentRoom.getDescription());
|
|
System.out.print("Exits: ");
|
|
if(currentRoom.northExit != null) {
|
|
System.out.print("north ");
|
|
}
|
|
if(currentRoom.eastExit != null) {
|
|
System.out.print("east ");
|
|
}
|
|
if(currentRoom.southExit != null) {
|
|
System.out.print("south ");
|
|
}
|
|
if(currentRoom.westExit != null) {
|
|
System.out.print("west ");
|
|
}
|
|
if(currentRoom.upExit != null) {
|
|
System.out.print("up ");
|
|
}
|
|
if(currentRoom.downExit != null) {
|
|
System.out.print("down ");
|
|
}
|
|
System.out.println();
|
|
}
|
|
}
|