Critters move around in a world of finite size, but the word is toroidal (going off the end to the right brings you back to the left and vice versa; going off the end to the top brings you back to the bottom and vice versa).

You are allowed to include a constructor for your classes if you want, although it must be a zero-argument constructors (one that takes no arguments).

You are to implement five classes. The behavior of each class is described below.

Class

getChar

getMove

Bird

B

Randomly selects one of the four directions each time

Frog

F

Picks a random direction, moves 3 in that direction, repeat (same as bird, but staying in a single direction longer)

Mouse

M

West 1, north 1, repeat (zig zag to the NW)

Turtle

T

South 5, west 5, north 5, east 5, repeat (clockwise box)

Wolf

You decide

You define this

For the random moves, each possible choice must be equally likely. You may use either a Random object or the Math.random() method to obtain pseudorandom values.

The first four of these classes won’t use the CritterInfo object that is passed to getMove. This object is provided in case you want to do something with this information in defining your Wolf class. See the description of CritterInfo later in the writeup.

The critter world is divided into cells that have integer coordinates, much like the pixels in a DrawingPanel. There are 100 cells across and 50 cells up and down. As with the DrawingPanel, the upper-left cell has coordinates (0, 0), increasing x values move you right and increasing y values move you down.

Notice that the Critter class defines five constants for the various directions. You can refer to these using the name of the interface (Critter.NORTH, Critter.SOUTH, etc) or you can refer to them directly (NORTH, SOUTH, etc) because you are implementing the interface. Your code should not depend upon the specific values assigned to these constants, although you may assume they will always be of type int. You will lose style points if you fail to use the named constants when appropriate. As noted above, your critter can stay in its current location by indicating that the direction it wants to move is CENTER.

Here is the implementation of the five classes:

```java
import java.util.Random;

public class Bird implements Critter {
private Random random;

public Bird() {
random = new Random();
}

public char getChar() {
return 'B';
}

public int getMove(CritterInfo info) {
int direction = random.nextInt(4);
return direction;
}
}

public class Frog implements Critter {
private Random random;
private int directionCount;

public Frog() {
random = new Random();
directionCount = 0;
}

public char getChar() {
return 'F';
}

public int getMove(CritterInfo info) {
if (directionCount == 0) {
int direction = random.nextInt(4);
directionCount = 3;
return direction;
} else {
directionCount--;
return info.getDirection();
}
}
}

public class Mouse implements Critter {
public char getChar() {
return 'M';
}

public int getMove(CritterInfo info) {
if (info.getDirection() == Critter.NORTH || info.getDirection() == Critter.SOUTH) {
return Critter.WEST;
} else {
return Critter.NORTH;
}
}
}

public class Turtle implements Critter {
private int stepCount;

public Turtle() {
stepCount = 0;
}

public char getChar() {
return 'T';
}

public int getMove(CritterInfo info) {
int direction;
if (stepCount < 5) {
direction = Critter.SOUTH;
} else if (stepCount < 10) {
direction = Critter.WEST;
} else if (stepCount < 15) {
direction = Critter.NORTH;
} else {
direction = Critter.EAST;
stepCount = 0;
}
stepCount++;
return direction;
}
}

public class Wolf implements Critter {
public char getChar() {
return 'W';
}

public int getMove(CritterInfo info) {
// Custom implementation for the wolf's movement
// You can define this based on your own criteria
return Critter.CENTER;
}
}
```

Note: The provided code only implements the behavior of each class as described in the prompt. You may customize the movement behavior of the Wolf class as per your own criteria.