first commit

This commit is contained in:
Boris
2024-01-15 20:14:10 +00:00
commit 8c81ee28b7
3106 changed files with 474415 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
#BlueJ class context
comment0.params=firstWord\ secondWord
comment0.target=Command(java.lang.String,\ java.lang.String)
comment0.text=\r\n\ Create\ a\ command\ object.\ First\ and\ second\ word\ must\ be\ supplied,\ but\r\n\ either\ one\ (or\ both)\ can\ be\ null.\r\n\ @param\ firstWord\ The\ first\ word\ of\ the\ command.\ Null\ if\ the\ command\r\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ was\ not\ recognised.\r\n\ @param\ secondWord\ The\ second\ word\ of\ the\ command.\r\n
comment1.params=
comment1.target=java.lang.String\ getCommandWord()
comment1.text=\r\n\ Return\ the\ command\ word\ (the\ first\ word)\ of\ this\ command.\ If\ the\r\n\ command\ was\ not\ understood,\ the\ result\ is\ null.\r\n\ @return\ The\ command\ word.\r\n
comment2.params=
comment2.target=java.lang.String\ getSecondWord()
comment2.text=\r\n\ @return\ The\ second\ word\ of\ this\ command.\ Returns\ null\ if\ there\ was\ no\r\n\ second\ word.\r\n
comment3.params=
comment3.target=boolean\ isUnknown()
comment3.text=\r\n\ @return\ true\ if\ this\ command\ was\ not\ understood.\r\n
comment4.params=
comment4.target=boolean\ hasSecondWord()
comment4.text=\r\n\ @return\ true\ if\ the\ command\ has\ a\ second\ word.\r\n
numComments=5

View File

