Files
worldofzuul/src/de/szut/zuul/Game.java
2025-02-18 14:21:39 +01:00

235 lines
7.3 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");
// add items to rooms
marketsquare.putItem(new Item("Bogen", "ein Bogen aus Holz", 0.5));
cave.putItem(new Item("Schatz", "eine kleine Schatztruhe mit Münzen", 7.5));
wizardsRoom.putItem(new Item("Pfeile", "ein Köcher mit diversen Pfeilen", 1));
jungle.putItem(new Item("Pflanze", "eine Heilpflanze", 0.5));
jungle.putItem(new Item("Kakao", "ein kleiner Kakaobaum", 5));
sacrificialSite.putItem(new Item("Messer", "ein sehr scharfes, großes Messer", 1));
hut.putItem(new Item("Speer", "ein Speer mit dazugehöriger Schleuder", 5.0));
tavern.putItem(new Item("Nahrung", "ein Teller mit deftigem Fleisch und Maisbrei", 0.5));
basement.putItem(new Item("Schmuck", "ein sehr hübscher Kopfschmuck", 1));
// initialise room exits
marketsquare.setExit("north", tavern);
marketsquare.setExit("east", templePyramid);
marketsquare.setExit("west", sacrificialSite);
templePyramid.setExit("north", hut);
templePyramid.setExit("up", wizardsRoom);
templePyramid.setExit("down", basement);
templePyramid.setExit("west", marketsquare);
tavern.setExit("east", hut);
tavern.setExit("south", marketsquare);
sacrificialSite.setExit("east", marketsquare);
sacrificialSite.setExit("down", cave);
hut.setExit("east", jungle);
hut.setExit("south", templePyramid);
hut.setExit("west", tavern);
jungle.setExit("west", hut);
secretPassage.setExit("east", basement);
secretPassage.setExit("west", cave);
cave.setExit("east", secretPassage);
cave.setExit("south", beach);
cave.setExit("up", sacrificialSite);
beach.setExit("north", cave);
basement.setExit("west", secretPassage);
basement.setExit("up", templePyramid);
wizardsRoom.setExit("down", 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);
}
else if (commandWord.equals("look")) {
look(currentRoom);
}
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(parser.showCommands());
}
/**
* 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;
nextRoom = currentRoom.getExits(direction);
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.print(currentRoom.getLongDescription());
System.out.println();
}
private void look(Room currentRoom)
{
System.out.println(currentRoom.getLongDescription());
}
}