Please read the following carefully. There is a lot here!
This assignment has three parts, which ultimately build to the Spampede game! In Part 1, you will extend the capabilities of your maze solver from HW6 (though you may use our solution code for that assignment if you prefer). In Part 2, you will use the results of Part 1 to build some of the primary functionality of the Spampede game. In Part 3, you will use Part 2 in a graphical applet that you (and your friends) can play on the web!
What is the final product?
The first part of this assignment is to improve the Maze class in which you wrote breadth-first search for assignment 6. In particular, you may start with either your own Maze.java file from last week or you may use our solution to that problem provided with the starter files. Either way, the internal data in the MazeCell (row, col, contents, etc.) MUST be private and you should start by making sure you add at least four public accessor ("getter and setter") methods to the MazeCell class within Maze:
You should have a new zero-input contstructor for Maze. This is already in the solution file, or you can copy it from here:
protected Maze()This constructor loads a maze in from the static data member named mazeStrings, which is simply an array of strings contained in Maze.java. The nice thing about this is that you can edit your Maze directly in the file! Notice that we are assuming that the Maze class has data members named ROWS and COLUMNS that keep track of the dimensions of the array.
{
ROWS = mazeStrings.length;
COLUMNS = mazeStrings[0].length();
this.maze = new MazeCell[ROWS][COLUMNS];
for (int r=0 ; r< ROWS ; r++)
{
for (int c=0 ; c< COLUMNS ; c++)
{
maze[r][c] = new MazeCell(r,c,mazeStrings[r].charAt(c));
}
}
}
What is protected?
When data or methods are given the access level protected, it means that derived classes may use
that data or method. However, unrelated classes may not use that data or method.
Thus, protected is in-between the access level of public, which any class may use, and private,
where only the defining class may use the data or method. Because part 2 of this assignment asks you to
write a class named SpamMaze that will be a class derived from Maze and because
SpamMaze will use this zero-argument constructor, protected is an appropriate access level. Basically, what we are saying is that this constructor should only be used to help create subclass objects not to directly create stand-alone Maze objects.
A more flexible breadth-first-search
The final method to write in Maze.java is
protected MazeCell multiBFS(MazeCell start, char destination) ...which will implement breadth-first search from start to ANY cell containing the character in destination, which will typically be a 'D', representing spam. This method will be critical in implementing the autonomous spam-seeking behavior of the pede. Because it is breadth-first search, the method should find the closest destination to the start MazeCell. Note that this is slightly different from the BFS that you wrote on hw6. Now, you will need to make sure to stop the BFS process when it first reaches a destination of the type that you are looking for!
What should multiBFS do?
This method should have the following behavior:
Testing your code
Be sure to test your code thoroughly before heading to part 2 of this assignment... there is a test in main for this purpose, and you should try editing the mazeStrings in order to make sure it works in a variety of conditions! You do not need to submit any testing this week, though.
The overview
In this part of the assignment you will create a derived class named SpamMaze that handles the model for the applet, which is part 3. A derived
class is simply an extension of the data and capabilities (methods)
available in the base class. Thus, by starting the code as in the
provided SpamMaze.java file:
import java.lang.Math;you should keep in mind that any object of type SpamMaze IS also an object of type Maze. In other words, a SpamMaze can do everything a Maze can do, and more! This is identical to the relationship of every object with Java's Object type. Object is the base class of all Java classes.
import java.util.LinkedList;
class SpamMaze extends Maze
{
// your code goes here...
}
The data
Because a SpamMaze object
represents the model for the Spampede applet, it needs to keep track of
(1) the maze, (2), the centipede, and (3) the spam in the environment.
Remember that (1) is already taken care of because your SpamMaze is a derived class of Maze. To keep track of (2) and (3), you should use lists of MazeCells. In particular, you will declare two data members:
// The data members representing the spam and the centipedeEach of these is of type LinkedList<MazeCell>, which is the Java-library version of a double-ended queue implemented via a linked list. You will thus have access to the methods listed at http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html. Notice especially the methods addFirst, addLast, removeFirst, removeLast, getFirst, getLast, and get(int n). Each get method is similar to peek in that it returns a value, but does not change the list. You can ask the size of a list with size(), which returns an int.
private LinkedList<MazeCell> spamCells;
private LinkedList<MazeCell> pedeCells;
The methods
You should, in essence, implement all of the functionality, but not the
graphics front end, for the Spampede game inside SpamMaze.
At a minimum, you should implement the following methods. You may
choose to add more methods - either private helper methods (to help
these public methods) - or other public methods for your game to use.
Random myGenerator = new Random();
which declares myGenerator to be a random number
generator (an object of type Random) and instantiates
a new such object. Then, the command
myGenerator.nextInt(k) will generate a random integer
in the range from 0 to k-1.
public static final char NORTH = 'N';
So, here's what this method does:
Testing!!
As with Maze, be sure to test your SpamMaze thoroughly in
main before worrying about the graphical front-end of the applet in part 3.
Below is a main method, which you should feel free to adapt to your
implementation. Remember that you do not need to write toString -- the
version that's already in Maze will work perfectly well! Again, you do not need to submit this testing this week.
public static void main(String[] args)
{
SpamMaze SM = new SpamMaze();
System.out.println("SM is\n" + SM);
MazeCell nextSpot = SM.multiBFS(SM.pedeCells.getFirst(), SPAM);
System.out.println("nextSpot is\n" + nextSpot);
System.out.println("SM is\n" + SM);
SM.advancePede(EAST);
System.out.println("SM is\n" + SM);
System.out.println("pedeCells is " + SM.pedeCells);
SM.advancePede(EAST);
System.out.println("SM is\n" + SM);
System.out.println("pedeCells is " + SM.pedeCells);
SM.advancePede(EAST);
System.out.println("SM is\n" + SM);
System.out.println("pedeCells is " + SM.pedeCells);
SM.advancePede(SOUTH);
System.out.println("SM is\n" + SM);
System.out.println("pedeCells is " + SM.pedeCells);
SM.advancePede(SOUTH);
System.out.println("SM is\n" + SM);
System.out.println("pedeCells is " + SM.pedeCells);
}
The overview
The Spampede applet gives a user control over a spam-seeking centipede.
Key presses from the keyboard change the direction of the centipede's
movement in order to intersect snacks (spam) that appear at random places
on the screen. For each snack consumed, the centipede grows
by one segment (a segment is simply one MazeCell). Variations
are welcome (see the extra credit section below)!
Setting up
The "starter" applet
Spampede.java and its html file Spampede.html are
provided
for you on the top-level assignments page.
There are some other files you'll need, like ImagePanel.java, so make sure all the files are in the same directory with the files you developed for parts 1 and 2.
Finally, we have also provided the following files which you may wish to use (but they are totally optional):
This next section is full of details that will help you develop, compile and test your program. They are important to get right, but they can be rather tedious. Follow as much of these guidelines as you need to ensure that you see modifications to your applet and that you can read debugging output somewhere. Once you've got that working, you can go onto the next section where you will create your applet.
Make sure that you can compile the provided "starter" applet with javac *.java. There are two ways to test your applet. (Appletviewer) You can run appletviewer Spampede.html from the directory containing your code, or (browser) you could use a new tab in an open browser and choose "Open ... File" from the menu. Choose the local copy of Spampede.html from the folder in which you just compiled. The applet should start in either case.
The best way to test your applet is to use Java's appletviewer application. In fact, the graders will (at least by default) test your code with appletviewer.
If you're using an IDE like Eclipse or NetBeans, there may be a mechanism for running and testing applets built-in. Dr. Java, however, does not have such a mechanism (to my knowledge). So, if you're using Dr. Java, you'll need to run appletviewer from the command-line on your computer. The instructions are different for the Mac vs. a Windows PC.
Running appletviewer on a Mac
The basic idea is to open a terminal window, navigate to the directory that
holds both your compiled java code and
the Spampede.html file and then run
appletviewer Spampede.htmlHere are some details:
javac *.javato compile all of your java source code in your current folder.
appletviewer Spampede.htmlNote that the name of the .html file (not the classname of the Java class holding the applet) is used here.
Running appletviewer on a PC
As with Mac OS X, the basic idea is to open a terminal window, navigate to the
directory that holds both your compiled java code and
the Spampede.html file and then run
appletviewer Spampede.htmlHere are some details:
> "C:>\Program Files\Java\jdk1.6.0_<version>\bin\appletviewer" Spampede.htmlwhere <version> will depend on the version of the jdk you installed (use the usual explorer interface to see which one it is... . This is a pain to type... you can use tab-completion to do almost all of it for you. If that location is in your path, then appletviewer Spampede.html will work.
Testing - with a note for Vista users...
Perhaps the simplest way to compile, run, and test this program is to use the command-line
compiler and then the appletviewer program to test things. Windows Vista
makes it hard to include the javac, java and appletviewer applications
in your path -- but it is possible:
This URL:
http://banagale.com/changing-your-system-path-in-windows-vista.htm offers step-by-step instructions
for adding a new path to Vista's list of locations where it will search for executables.
The path you will want to add to the end of the list is going to be a small variant on ;"C:\Program
Files\Java\jdk1.6.0_06\bin" The semicolon is Windows's separator for items in a list of paths. The quotes may be optional -
(they're optional in XP, at the very least).
Getting debugging information from the Java console
If you're using appletviewer, the print statements in your code will
appear in the terminal window from which you started the viewer.
If you're using a browser, in order to see output from print statements (or any errors), you should
open the Java console. On the PC, this can be done by right-clicking the
little Java icon from the lower right of your screen and choosing "Open Console."
On the Mac, you may need to go a bit further. Some browsers have a menu option
that simply states "Java Console." Other require you to activate the console first: go to "Applications -
Utilities - Java - J2SE 5.0 (or your version) - Java Preferences," and
then go to the "Advanced" tab, the "Java Console" options, and select "Show Console."
You may need to restart your browser or at least reload the page after this
sequence of commands.
If you run into troubles with these low-level details, please seek help --
they're not worth spending much time over. But it is important to be able to
debug your code through print statements... .
Making sure you get the NEW applet after making changes
If you're using a browser, you can make sure you get the NEW applet to which you've made changes (do remember to
recomplile, too!) by typing an 'x' in the Java Console window. It's also a
good idea to clear the window so that you know which output is from the latest run
of your applet. Then, when you hit the "Reload" button in the browser, the new applet
should be loaded and run. The appletviewer should always reload the most recent version.
As you write your code, please compile and rerun the applet often to make sure you're on the right path. Use the appletviewer (or a web browser with a Java Console) to help with debugging and error-detection. Basically, this means many iterations of the compilation, copying, and testing steps above.
Totally optional! (and not worth any extra credit, but it's fun to show off your applet to others...)
Once your applet is done, it's time to let your friends and family waste hours of precious free time playing Spampede!
First, if you have not been developing your files on the mac labs or on knuth, you will need to copy all of your files into your cs account. You can do this by submitting all of your files, and then downloading them in the lab, or you can directly copy them into your knuth directory using a program such as FileZilla or WinSCP.
Once your files are in your directory on knuth (or in the mac labs--it's the same filesystem), copy the file copyFiles from the directory /cs/cs60/hwfiles/a7 to the directory where your files are with:
> cp /cs/cs60/hwfiles/a7/copyFiles .
Don't miss the "." at the end! You need to execute this command from the directory where you copied your spampede files.
Next, make sure your spampede files are compiled (you might want to run javac *.java just in case).
Finally, to use copyFiles, first give yourself "execute permission" by typing chmod u+x copyFiles. Now you, (the "u" stands for "user" - that's you) have permission to execute this script. Then, type
copyFilesat the unix prompt. If this does not work, type
./copyFiles
When you run copyFiles should expect to see a message like:
chmod: cannot access `/home/apaul/public_html/*.java': No such file or directoryThis is just indicating that there were no java files in your web directory. This is a good thing! We just have a line in the copyFiles script to make sure that if you did copy a java file into your web directory for any reason, it will have its read permissions shut off.
Now, open a web browser and use the url www.cs.hmc.edu/~yourUserName/Spampede.html. Your game should now be running from that web page. If the game display is messed up for any reason, try another browser. Some browsers (rarely) are not configured correctely and cause applets to be drawn "funny". Please do not put any java code on your website. Our script does not do this (it only puts the compiled .clas files and other ancillary stuff) and you should not either to avoid having your code exposed to the world.
Of course, if you make changes to your code in your working directory, you will need to compile it again and copy the files again to your website.
If you haven't had enough of the Spampede.java file at the end of this assignment, there are a couple of specific items and an open-ended invitation to improve on the applet for optional bonus credit. (Up to 25 points in total.)
If you add optional features, please explain them carefully in the README file.