@@ -0,0 +1,73 @@
/**
* This class is part of the "World of Zuul" application.
* "World of Zuul" is a very simple, text based adventure game.
*
* This class holds information about a command that was issued by the user.
* A command currently consists of two strings: a command word and a second
* word (for example, if the command was "take map", then the two strings
* obviously are "take" and "map").
*
* The way this is used is: Commands are already checked for being valid
* command words. If the user entered an invalid command (a word that is not
* known) then the command word is <null>.
*
* If the command had only one word, then the second word is <null>.
*
* @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);
}
}

View File

@@ -0,0 +1,8 @@
#BlueJ class context
comment0.params=
comment0.target=CommandWords()
comment0.text=\r\n\ Constructor\ -\ initialise\ the\ command\ words.\r\n
comment1.params=aString
comment1.target=boolean\ isCommand(java.lang.String)
comment1.text=\r\n\ Check\ whether\ a\ given\ String\ is\ a\ valid\ command\ word.\ \r\n\ @return\ true\ if\ a\ given\ string\ is\ a\ valid\ command,\r\n\ false\ if\ it\ isn't.\r\n
numComments=2

View File

@@ -0,0 +1,41 @@
/**
* 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;
}
}

View File

@@ -0,0 +1,26 @@
#BlueJ class context
comment0.params=
comment0.target=Game()
comment0.text=\r\n\ Create\ the\ game\ and\ initialise\ its\ internal\ map.\r\n
comment1.params=
comment1.target=void\ createRooms()
comment1.text=\r\n\ Create\ all\ the\ rooms\ and\ link\ their\ exits\ together.\r\n
comment2.params=
comment2.target=void\ play()
comment2.text=\r\n\ \ Main\ play\ routine.\ \ Loops\ until\ end\ of\ play.\r\n
comment3.params=
comment3.target=void\ printWelcome()
comment3.text=\r\n\ Print\ out\ the\ opening\ message\ for\ the\ player.\r\n
comment4.params=command
comment4.target=boolean\ processCommand(Command)
comment4.text=\r\n\ Given\ a\ command,\ process\ (that\ is\:\ execute)\ the\ command.\r\n\ @param\ command\ The\ command\ to\ be\ processed.\r\n\ @return\ true\ If\ the\ command\ ends\ the\ game,\ false\ otherwise.\r\n
comment5.params=
comment5.target=void\ printHelp()
comment5.text=\r\n\ Print\ out\ some\ help\ information.\r\n\ Here\ we\ print\ some\ stupid,\ cryptic\ message\ and\ a\ list\ of\ the\ \r\n\ command\ words.\r\n
comment6.params=command
comment6.target=void\ goRoom(Command)
comment6.text=\ \r\n\ Try\ to\ go\ in\ one\ direction.\ If\ there\ is\ an\ exit,\ enter\r\n\ the\ new\ room,\ otherwise\ print\ an\ error\ message.\r\n
comment7.params=command
comment7.target=boolean\ quit(Command)
comment7.text=\ \r\n\ "Quit"\ was\ entered.\ Check\ the\ rest\ of\ the\ command\ to\ see\r\n\ whether\ we\ really\ quit\ the\ game.\r\n\ @return\ true,\ if\ this\ command\ quits\ the\ game,\ false\ otherwise.\r\n
numComments=8

View File

@@ -0,0 +1,212 @@
/**
* 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 outside, theater, pub, lab, office;
// create the rooms
outside = new Room("outside the main entrance of the university");
theater = new Room("in a lecture theater");
pub = new Room("in the campus pub");
lab = new Room("in a computing lab");
office = new Room("in the computing admin office");
// initialise room exits
outside.setExits(null, theater, lab, pub);
theater.setExits(null, null, null, outside);
pub.setExits(null, outside, null, null);
lab.setExits(outside, office, null, null);
office.setExits(null, null, null, 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 '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("around at the university.");
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
}
}
}

View File

@@ -0,0 +1,8 @@
#BlueJ class context
comment0.params=
comment0.target=Parser()
comment0.text=\r\n\ Create\ a\ parser\ to\ read\ from\ the\ terminal\ window.\r\n
comment1.params=
comment1.target=Command\ getCommand()
comment1.text=\r\n\ @return\ The\ next\ command\ from\ the\ user.\r\n
numComments=2

View File

@@ -0,0 +1,65 @@
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);
}
}
}

View File

@@ -0,0 +1,27 @@
Project: zuul-bad
Authors: Michael Kölling and David J. Barnes
This project is part of the material for the book
Objects First with Java - A Practical Introduction using BlueJ
Sixth edition
David J. Barnes and Michael Kölling
Pearson Education, 2016
This project is a simple framework for an adventure game. In this version,
it has a few rooms and the ability for a player to walk between these rooms.
That's all.
To start this application, create an instance of class "Game" and call its
"play" method.
This version of the game contains some very bad class design. It should NOT
be used as a basis for extending the project without fixing these design
problems. It serves as an example to discuss good and bad design (chapter 8
of the book).
Chapter 8 of the book contains a detailed description of the problems in this
project, and how to fix them.
The project 'zuul-better' contains a version of this project with better
designed class structure. It includes the fixes discussed in the book.

View File

@@ -0,0 +1,11 @@
#BlueJ class context
comment0.params=description
comment0.target=Room(java.lang.String)
comment0.text=\r\n\ Create\ a\ room\ described\ "description".\ Initially,\ it\ has\r\n\ no\ exits.\ "description"\ is\ something\ like\ "a\ kitchen"\ or\r\n\ "an\ open\ court\ yard".\r\n\ @param\ description\ The\ room's\ description.\r\n
comment1.params=north\ east\ south\ west
comment1.target=void\ setExits(Room,\ Room,\ Room,\ Room)
comment1.text=\r\n\ Define\ the\ exits\ of\ this\ room.\ \ Every\ direction\ either\ leads\r\n\ to\ another\ room\ or\ is\ null\ (no\ exit\ there).\r\n\ @param\ north\ The\ north\ exit.\r\n\ @param\ east\ The\ east\ east.\r\n\ @param\ south\ The\ south\ exit.\r\n\ @param\ west\ The\ west\ exit.\r\n
comment2.params=
comment2.target=java.lang.String\ getDescription()
comment2.text=\r\n\ @return\ The\ description\ of\ the\ room.\r\n
numComments=3

View File

@@ -0,0 +1,66 @@
/**
* 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;
}
}

View File

@@ -0,0 +1,96 @@
#BlueJ package file
dependency1.from=Parser
dependency1.to=CommandWords
dependency1.type=UsesDependency
dependency2.from=Parser
dependency2.to=Command
dependency2.type=UsesDependency
dependency3.from=Game
dependency3.to=Parser
dependency3.type=UsesDependency
dependency4.from=Game
dependency4.to=Room
dependency4.type=UsesDependency
dependency5.from=Game
dependency5.to=Command
dependency5.type=UsesDependency
objectbench.height=76
objectbench.width=872
package.editor.height=449
package.editor.width=764
package.editor.x=70
package.editor.y=80
package.numDependencies=5
package.numTargets=5
package.showExtends=true
package.showUses=true
project.charset=UTF-8
readme.editor.height=598
readme.editor.width=817
readme.editor.x=102
readme.editor.y=27
target1.editor.height=734
target1.editor.width=887
target1.editor.x=196
target1.editor.y=44
target1.height=60
target1.name=Game
target1.naviview.expanded=true
target1.showInterface=false
target1.type=ClassTarget
target1.typeParameters=
target1.width=100
target1.x=90
target1.y=120
target2.editor.height=721
target2.editor.width=856
target2.editor.x=50
target2.editor.y=60
target2.height=60
target2.name=Command
target2.naviview.expanded=true
target2.showInterface=false
target2.type=ClassTarget
target2.typeParameters=
target2.width=110
target2.x=240
target2.y=210
target3.editor.height=730
target3.editor.width=860
target3.editor.x=50
target3.editor.y=60
target3.height=60
target3.name=CommandWords
target3.naviview.expanded=true
target3.showInterface=false
target3.type=ClassTarget
target3.typeParameters=
target3.width=130
target3.x=500
target3.y=210
target4.editor.height=722
target4.editor.width=836
target4.editor.x=50
target4.editor.y=60
target4.height=60
target4.name=Room
target4.naviview.expanded=true
target4.showInterface=false
target4.type=ClassTarget
target4.typeParameters=
target4.width=110
target4.x=240
target4.y=290
target5.editor.height=739
target5.editor.width=871
target5.editor.x=50
target5.editor.y=57
target5.height=60
target5.name=Parser
target5.naviview.expanded=true
target5.showInterface=false
target5.type=ClassTarget
target5.typeParameters=
target5.width=100
target5.x=380
target5.y=70

View File

@@ -0,0 +1,17 @@
#BlueJ class context
comment0.params=firstWord\ secondWord
comment0.target=Command(java.lang.String,\ java.lang.String)
comment0.text=\n\ Create\ a\ command\ object.\ First\ and\ second\ word\ must\ be\ supplied,\ but\n\ either\ one\ (or\ both)\ can\ be\ null.\n\ @param\ firstWord\ The\ first\ word\ of\ the\ command.\ Null\ if\ the\ command\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ was\ not\ recognised.\n\ @param\ secondWord\ The\ second\ word\ of\ the\ command.\n
comment1.params=
comment1.target=java.lang.String\ getCommandWord()
comment1.text=\n\ Return\ the\ command\ word\ (the\ first\ word)\ of\ this\ command.\ If\ the\n\ command\ was\ not\ understood,\ the\ result\ is\ null.\n\ @return\ The\ command\ word.\n
comment2.params=
comment2.target=java.lang.String\ getSecondWord()
comment2.text=\n\ @return\ The\ second\ word\ of\ this\ command.\ Returns\ null\ if\ there\ was\ no\n\ second\ word.\n
comment3.params=
comment3.target=boolean\ isUnknown()
comment3.text=\n\ @return\ true\ if\ this\ command\ was\ not\ understood.\n
comment4.params=
comment4.target=boolean\ hasSecondWord()
comment4.text=\n\ @return\ true\ if\ the\ command\ has\ a\ second\ word.\n
numComments=5

View File

@@ -0,0 +1,73 @@
/**
* This class is part of the "World of Zuul" application.
* "World of Zuul" is a very simple, text based adventure game.
*
* This class holds information about a command that was issued by the user.
* A command currently consists of two strings: a command word and a second
* word (for example, if the command was "take map", then the two strings
* obviously are "take" and "map").
*
* The way this is used is: Commands are already checked for being valid
* command words. If the user entered an invalid command (a word that is not
* known) then the command word is <null>.
*
* If the command had only one word, then the second word is <null>.
*
* @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);
}
}

View File

@@ -0,0 +1,11 @@
#BlueJ class context
comment0.params=
comment0.target=CommandWords()
comment0.text=\n\ Constructor\ -\ initialise\ the\ command\ words.\n
comment1.params=aString
comment1.target=boolean\ isCommand(java.lang.String)
comment1.text=\n\ Check\ whether\ a\ given\ String\ is\ a\ valid\ command\ word.\ \n\ @return\ true\ if\ it\ is,\ false\ if\ it\ isn't.\n
comment2.params=
comment2.target=void\ showAll()
comment2.text=\n\ Print\ all\ valid\ commands\ to\ System.out.\n
numComments=3

View File

@@ -0,0 +1,51 @@
/**
* 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 it is, 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;
}
/**
* Print all valid commands to System.out.
*/
public void showAll()
{
for(String command: validCommands) {
System.out.print(command + " ");
}
System.out.println();
}
}

View File

