first commit
This commit is contained in:
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
@@ -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;
|
||||
}
|
||||
}
|
26
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Game.ctxt
Executable file
26
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Game.ctxt
Executable 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
|
212
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Game.java
Executable file
212
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Game.java
Executable 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
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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.
|
11
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Room.ctxt
Executable file
11
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Room.ctxt
Executable 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
|
66
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Room.java
Executable file
66
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-bad/Room.java
Executable 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;
|
||||
}
|
||||
|
||||
}
|
@@ -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
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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
|
179
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-better/Game.java
Executable file
179
Semester 1/Programming 1/Java/examples/projects/chapter08/zuul-better/Game.java
Executable 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
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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.
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,2 @@
|
||||
#BlueJ class context
|
||||
numComments=0
|
@@ -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
|
||||
}
|
@@ -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
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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.
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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.
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
Reference in New Issue
Block a user