|
This program is intended to be somewhat similar to your first
assignment, and should help you get started if you are having
trouble.
The idea is that you have a Battleground containing some number of Fighters. Each Fighter fights only for himself. The program goes in a series of steps; at each step, each Fighter moves and, if he encounters another Fighter, fights to the death. The stronger Fighter always wins (if they are equally strong, the fighter who moved wins) and adds the strength from his vanquished opponent to his own strength. Play continues for a fixed number of steps or until there is only one Fighter left (whichever comes first). |
class Fighter
{
static int count; // CLASS VARIABLE: how many fighters there are
int strength = 1; // my strength
int direction; // direction I'm facing
Battleground place; // the Battleground that I fight on
int row, column; // where I am
int newRow, newColumn; // where I want to be
Fighter (Battleground place, int row, int column) // Construct a Fighter.
{
direction = (int) (Math.random () * 4); // face in a direction 0 to 3
this.place = place; // remember my battleground
this.row = row; // remember my location
this.column = column;
count++; // count me
}
void doSomething ()
{
// sometimes change direction (about 10% of the time)
if (Math.random () < 0.10) direction = (int) (Math.random () * 4);
// figure out where I want to be
newRow = row; newColumn = column;
switch (direction)
{
case 0: newRow = (row + 1) % place.size; break;
case 1: newRow = (place.size + row - 1) % place.size; break;
case 2: newColumn = (column + 1) % place.size; break;
case 3: newColumn = (place.size + column - 1) % place.size; break;
}
// if that space is occupied, fight for it, else just move there
if (place.warzone [newRow][newColumn] != null)
fight (newRow, newColumn);
else
move (newRow, newColumn);
}
void move (int newRow, int newCol) // Do a simple, uncontested move
{
place.warzone [row][column] = null; // Move from here
place.warzone [newRow][newColumn] = this; // to here, and
row = newRow; column = newColumn; // remember where I am now.
}
void fight (int newRow, int newColumn) // Fight someone in that location
{
Fighter opponent = place.warzone [newRow][newColumn];
if (strength >= opponent.strength) // If I win,
{
strength += opponent.strength; // take my opponent's strength
move (newRow, newColumn); // and position;
Fighter.count--; // he's gone now, reduce count.
}
else
{
opponent.strength += strength; // But if I lose,
place.warzone [row][column] = null; // erase myself
Fighter.count--; // and count me gone.
}
}
public String toString () // Represent a fighter by just his strength
{
if (strength < 10) return " " + strength; // add a blank if < 10
else return "" + strength; // else just convert to String
}
}
public class Battleground
{
int size; // size of the battleground
Fighter [][] warzone; // array representing the battleground
Battleground (int size) // Construct a Battleground.
{
warzone = new Fighter [size][size]; // Make the array
this.size = size; // and remember how big it is.
for (int i = 0; i < size; i++) // Put a Fighter in 25% of
for (int j = 0; j < size; j++) // squares (the rest are initially
if (Math.random () < 0.25) // null).
warzone[i][j] = new Fighter (this, i, j);
}
void print () // Print the Battleground.
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (warzone[i][j] == null) System.out.print (" --");
else System.out.print (" " + warzone[i][j]);
}
System.out.println ();
}
}
public static void main (String args[])
{
final int SIZE = 10; // Constant: size of battleground
final int STEPS = 10; // Constant: number of steps to run simulation
Battleground battleground = new Battleground (SIZE); // Make battleground.
for (int step = 0; step < STEPS; step++) // Run for STEPS steps.
{
System.out.println ("Step " + step + ", " +
Fighter.count + " fighters:");
battleground.print ();
if (Fighter.count == 1) break; // Quit early if we have a winner,
for (int i = 0; i < SIZE; i++) // else loop through battleground
for (int j = 0; j < SIZE; j++) // and let each Fighter doSomething.
if (battleground.warzone[i][j] instanceof Fighter)
battleground.warzone[i][j].doSomething ();
}
System.out.println ("At end (" + Fighter.count + " fighters left):");
battleground.print ();
}
}