@@ -0,0 +1,26 @@
#BlueJ class context
comment0.params=
comment0.target=Game()
comment0.text=\n\ Create\ the\ game\ and\ initialise\ its\ internal\ map.\n
comment1.params=
comment1.target=void\ createRooms()
comment1.text=\n\ Create\ all\ the\ rooms\ and\ link\ their\ exits\ together.\n
comment2.params=
comment2.target=void\ play()
comment2.text=\n\ \ Main\ play\ routine.\ \ Loops\ until\ end\ of\ play.\n
comment3.params=
comment3.target=void\ printWelcome()
comment3.text=\n\ Print\ out\ the\ opening\ message\ for\ the\ player.\n
comment4.params=command
comment4.target=boolean\ processCommand(Command)
comment4.text=\n\ Given\ a\ command,\ process\ (that\ is\:\ execute)\ the\ command.\n\ @param\ command\ The\ command\ to\ be\ processed.\n\ @return\ true\ If\ the\ command\ ends\ the\ game,\ false\ otherwise.\n
comment5.params=
comment5.target=void\ printHelp()
comment5.text=\n\ Print\ out\ some\ help\ information.\n\ Here\ we\ print\ some\ stupid,\ cryptic\ message\ and\ a\ list\ of\ the\ \n\ command\ words.\n
comment6.params=command
comment6.target=void\ goRoom(Command)
comment6.text=\ \n\ Try\ to\ in\ to\ one\ direction.\ If\ there\ is\ an\ exit,\ enter\ the\ new\n\ room,\ otherwise\ print\ an\ error\ message.\n
comment7.params=command
comment7.target=boolean\ quit(Command)
comment7.text=\ \n\ "Quit"\ was\ entered.\ Check\ the\ rest\ of\ the\ command\ to\ see\n\ whether\ we\ really\ quit\ the\ game.\n\ @return\ true,\ if\ this\ command\ quits\ the\ game,\ false\ otherwise.\n
numComments=8

View File

@@ -0,0 +1,179 @@
/**
* 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 outside, theater, pub, lab, office;
// create the rooms
outside = new Room("outside the main entrance of the university");
theater = new Room("in a lecture theater");
pub = new Room("in the campus pub");
lab = new Room("in a computing lab");
office = new Room("in the computing admin office");
// initialise room exits
outside.setExit("east", theater);
outside.setExit("south", lab);
outside.setExit("west", pub);
theater.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 '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;
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 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 in 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
}
}
}

View File

@@ -0,0 +1,11 @@
#BlueJ class context
comment0.params=
comment0.target=Parser()
comment0.text=\n\ Create\ a\ parser\ to\ read\ from\ the\ terminal\ window.\n
comment1.params=
comment1.target=Command\ getCommand()
comment1.text=\n\ @return\ The\ next\ command\ from\ the\ user.\n
comment2.params=
comment2.target=void\ showCommands()
comment2.text=\n\ Print\ out\ a\ list\ of\ valid\ command\ words.\n
numComments=3

View File

@@ -0,0 +1,73 @@
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);
}
}
/**
* Print out a list of valid command words.
*/
public void showCommands()
{
commands.showAll();
}
}

View File

@@ -0,0 +1,27 @@
Project: zuul-better
Authors: Michael Kölling and David J. Barnes
This project is part of the material for the book
Objects First with Java - A Practical Introduction using BlueJ
Sixth edition
David J. Barnes and Michael Kölling
Pearson Education, 2016
This project is a simple framework for an adventure game. In this version,
it has a few rooms and the ability for a player to walk between these rooms.
That's all.
To start this application, create an instance of class "Game" and call its
"play" method.
This project was written as the starting point of a small Java project.
The goal is to extend the game:
- add items to rooms (items may have weight)
- add multiple players
- add commands (pick, drop, examine, read, ...)
- (anything you can think of, really...)
Read chapter 8 of the book to get a detailed description of the project.

View File

@@ -0,0 +1,20 @@
#BlueJ class context
comment0.params=description
comment0.target=Room(java.lang.String)
comment0.text=\n\ Create\ a\ room\ described\ "description".\ Initially,\ it\ has\n\ no\ exits.\ "description"\ is\ something\ like\ "a\ kitchen"\ or\n\ "an\ open\ court\ yard".\n\ @param\ description\ The\ room's\ description.\n
comment1.params=direction\ neighbor
comment1.target=void\ setExit(java.lang.String,\ Room)
comment1.text=\n\ Define\ an\ exit\ from\ this\ room.\n\ @param\ direction\ The\ direction\ of\ the\ exit.\n\ @param\ neighbor\ \ The\ room\ to\ which\ the\ exit\ leads.\n
comment2.params=
comment2.target=java.lang.String\ getShortDescription()
comment2.text=\n\ @return\ The\ short\ description\ of\ the\ room\n\ (the\ one\ that\ was\ defined\ in\ the\ constructor).\n
comment3.params=
comment3.target=java.lang.String\ getLongDescription()
comment3.text=\n\ Return\ a\ description\ of\ the\ room\ in\ the\ form\:\n\ \ \ \ \ You\ are\ in\ the\ kitchen.\n\ \ \ \ \ Exits\:\ north\ west\n\ @return\ A\ long\ description\ of\ this\ room\n
comment4.params=
comment4.target=java.lang.String\ getExitString()
comment4.text=\n\ Return\ a\ string\ describing\ the\ room's\ exits,\ for\ example\n\ "Exits\:\ north\ west".\n\ @return\ Details\ of\ the\ room's\ exits.\n
comment5.params=direction
comment5.target=Room\ getExit(java.lang.String)
comment5.text=\n\ Return\ the\ room\ that\ is\ reached\ if\ we\ go\ from\ this\ room\ in\ direction\n\ "direction".\ If\ there\ is\ no\ room\ in\ that\ direction,\ return\ null.\n\ @param\ direction\ The\ exit's\ direction.\n\ @return\ The\ room\ in\ the\ given\ direction.\n
numComments=6

View File

@@ -0,0 +1,91 @@
import java.util.Set;
import java.util.HashMap;
/**
* 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. For each existing exit, the room
* stores a reference to the neighboring room.
*
* @author Michael Kölling and David J. Barnes
* @version 2016.02.29
*/
public class Room
{
private String description;
private HashMap<String, Room> exits; // stores exits of this room.
/**
* 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;
exits = new HashMap<>();
}
/**
* Define an exit from this room.
* @param direction The direction of the exit.
* @param neighbor The room to which the exit leads.
*/
public void setExit(String direction, Room neighbor)
{
exits.put(direction, neighbor);
}
/**
* @return The short description of the room
* (the one that was defined in the constructor).
*/
public String getShortDescription()
{
return description;
}
/**
* Return a description of the room in the form:
* You are in the kitchen.
* Exits: north west
* @return A long description of this room
*/
public String getLongDescription()
{
return "You are " + description + ".\n" + getExitString();
}
/**
* Return a string describing the room's exits, for example
* "Exits: north west".
* @return Details of the room's exits.
*/
private String getExitString()
{
String returnString = "Exits:";
Set<String> keys = exits.keySet();
for(String exit : keys) {
returnString += " " + exit;
}
return returnString;
}
/**
* Return the room that is reached if we go from this room in direction
* "direction". If there is no room in that direction, return null.
* @param direction The exit's direction.
* @return The room in the given direction.
*/
public Room getExit(String direction)
{
return exits.get(direction);
}
}

View File

