From 6d4abadb092b4a9cfb1a1aaf0775653e6070ee28 Mon Sep 17 00:00:00 2001 From: Wim Wenigerkind Date: Tue, 11 Feb 2025 13:17:12 +0100 Subject: [PATCH] zuul0 --- Die Welt von Zuul.iml | 11 ++ doc/Die Welt von Zuul.jpg | Bin 0 -> 53909 bytes src/de/szut/zuul/Command.java | 75 ++++++++++ src/de/szut/zuul/CommandWords.java | 43 ++++++ src/de/szut/zuul/Game.java | 222 +++++++++++++++++++++++++++++ src/de/szut/zuul/Parser.java | 67 +++++++++ src/de/szut/zuul/Room.java | 68 +++++++++ src/de/szut/zuul/ZuulUI.java | 14 ++ 8 files changed, 500 insertions(+) create mode 100644 Die Welt von Zuul.iml create mode 100644 doc/Die Welt von Zuul.jpg create mode 100644 src/de/szut/zuul/Command.java create mode 100644 src/de/szut/zuul/CommandWords.java create mode 100644 src/de/szut/zuul/Game.java create mode 100644 src/de/szut/zuul/Parser.java create mode 100644 src/de/szut/zuul/Room.java create mode 100644 src/de/szut/zuul/ZuulUI.java diff --git a/Die Welt von Zuul.iml b/Die Welt von Zuul.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/Die Welt von Zuul.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/doc/Die Welt von Zuul.jpg b/doc/Die Welt von Zuul.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51f55e3a4c5c3a52f17e33ab042f502fc10bb2cb GIT binary patch literal 53909 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. + * + * If the command had only one word, then the second word is . + * + * @author Michael Kölling and David J. Barnes + * @version 2016.02.29 + */ + +public class Command +{ + private String commandWord; + private String secondWord; + + /** + * Create a command object. First and second word must be supplied, but + * either one (or both) can be null. + * @param firstWord The first word of the command. Null if the command + * was not recognised. + * @param secondWord The second word of the command. + */ + public Command(String firstWord, String secondWord) + { + commandWord = firstWord; + this.secondWord = secondWord; + } + + /** + * Return the command word (the first word) of this command. If the + * command was not understood, the result is null. + * @return The command word. + */ + public String getCommandWord() + { + return commandWord; + } + + /** + * @return The second word of this command. Returns null if there was no + * second word. + */ + public String getSecondWord() + { + return secondWord; + } + + /** + * @return true if this command was not understood. + */ + public boolean isUnknown() + { + return (commandWord == null); + } + + /** + * @return true if the command has a second word. + */ + public boolean hasSecondWord() + { + return (secondWord != null); + } +} + diff --git a/src/de/szut/zuul/CommandWords.java b/src/de/szut/zuul/CommandWords.java new file mode 100644 index 0000000..31271f1 --- /dev/null +++ b/src/de/szut/zuul/CommandWords.java @@ -0,0 +1,43 @@ +package de.szut.zuul; + +/** + * This class is part of the "World of Zuul" application. + * "World of Zuul" is a very simple, text based adventure game. + * + * This class holds an enumeration of all command words known to the game. + * It is used to recognise commands as they are typed in. + * + * @author Michael Kölling and David J. Barnes + * @version 2016.02.29 + */ + +public class CommandWords +{ + // a constant array that holds all valid command words + private static final String[] validCommands = { + "go", "quit", "help" + }; + + /** + * Constructor - initialise the command words. + */ + public CommandWords() + { + // nothing to do at the moment... + } + + /** + * Check whether a given String is a valid command word. + * @return true if a given string is a valid command, + * false if it isn't. + */ + public boolean isCommand(String aString) + { + for(int i = 0; i < validCommands.length; i++) { + if(validCommands[i].equals(aString)) + return true; + } + // if we get here, the string was not found in the commands + return false; + } +} diff --git a/src/de/szut/zuul/Game.java b/src/de/szut/zuul/Game.java new file mode 100644 index 0000000..a74b2e7 --- /dev/null +++ b/src/de/szut/zuul/Game.java @@ -0,0 +1,222 @@ +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; + + // 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"); + + // initialise room exits + marketsquare.setExits(tavern, templePyramid, null, sacrificialSite); + templePyramid.setExits(hut, null, null, marketsquare); + tavern.setExits(null, hut, marketsquare, null); + sacrificialSite.setExits(null, marketsquare, null , null); + hut.setExits(null, jungle, templePyramid, tavern); + jungle.setExits(null, null, null, hut); + secretPassage.setExits(null, null, null, cave); + cave.setExits(null, secretPassage, beach, null); + beach.setExits(cave, null, null, null); + + 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(); + 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 "); + } + System.out.println(); + } + + /** + * 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 (nextRoom == null) { + System.out.println("There is no door!"); + } + else { + currentRoom = nextRoom; + 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 "); + } + System.out.println(); + } + } + + /** + * "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 + } + } +} diff --git a/src/de/szut/zuul/Parser.java b/src/de/szut/zuul/Parser.java new file mode 100644 index 0000000..1b9ac82 --- /dev/null +++ b/src/de/szut/zuul/Parser.java @@ -0,0 +1,67 @@ +package de.szut.zuul; + +import java.util.Scanner; + +/** + * This class is part of the "World of Zuul" application. + * "World of Zuul" is a very simple, text based adventure game. + * + * This parser reads user input and tries to interpret it as an "Adventure" + * command. Every time it is called it reads a line from the terminal and + * tries to interpret the line as a two word command. It returns the command + * as an object of class Command. + * + * The parser has a set of known command words. It checks user input against + * the known commands, and if the input is not one of the known commands, it + * returns a command object that is marked as an unknown command. + * + * @author Michael Kölling and David J. Barnes + * @version 2016.02.29 + */ +public class Parser +{ + private CommandWords commands; // holds all valid command words + private Scanner reader; // source of command input + + /** + * Create a parser to read from the terminal window. + */ + public Parser() + { + commands = new CommandWords(); + reader = new Scanner(System.in); + } + + /** + * @return The next command from the user. + */ + public Command getCommand() + { + String inputLine; // will hold the full input line + String word1 = null; + String word2 = null; + + System.out.print("> "); // print prompt + + inputLine = reader.nextLine(); + + // Find up to two words on the line. + Scanner tokenizer = new Scanner(inputLine); + if(tokenizer.hasNext()) { + word1 = tokenizer.next(); // get first word + if(tokenizer.hasNext()) { + word2 = tokenizer.next(); // get second word + // note: we just ignore the rest of the input line. + } + } + + // Now check whether this word is known. If so, create a command + // with it. If not, create a "null" command (for unknown command). + if(commands.isCommand(word1)) { + return new Command(word1, word2); + } + else { + return new Command(null, word2); + } + } +} diff --git a/src/de/szut/zuul/Room.java b/src/de/szut/zuul/Room.java new file mode 100644 index 0000000..048fd70 --- /dev/null +++ b/src/de/szut/zuul/Room.java @@ -0,0 +1,68 @@ +package de.szut.zuul; + +/** + * 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 Kölling and David J. Barnes + * @version 2016.02.29 + */ +public class Room +{ + public String description; + public Room northExit; + public Room southExit; + public Room eastExit; + public 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; + } + +} diff --git a/src/de/szut/zuul/ZuulUI.java b/src/de/szut/zuul/ZuulUI.java new file mode 100644 index 0000000..d0955d7 --- /dev/null +++ b/src/de/szut/zuul/ZuulUI.java @@ -0,0 +1,14 @@ +package de.szut.zuul; + +public class ZuulUI { + + /** + * @param args + */ + public static void main(String[] args) { + Game game = new Game(); + game.play(); + } +} + +