| CIT 591 Assignment 5: Hints for Traffic Jam Fall 2003, David Matuszek |
You should have classes Car, Truck, and Vehicle.
You should have other classes as well. Believe it or not, common sense applies--for
example, a Car class has no business creating a traffic array (though
it may well need to have a reference to one.)
The java.util class contains a Random class with
a nextInt(int) method. This is perfect for getting random numbers.
If all your random numbers are the same number, you are probably creating more
than one instance of Random. You only need one. The static
keyword is good for this.
As mentioned in the labs, you can assume a maximum of 26 vehicles (so you don't run out of names.)
Here's an easy way to generate names as needed. Declare a static
variable, such as in the class where you need the names. To step to the next name,
use nextName++.
To change a char (or anything else) to a String,
just concatenate it with the empty string: By default, doing this with your objects will
yield a string something like Car@07AF20E0, but you can write a
method in your
class and have it return any string you like (such as the "name" of
your Vehicle).
Here's a little method I'll provide "for free":
static int manhattanDistance(int row1, int column1,
int row2, int column2) {
return Math.abs(row1 - row2) + Math.abs(column1 - column2);
}
Initially, Trucks may be oriented either horizontally or vertically.
You don't have to worry about choosing the orientation completely randomly.
If you find your car or truck moving down or to the right in one big jump, you are probably doing something like this:
for (int row = 0; row < numberOfRows; row++) {
for (int column = 0; column < numberOfColumn; column++) {
if (traffic[row][column] != null) {
traffic[row][column].move();
}
}
}
The problem with this code is that, as it sweeps through the array, it may move a vehicle down or to the right of its current position; then, on the same sweep through the array, it will encounter the same vehicle again and move it again, possibly many times. There are two ways you might solve this problem: (1) keep a separate (one-dimensional) array of vehicles and sweep through that, or (2) keep in each vehicle the turn number of the last time it was moved, and don't move it again if you are still on the same turn.
Here are some comments about how I did the program. These are not extra requirements; you are free to do your version of the program totally differently.
A Truck occupies two adjacent locations in the traffic grid. I
handled the "extra" location as follows:
currentRow and currentColumn in the
Vehicle class, and when I extended Vehicle with
the Truck class I defined the additional variables extraRow
and extraColumn.Truck, I made sure I had two adjacent locations
available.Vehicle for my traffic grid,
and put a reference to the same Truck object in two adjacent
locations of the array.currentRow and currentColumn
represented the "front" of the Truck; this simplified
figuring out how to move the Truck.I used some abstract methods in the Vehicle class. These are methods
without bodies, such as
The advantage is that instance methods in the Vehicle
class can use these abstract methods, and the actual method that is executed
depends on the type of object (Car or Truck) doing
the work. Using abstract methods allowed me to have less duplicated code.
If you would like to know how I organized this program, here are my javadoc files. I've set javadoc to show all variables and methods, even private ones (but I haven't commented the private ones).