@@ -0,0 +1,96 @@
#BlueJ package file
dependency1.from=Parser
dependency1.to=CommandWords
dependency1.type=UsesDependency
dependency2.from=Parser
dependency2.to=Command
dependency2.type=UsesDependency
dependency3.from=Game
dependency3.to=Parser
dependency3.type=UsesDependency
dependency4.from=Game
dependency4.to=Room
dependency4.type=UsesDependency
dependency5.from=Game
dependency5.to=Command
dependency5.type=UsesDependency
objectbench.height=76
objectbench.width=788
package.editor.height=394
package.editor.width=680
package.editor.x=70
package.editor.y=80
package.numDependencies=5
package.numTargets=5
package.showExtends=true
package.showUses=true
project.charset=UTF-8
readme.editor.height=666
readme.editor.width=839
readme.editor.x=41
readme.editor.y=23
target1.editor.height=722
target1.editor.width=885
target1.editor.x=160
target1.editor.y=67
target1.height=60
target1.name=Game
target1.naviview.expanded=true
target1.showInterface=false
target1.type=ClassTarget
target1.typeParameters=
target1.width=100
target1.x=90
target1.y=110
target2.editor.height=707
target2.editor.width=891
target2.editor.x=50
target2.editor.y=60
target2.height=60
target2.name=Command
target2.naviview.expanded=true
target2.showInterface=false
target2.type=ClassTarget
target2.typeParameters=
target2.width=110
target2.x=190
target2.y=200
target3.editor.height=728
target3.editor.width=857
target3.editor.x=50
target3.editor.y=60
target3.height=60
target3.name=CommandWords
target3.naviview.expanded=true
target3.showInterface=false
target3.type=ClassTarget
target3.typeParameters=
target3.width=130
target3.x=490
target3.y=200
target4.editor.height=735
target4.editor.width=830
target4.editor.x=50
target4.editor.y=60
target4.height=60
target4.name=Room
target4.naviview.expanded=true
target4.showInterface=false
target4.type=ClassTarget
target4.typeParameters=
target4.width=110
target4.x=190
target4.y=280
target5.editor.height=735
target5.editor.width=854
target5.editor.x=50
target5.editor.y=60
target5.height=60
target5.name=Parser
target5.naviview.expanded=true
target5.showInterface=false
target5.type=ClassTarget
target5.typeParameters=
target5.width=100
target5.x=340
target5.y=60

View File

@@ -0,0 +1,17 @@
#BlueJ class context
comment0.params=commandWord\ secondWord
comment0.target=Command(CommandWord,\ java.lang.String)
comment0.text=\r\n\ Create\ a\ command\ object.\ First\ and\ second\ words\ must\ be\ supplied,\ but\r\n\ the\ second\ may\ be\ null.\r\n\ @param\ commandWord\ The\ CommandWord.\ UNKNOWN\ if\ the\ command\ word\r\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ was\ not\ recognised.\r\n\ @param\ secondWord\ The\ second\ word\ of\ the\ command.\ May\ be\ null.\r\n
comment1.params=
comment1.target=CommandWord\ getCommandWord()
comment1.text=\r\n\ Return\ the\ command\ word\ (the\ first\ word)\ of\ this\ command.\r\n\ @return\ The\ command\ word.\r\n
comment2.params=
comment2.target=java.lang.String\ getSecondWord()
comment2.text=\r\n\ @return\ The\ second\ word\ of\ this\ command.\ Returns\ null\ if\ there\ was\ no\r\n\ second\ word.\r\n
comment3.params=
comment3.target=boolean\ isUnknown()
comment3.text=\r\n\ @return\ true\ if\ this\ command\ was\ not\ understood.\r\n
comment4.params=
comment4.target=boolean\ hasSecondWord()
comment4.text=\r\n\ @return\ true\ if\ the\ command\ has\ a\ second\ word.\r\n
numComments=5

View File

@@ -0,0 +1,72 @@
/**
* This class is part of the "World of Zuul" application.
* "World of Zuul" is a very simple, text based adventure game.
*
* This class holds information about a command that was issued by the user.
* A command currently consists of two parts: a CommandWord and a string
* (for example, if the command was "take map", then the two parts
* are TAKE and "map").
*
* The way this is used is: Commands are already checked for being valid
* command words. If the user entered an invalid command (a word that is not
* known) then the CommandWord is UNKNOWN.
*
* If the command had only one word, then the second word is <null>.
*
* @author Michael Kölling and David J. Barnes
* @version 2016.02.29
*/
public class Command
{
private CommandWord commandWord;
private String secondWord;
/**
* Create a command object. First and second words must be supplied, but
* the second may be null.
* @param commandWord The CommandWord. UNKNOWN if the command word
* was not recognised.
* @param secondWord The second word of the command. May be null.
*/
public Command(CommandWord commandWord, String secondWord)
{
this.commandWord = commandWord;
this.secondWord = secondWord;
}
/**
* Return the command word (the first word) of this command.
* @return The command word.
*/
public CommandWord 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 == CommandWord.UNKNOWN);
}
/**
* @return true if the command has a second word.
*/
public boolean hasSecondWord()
{
return (secondWord != null);
}
}

View File

@@ -0,0 +1,2 @@
#BlueJ class context
numComments=0

View File

@@ -0,0 +1,11 @@
/**
* Representations for all the valid command words for the game.
*
* @author Michael Kölling and David J. Barnes
* @version 2016.02.29
*/
public enum CommandWord
{
// A value for each command word, plus one for unrecognized commands.
GO, QUIT, HELP, UNKNOWN
}

View File

@@ -0,0 +1,14 @@
#BlueJ class context
comment0.params=
comment0.target=CommandWords()
comment0.text=\r\n\ Constructor\ -\ initialise\ the\ command\ words.\r\n
comment1.params=commandWord
comment1.target=CommandWord\ getCommandWord(java.lang.String)
comment1.text=\r\n\ Find\ the\ CommandWord\ associated\ with\ a\ command\ word.\r\n\ @param\ commandWord\ The\ word\ to\ look\ up\ (as\ a\ string).\r\n\ @return\ The\ CommandWord\ correspondng\ to\ commandWord,\ or\ UNKNOWN\r\n\ \ \ \ \ \ \ \ \ if\ it\ is\ not\ a\ valid\ command\ word.\r\n
comment2.params=aString
comment2.target=boolean\ isCommand(java.lang.String)
comment2.text=\r\n\ Check\ whether\ a\ given\ String\ is\ a\ valid\ command\ word.\ \r\n\ @return\ true\ if\ it\ is,\ false\ if\ it\ isn't.\r\n
comment3.params=
comment3.target=void\ showAll()
comment3.text=\r\n\ Print\ all\ valid\ commands\ to\ System.out.\r\n
numComments=4

View File

@@ -0,0 +1,67 @@
import java.util.HashMap;
/**
* 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 mapping between a command word and the CommandWord
// associated with it.
private HashMap<String, CommandWord> validCommands;
/**
* Constructor - initialise the command words.
*/
public CommandWords()
{
validCommands = new HashMap<>();
validCommands.put("go", CommandWord.GO);
validCommands.put("help", CommandWord.HELP);
validCommands.put("quit", CommandWord.QUIT);
}
/**
* Find the CommandWord associated with a command word.
* @param commandWord The word to look up (as a string).
* @return The CommandWord correspondng to commandWord, or UNKNOWN
* if it is not a valid command word.
*/
public CommandWord getCommandWord(String commandWord)
{
CommandWord command = validCommands.get(commandWord);
if(command != null) {
return command;
}
else {
return CommandWord.UNKNOWN;
}
}
/**
* Check whether a given String is a valid command word.
* @return true if it is, false if it isn't.
*/
public boolean isCommand(String aString)
{
return validCommands.containsKey(aString);
}
/**
* Print all valid commands to System.out.
*/
public void showAll()
{
for(String command : validCommands.keySet()) {
System.out.print(command + " ");
}
System.out.println();
}
}

View File

@@ -0,0 +1,26 @@
#BlueJ class context
comment0.params=
comment0.target=Game()
comment0.text=\r\n\ Create\ the\ game\ and\ initialise\ its\ internal\ map.\r\n
comment1.params=
comment1.target=void\ createRooms()
comment1.text=\r\n\ Create\ all\ the\ rooms\ and\ link\ their\ exits\ together.\r\n
comment2.params=
comment2.target=void\ play()
comment2.text=\r\n\ \ Main\ play\ routine.\ \ Loops\ until\ end\ of\ play.\r\n
comment3.params=
comment3.target=void\ printWelcome()
comment3.text=\r\n\ Print\ out\ the\ opening\ message\ for\ the\ player.\r\n
comment4.params=command
comment4.target=boolean\ processCommand(Command)
comment4.text=\r\n\ Given\ a\ command,\ process\ (that\ is\:\ execute)\ the\ command.\r\n\ @param\ command\ The\ command\ to\ be\ processed.\r\n\ @return\ true\ If\ the\ command\ ends\ the\ game,\ false\ otherwise.\r\n
comment5.params=
comment5.target=void\ printHelp()
comment5.text=\r\n\ Print\ out\ some\ help\ information.\r\n\ Here\ we\ print\ some\ stupid,\ cryptic\ message\ and\ a\ list\ of\ the\ \r\n\ command\ words.\r\n
comment6.params=command
comment6.target=void\ goRoom(Command)
comment6.text=\ \r\n\ Try\ to\ go\ in\ one\ direction.\ If\ there\ is\ an\ exit,\ enter\ the\ new\r\n\ room,\ otherwise\ print\ an\ error\ message.\r\n
comment7.params=command
comment7.target=boolean\ quit(Command)
comment7.text=\ \r\n\ "Quit"\ was\ entered.\ Check\ the\ rest\ of\ the\ command\ to\ see\r\n\ whether\ we\ really\ quit\ the\ game.\r\n\ @return\ true,\ if\ this\ command\ quits\ the\ game,\ false\ otherwise.\r\n
numComments=8

View File

@@ -0,0 +1,182 @@
/**
* 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 outside, theater, pub, lab, office;
// create the rooms
outside = new Room("outside the main entrance of the university");
theater = new Room("in a lecture theater");
pub = new Room("in the campus pub");
lab = new Room("in a computing lab");
office = new Room("in the computing admin office");
// initialise room exits
outside.setExit("east", theater);
outside.setExit("south", lab);
outside.setExit("west", pub);
theater.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 '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();
switch (commandWord) {
case UNKNOWN:
System.out.println("I don't know what you mean...");
break;
case HELP:
printHelp();
break;
case GO:
goRoom(command);
break;
case QUIT:
wantToQuit = quit(command);
break;
}
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 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 = 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
}
}
}

View File

@@ -0,0 +1,11 @@
#BlueJ class context
comment0.params=
comment0.target=Parser()
comment0.text=\r\n\ Create\ a\ parser\ to\ read\ from\ the\ terminal\ window.\r\n
comment1.params=
comment1.target=Command\ getCommand()
comment1.text=\r\n\ @return\ The\ next\ command\ from\ the\ user.\r\n
comment2.params=
comment2.target=void\ showCommands()
comment2.text=\r\n\ Print\ out\ a\ list\ of\ valid\ command\ words.\r\n
numComments=3

View File

@@ -0,0 +1,66 @@
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.
}
}
return new Command(commands.getCommandWord(word1), word2);
}
/**
* Print out a list of valid command words.
*/
public void showCommands()
{
commands.showAll();
}
}

View File

@@ -0,0 +1,21 @@
Project: zuul-with-enums-v1
Authors: Michael Kölling and David J. Barnes
This project is part of the material for the book
Objects First with Java - A Practical Introduction using BlueJ
Sixth edition
David J. Barnes and Michael Kölling
Pearson Education, 2016
This project is a simple framework for an adventure game. In this version,
it has a few rooms and the ability for a player to walk between these rooms.
That's all.
To start this application, create an instance of class "Game" and call its
"play" method.
This project was written to illustrate the use of enums to support
language independence of the game logic.
Read chapter 8 of the book to get a detailed description of the project.

View File

@@ -0,0 +1,20 @@
#BlueJ class context
comment0.params=description
comment0.target=Room(java.lang.String)
comment0.text=\n\ Create\ a\ room\ described\ "description".\ Initially,\ it\ has\n\ no\ exits.\ "description"\ is\ something\ like\ "a\ kitchen"\ or\n\ "an\ open\ court\ yard".\n\ @param\ description\ The\ room's\ description.\n
comment1.params=direction\ neighbor
comment1.target=void\ setExit(java.lang.String,\ Room)
comment1.text=\n\ Define\ an\ exit\ from\ this\ room.\n\ @param\ direction\ The\ direction\ of\ the\ exit.\n\ @param\ neighbor\ \ The\ room\ to\ which\ the\ exit\ leads.\n
comment2.params=
comment2.target=java.lang.String\ getShortDescription()
comment2.text=\n\ @return\ The\ short\ description\ of\ the\ room\n\ (the\ one\ that\ was\ defined\ in\ the\ constructor).\n
comment3.params=
comment3.target=java.lang.String\ getLongDescription()
comment3.text=\n\ Return\ a\ description\ of\ the\ room\ in\ the\ form\:\n\ \ \ \ \ You\ are\ in\ the\ kitchen.\n\ \ \ \ \ Exits\:\ north\ west\n\ @return\ A\ long\ description\ of\ this\ room\n
comment4.params=
comment4.target=java.lang.String\ getExitString()
comment4.text=\n\ Return\ a\ string\ describing\ the\ room's\ exits,\ for\ example\n\ "Exits\:\ north\ west".\n\ @return\ Details\ of\ the\ room's\ exits.\n
comment5.params=direction
comment5.target=Room\ getExit(java.lang.String)
comment5.text=\n\ Return\ the\ room\ that\ is\ reached\ if\ we\ go\ from\ this\ room\ in\ direction\n\ "direction".\ If\ there\ is\ no\ room\ in\ that\ direction,\ return\ null.\n\ @param\ direction\ The\ exit's\ direction.\n\ @return\ The\ room\ in\ the\ given\ direction.\n
numComments=6

View File

@@ -0,0 +1,92 @@
import java.util.Set;
import java.util.HashMap;
import java.util.Iterator;
/**
* 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. For each existing exit, the room
* stores a reference to the neighboring room.
*
* @author Michael Kölling and David J. Barnes
* @version 2016.02.29
*/
public class Room
{
private String description;
private HashMap<String, Room> exits; // stores exits of this room.
/**
* 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;
exits = new HashMap<>();
}
/**
* Define an exit from this room.
* @param direction The direction of the exit.
* @param neighbor The room to which the exit leads.
*/
public void setExit(String direction, Room neighbor)
{
exits.put(direction, neighbor);
}
/**
* @return The short description of the room
* (the one that was defined in the constructor).
*/
public String getShortDescription()
{
return description;
}
/**
* Return a description of the room in the form:
* You are in the kitchen.
* Exits: north west
* @return A long description of this room
*/
public String getLongDescription()
{
return "You are " + description + ".\n" + getExitString();
}
/**
* Return a string describing the room's exits, for example
* "Exits: north west".
* @return Details of the room's exits.
*/
private String getExitString()
{
String returnString = "Exits:";
Set<String> keys = exits.keySet();
for(String exit : keys) {
returnString += " " + exit;
}
return returnString;
}
/**
* Return the room that is reached if we go from this room in direction
* "direction". If there is no room in that direction, return null.
* @param direction The exit's direction.
* @return The room in the given direction.
*/
public Room getExit(String direction)
{
return exits.get(direction);
}
}

View File

@@ -0,0 +1,118 @@
#BlueJ package file
dependency1.from=Command
dependency1.to=CommandWord
dependency1.type=UsesDependency
dependency2.from=Parser
dependency2.to=CommandWords
dependency2.type=UsesDependency
dependency3.from=Parser
dependency3.to=Command
dependency3.type=UsesDependency
dependency4.from=CommandWords
dependency4.to=CommandWord
dependency4.type=UsesDependency
dependency5.from=Game
dependency5.to=Parser
dependency5.type=UsesDependency
dependency6.from=Game
dependency6.to=Room
dependency6.type=UsesDependency
dependency7.from=Game
dependency7.to=Command
dependency7.type=UsesDependency
dependency8.from=Game
dependency8.to=CommandWord
dependency8.type=UsesDependency
objectbench.height=76
objectbench.width=852
package.editor.height=490
package.editor.width=744
package.editor.x=70
package.editor.y=80
package.numDependencies=8
package.numTargets=6
package.showExtends=true
package.showUses=true
project.charset=UTF-8
readme.editor.height=661
readme.editor.width=851
readme.editor.x=39
readme.editor.y=23
target1.editor.height=732
target1.editor.width=889
target1.editor.x=196
target1.editor.y=44
target1.height=60
target1.name=Game
target1.naviview.expanded=true
target1.showInterface=false
target1.type=ClassTarget
target1.typeParameters=
target1.width=100
target1.x=70
target1.y=110
target2.editor.height=707
target2.editor.width=896
target2.editor.x=50
target2.editor.y=60
target2.height=60
target2.name=Command
target2.naviview.expanded=true
target2.showInterface=false
target2.type=ClassTarget
target2.typeParameters=
target2.width=100
target2.x=400
target2.y=260
target3.editor.height=671
target3.editor.width=852
target3.editor.x=191
target3.editor.y=76
target3.height=60
target3.name=CommandWord
target3.naviview.expanded=true
target3.showInterface=false
target3.type=EnumTarget
target3.typeParameters=
target3.width=130
target3.x=230
target3.y=350
target4.editor.height=697
target4.editor.width=894
target4.editor.x=50
target4.editor.y=60
target4.height=60
target4.name=CommandWords
target4.naviview.expanded=true
target4.showInterface=false
target4.type=ClassTarget
target4.typeParameters=
target4.width=140
target4.x=480
target4.y=130
target5.editor.height=688
target5.editor.width=904
target5.editor.x=50
target5.editor.y=60
target5.height=60
target5.name=Room
target5.naviview.expanded=true
target5.showInterface=false
target5.type=ClassTarget
target5.typeParameters=
target5.width=100
target5.x=200
target5.y=190
target6.editor.height=729
target6.editor.width=890
target6.editor.x=50
target6.editor.y=60
target6.height=60
target6.name=Parser
target6.naviview.expanded=true
target6.showInterface=false
target6.type=ClassTarget
target6.typeParameters=
target6.width=100
target6.x=310
target6.y=60

View File

@@ -0,0 +1,17 @@
#BlueJ class context
comment0.params=commandWord\ secondWord
comment0.target=Command(CommandWord,\ java.lang.String)
comment0.text=\r\n\ Create\ a\ command\ object.\ First\ and\ second\ words\ must\ be\ supplied,\ but\r\n\ the\ second\ may\ be\ null.\r\n\ @param\ commandWord\ The\ CommandWord.\ UNKNOWN\ if\ the\ command\ word\r\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ was\ not\ recognised.\r\n\ @param\ secondWord\ The\ second\ word\ of\ the\ command.\ May\ be\ null.\r\n
comment1.params=
comment1.target=CommandWord\ getCommandWord()
comment1.text=\r\n\ Return\ the\ command\ word\ (the\ first\ word)\ of\ this\ command.\r\n\ @return\ The\ command\ word.\r\n
comment2.params=
comment2.target=java.lang.String\ getSecondWord()
comment2.text=\r\n\ @return\ The\ second\ word\ of\ this\ command.\ Returns\ null\ if\ there\ was\ no\r\n\ second\ word.\r\n
comment3.params=
comment3.target=boolean\ isUnknown()
comment3.text=\r\n\ @return\ true\ if\ this\ command\ was\ not\ understood.\r\n
comment4.params=
comment4.target=boolean\ hasSecondWord()
comment4.text=\r\n\ @return\ true\ if\ the\ command\ has\ a\ second\ word.\r\n
numComments=5

View File

@@ -0,0 +1,72 @@
/**
* This class is part of the "World of Zuul" application.
* "World of Zuul" is a very simple, text based adventure game.
*
* This class holds information about a command that was issued by the user.
* A command currently consists of two parts: a CommandWord and a string
* (for example, if the command was "take map", then the two parts
* are TAKE and "map").
*
* The way this is used is: Commands are already checked for being valid
* command words. If the user entered an invalid command (a word that is not
* known) then the CommandWord is UNKNOWN.
*
* If the command had only one word, then the second word is <null>.
*
* @author Michael Kölling and David J. Barnes
* @version 2016.02.29
*/
public class Command
{
private CommandWord commandWord;
private String secondWord;
/**
* Create a command object. First and second words must be supplied, but
* the second may be null.
* @param commandWord The CommandWord. UNKNOWN if the command word
* was not recognised.
* @param secondWord The second word of the command. May be null.
*/
public Command(CommandWord commandWord, String secondWord)
{
this.commandWord = commandWord;
this.secondWord = secondWord;
}
/**
* Return the command word (the first word) of this command.
* @return The command word.
*/
public CommandWord 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 == CommandWord.UNKNOWN);
}
/**
* @return true if the command has a second word.
*/
public boolean hasSecondWord()
{
return (secondWord != null);
}
}

View File

@@ -0,0 +1,8 @@
#BlueJ class context
comment0.params=commandString
comment0.target=CommandWord(java.lang.String)
comment0.text=\r\n\ Initialise\ with\ the\ corresponding\ command\ word.\r\n\ @param\ commandWord\ The\ command\ string.\r\n
comment1.params=
comment1.target=java.lang.String\ toString()
comment1.text=\r\n\ @return\ The\ command\ word\ as\ a\ string.\r\n
numComments=2

View File

@@ -0,0 +1,33 @@
/**
* Representations for all the valid command words for the game
* along with a string in a particular language.
*
* @author Michael Kölling and David J. Barnes
* @version 2016.02.29
*/
public enum CommandWord
{
// A value for each command word along with its
// corresponding user interface string.
GO("go"), QUIT("quit"), HELP("help"), UNKNOWN("?");
// The command string.
private String commandString;
/**
* Initialise with the corresponding command string.
* @param commandString The command string.
*/
CommandWord(String commandString)
{
this.commandString = commandString;
}
/**
* @return The command word as a string.
*/
public String toString()
{
return commandString;
}
}

View File

@@ -0,0 +1,14 @@
#BlueJ class context
comment0.params=
comment0.target=CommandWords()
comment0.text=\r\n\ Constructor\ -\ initialise\ the\ command\ words.\r\n
comment1.params=commandWord
comment1.target=CommandWord\ getCommandWord(java.lang.String)
comment1.text=\r\n\ Find\ the\ CommandWord\ associated\ with\ a\ command\ word.\r\n\ @param\ commandWord\ The\ word\ to\ look\ up.\r\n\ @return\ The\ CommandWord\ correspondng\ to\ commandWord,\ or\ UNKNOWN\r\n\ \ \ \ \ \ \ \ \ if\ it\ is\ not\ a\ valid\ command\ word.\r\n
comment2.params=aString
comment2.target=boolean\ isCommand(java.lang.String)
comment2.text=\r\n\ Check\ whether\ a\ given\ String\ is\ a\ valid\ command\ word.\ \r\n\ @return\ true\ if\ it\ is,\ false\ if\ it\ isn't.\r\n
comment3.params=
comment3.target=void\ showAll()
comment3.text=\r\n\ Print\ all\ valid\ commands\ to\ System.out.\r\n
numComments=4

View File

@@ -0,0 +1,69 @@
import java.util.HashMap;
/**
* 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 mapping between a command word and the CommandWord
// associated with it.
private HashMap<String, CommandWord> validCommands;
/**
* Constructor - initialise the command words.
*/
public CommandWords()
{
validCommands = new HashMap<>();
for(CommandWord command : CommandWord.values()) {
if(command != CommandWord.UNKNOWN) {
validCommands.put(command.toString(), command);
}
}
}
/**
* Find the CommandWord associated with a command word.
* @param commandWord The word to look up.
* @return The CommandWord correspondng to commandWord, or UNKNOWN
* if it is not a valid command word.
*/
public CommandWord getCommandWord(String commandWord)
{
CommandWord command = validCommands.get(commandWord);
if(command != null) {
return command;
}
else {
return CommandWord.UNKNOWN;
}
}
/**
* Check whether a given String is a valid command word.
* @return true if it is, false if it isn't.
*/
public boolean isCommand(String aString)
{
return validCommands.containsKey(aString);
}
/**
* Print all valid commands to System.out.
*/
public void showAll()
{
for(String command : validCommands.keySet()) {
System.out.print(command + " ");
}
System.out.println();
}
}

View File

@@ -0,0 +1,26 @@
#BlueJ class context
comment0.params=
comment0.target=Game()
comment0.text=\r\n\ Create\ the\ game\ and\ initialise\ its\ internal\ map.\r\n
comment1.params=
comment1.target=void\ createRooms()
comment1.text=\r\n\ Create\ all\ the\ rooms\ and\ link\ their\ exits\ together.\r\n
comment2.params=
comment2.target=void\ play()
comment2.text=\r\n\ \ Main\ play\ routine.\ \ Loops\ until\ end\ of\ play.\r\n
comment3.params=
comment3.target=void\ printWelcome()
comment3.text=\r\n\ Print\ out\ the\ opening\ message\ for\ the\ player.\r\n
comment4.params=command
comment4.target=boolean\ processCommand(Command)
comment4.text=\r\n\ Given\ a\ command,\ process\ (that\ is\:\ execute)\ the\ command.\r\n\ @param\ command\ The\ command\ to\ be\ processed.\r\n\ @return\ true\ If\ the\ command\ ends\ the\ game,\ false\ otherwise.\r\n
comment5.params=
comment5.target=void\ printHelp()
comment5.text=\r\n\ Print\ out\ some\ help\ information.\r\n\ Here\ we\ print\ some\ stupid,\ cryptic\ message\ and\ a\ list\ of\ the\ \r\n\ command\ words.\r\n
comment6.params=command
comment6.target=void\ goRoom(Command)
comment6.text=\ \r\n\ Try\ to\ go\ in\ one\ direction.\ If\ there\ is\ an\ exit,\ enter\ the\ new\r\n\ room,\ otherwise\ print\ an\ error\ message.\r\n
comment7.params=command
comment7.target=boolean\ quit(Command)
comment7.text=\ \r\n\ "Quit"\ was\ entered.\ Check\ the\ rest\ of\ the\ command\ to\ see\r\n\ whether\ we\ really\ quit\ the\ game.\r\n\ @return\ true,\ if\ this\ command\ quits\ the\ game,\ false\ otherwise.\r\n
numComments=8

View File

@@ -0,0 +1,182 @@
/**
* 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 outside, theater, pub, lab, office;
// create the rooms
outside = new Room("outside the main entrance of the university");
theater = new Room("in a lecture theater");
pub = new Room("in the campus pub");
lab = new Room("in a computing lab");
office = new Room("in the computing admin office");
// initialise room exits
outside.setExit("east", theater);
outside.setExit("south", lab);
outside.setExit("west", pub);
theater.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();
switch (commandWord) {
case UNKNOWN:
System.out.println("I don't know what you mean...");
break;
case HELP:
printHelp();
break;
case GO:
goRoom(command);
break;
case QUIT:
wantToQuit = quit(command);
break;
}
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 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 = 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
}
}
}

View File

@@ -0,0 +1,11 @@
#BlueJ class context
comment0.params=
comment0.target=Parser()
comment0.text=\r\n\ Create\ a\ parser\ to\ read\ from\ the\ terminal\ window.\r\n
comment1.params=
comment1.target=Command\ getCommand()
comment1.text=\r\n\ @return\ The\ next\ command\ from\ the\ user.\r\n
comment2.params=
comment2.target=void\ showCommands()
comment2.text=\r\n\ Print\ out\ a\ list\ of\ valid\ command\ words.\r\n
numComments=3

View File

@@ -0,0 +1,66 @@
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.
}
}
return new Command(commands.getCommandWord(word1), word2);
}
/**
* Print out a list of valid command words.
*/
public void showCommands()
{
commands.showAll();
}
}

View File

@@ -0,0 +1,21 @@
Project: zuul-with-enums-v2
Authors: Michael Kölling and David J. Barnes
This project is part of the material for the book
Objects First with Java - A Practical Introduction using BlueJ
Sixth edition
David J. Barnes and Michael Kölling
Pearson Education, 2016
This project is a simple framework for an adventure game. In this version,
it has a few rooms and the ability for a player to walk between these rooms.
That's all.
To start this application, create an instance of class "Game" and call its
"play" method.
This project was written to illustrate the use of enums to support
language independence of the game logic.
Read chapter 8 of the book to get a detailed description of the project.

View File

@@ -0,0 +1,20 @@
#BlueJ class context
comment0.params=description
comment0.target=Room(java.lang.String)
comment0.text=\r\n\ Create\ a\ room\ described\ "description".\ Initially,\ it\ has\r\n\ no\ exits.\ "description"\ is\ something\ like\ "a\ kitchen"\ or\r\n\ "an\ open\ court\ yard".\r\n\ @param\ description\ The\ room's\ description.\r\n
comment1.params=direction\ neighbor
comment1.target=void\ setExit(java.lang.String,\ Room)
comment1.text=\r\n\ Define\ an\ exit\ from\ this\ room.\r\n\ @param\ direction\ The\ direction\ of\ the\ exit.\r\n\ @param\ neighbor\ \ The\ room\ to\ which\ the\ exit\ leads.\r\n
comment2.params=
comment2.target=java.lang.String\ getShortDescription()
comment2.text=\r\n\ @return\ The\ short\ description\ of\ the\ room\r\n\ (the\ one\ that\ was\ defined\ in\ the\ constructor).\r\n
comment3.params=
comment3.target=java.lang.String\ getLongDescription()
comment3.text=\r\n\ Return\ a\ description\ of\ the\ room\ in\ the\ form\:\r\n\ \ \ \ \ You\ are\ in\ the\ kitchen.\r\n\ \ \ \ \ Exits\:\ north\ west\r\n\ @return\ A\ long\ description\ of\ this\ room\r\n
comment4.params=
comment4.target=java.lang.String\ getExitString()
comment4.text=\r\n\ Return\ a\ string\ describing\ the\ room's\ exits,\ for\ example\r\n\ "Exits\:\ north\ west".\r\n\ @return\ Details\ of\ the\ room's\ exits.\r\n
comment5.params=direction
comment5.target=Room\ getExit(java.lang.String)
comment5.text=\r\n\ Return\ the\ room\ that\ is\ reached\ if\ we\ go\ from\ this\ room\ in\ direction\r\n\ "direction".\ If\ there\ is\ no\ room\ in\ that\ direction,\ return\ null.\r\n\ @param\ direction\ The\ exit's\ direction.\r\n\ @return\ The\ room\ in\ the\ given\ direction.\r\n
numComments=6

View File

@@ -0,0 +1,92 @@
import java.util.Set;
import java.util.HashMap;
import java.util.Iterator;
/**
* 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. For each existing exit, the room
* stores a reference to the neighboring room.
*
* @author Michael Kölling and David J. Barnes
* @version 2016.02.29
*/
public class Room
{
private String description;
private HashMap<String, Room> exits; // stores exits of this room.
/**
* 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;
exits = new HashMap<>();
}
/**
* Define an exit from this room.
* @param direction The direction of the exit.
* @param neighbor The room to which the exit leads.
*/
public void setExit(String direction, Room neighbor)
{
exits.put(direction, neighbor);
}
/**
* @return The short description of the room
* (the one that was defined in the constructor).
*/
public String getShortDescription()
{
return description;
}
/**
* Return a description of the room in the form:
* You are in the kitchen.
* Exits: north west
* @return A long description of this room
*/
public String getLongDescription()
{
return "You are " + description + ".\n" + getExitString();
}
/**
* Return a string describing the room's exits, for example
* "Exits: north west".
* @return Details of the room's exits.
*/
private String getExitString()
{
String returnString = "Exits:";
Set<String> keys = exits.keySet();
for(String exit : keys) {
returnString += " " + exit;
}
return returnString;
}
/**
* Return the room that is reached if we go from this room in direction
* "direction". If there is no room in that direction, return null.
* @param direction The exit's direction.
* @return The room in the given direction.
*/
public Room getExit(String direction)
{
return exits.get(direction);
}
}

View File

@@ -0,0 +1,118 @@
#BlueJ package file
dependency1.from=Command
dependency1.to=CommandWord
dependency1.type=UsesDependency
dependency2.from=Parser
dependency2.to=CommandWords
dependency2.type=UsesDependency
dependency3.from=Parser
dependency3.to=Command
dependency3.type=UsesDependency
dependency4.from=CommandWords
dependency4.to=CommandWord
dependency4.type=UsesDependency
dependency5.from=Game
dependency5.to=Parser
dependency5.type=UsesDependency
dependency6.from=Game
dependency6.to=Room
dependency6.type=UsesDependency
dependency7.from=Game
dependency7.to=Command
dependency7.type=UsesDependency
dependency8.from=Game
dependency8.to=CommandWord
dependency8.type=UsesDependency
objectbench.height=76
objectbench.width=886
package.editor.height=489
package.editor.width=778
package.editor.x=70
package.editor.y=80
package.numDependencies=8
package.numTargets=6
package.showExtends=true
package.showUses=true
project.charset=UTF-8
readme.editor.height=661
readme.editor.width=810
readme.editor.x=38
readme.editor.y=23
target1.editor.height=655
target1.editor.width=926
target1.editor.x=39
target1.editor.y=141
target1.height=60
target1.name=Game
target1.naviview.expanded=true
target1.showInterface=false
target1.type=ClassTarget
target1.typeParameters=
target1.width=100
target1.x=90
target1.y=120
target2.editor.height=672
target2.editor.width=874
target2.editor.x=50
target2.editor.y=60
target2.height=60
target2.name=Command
target2.naviview.expanded=true
target2.showInterface=false
target2.type=ClassTarget
target2.typeParameters=
target2.width=100
target2.x=410
target2.y=280
target3.editor.height=732
target3.editor.width=904
target3.editor.x=376
target3.editor.y=68
target3.height=60
target3.name=CommandWord
target3.naviview.expanded=true
target3.showInterface=false
target3.type=EnumTarget
target3.typeParameters=
target3.width=130
target3.x=270
target3.y=380
target4.editor.height=683
target4.editor.width=832
target4.editor.x=436
target4.editor.y=87
target4.height=60
target4.name=CommandWords
target4.naviview.expanded=true
target4.showInterface=false
target4.type=ClassTarget
target4.typeParameters=
target4.width=140
target4.x=510
target4.y=150
target5.editor.height=705
target5.editor.width=890
target5.editor.x=50
target5.editor.y=60
target5.height=60
target5.name=Room
target5.naviview.expanded=true
target5.showInterface=false
target5.type=ClassTarget
target5.typeParameters=
target5.width=100
target5.x=210
target5.y=230
target6.editor.height=692
target6.editor.width=905
target6.editor.x=50
target6.editor.y=60
target6.height=60
target6.name=Parser
target6.naviview.expanded=true
target6.showInterface=false
target6.type=ClassTarget
target6.typeParameters=
target6.width=100
target6.x=310
target6.y=70