Repository navigation
Expand file tree
/
Copy pathSeaLion.java
More file actions
174 lines (163 loc) · 5.29 KB
/
Copy pathSeaLion.java
File metadata and controls
174 lines (163 loc) · 5.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import java.util.List;
import java.util.Iterator;
import java.util.Random;
/**
* A simple model of a fox.
* Foxes age, move, eat rabbits, and die.
*
* @author David J. Barnes and Michael Kölling
* @version 2016.02.29 (2)
*/
public class SeaLion extends Animal
{
// Characteristics shared by all foxes (class variables).
// The age at which a fox can start to breed.
private static final int BREEDING_AGE = 15;
// The age to which a fox can live.
private static final int MAX_AGE = 150;
// The likelihood of a fox breeding.
private static final double BREEDING_PROBABILITY = 0.08;
// The maximum number of births.
private static final int MAX_LITTER_SIZE = 2;
// The food value of a single rabbit. In effect, this is the
// number of steps a fox can go before it has to eat again.
private static final int SEALION_FOOD_VALUE = 9;
// A shared random number generator to control breeding.
private static final Random rand = Randomizer.getRandom();
// Individual characteristics (instance fields).
// The fox's age.
private int age;
// The fox's food level, which is increased by eating rabbits.
private int foodLevel;
/**
* Create a fox. A fox can be created as a new born (age zero
* and not hungry) or with a random age and food level.
*
* @param randomAge If true, the fox will have random age and hunger level.
* @param field The field currently occupied.
* @param location The location within the field.
*/
public SeaLion(boolean randomAge, Field field, Location location)
{
super(field, location);
if(randomAge) {
age = rand.nextInt(MAX_AGE);
foodLevel = rand.nextInt(SEALION_FOOD_VALUE);
}
else {
age = 0;
foodLevel = SEALION_FOOD_VALUE;
}
}
/**
* This is what the fox does most of the time: it hunts for
* rabbits. In the process, it might breed, die of hunger,
* or die of old age.
* @param field The field currently occupied.
* @param newFoxes A list to return newly born foxes.
*/
public void act(List<Animal> newSeaLions)
{
incrementAge();
incrementHunger();
if(isAlive()) {
giveBirth(newSeaLions);
// Move towards a source of food if found.
Location newLocation = findFood();
if(newLocation == null) {
// No food found - try to move to a free location.
newLocation = getField().freeAdjacentLocation(getLocation());
}
// See if it was possible to move.
if(newLocation != null) {
setLocation(newLocation);
}
else {
// Overcrowding.
setDead();
}
}
}
/**
* Increase the age. This could result in the fox's death.
*/
private void incrementAge()
{
age++;
if(age > MAX_AGE) {
setDead();
}
}
/**
* Make this fox more hungry. This could result in the fox's death.
*/
private void incrementHunger()
{
foodLevel--;
if(foodLevel <= 0) {
setDead();
}
}
/**
* Look for rabbits adjacent to the current location.
* Only the first live rabbit is eaten.
* @return Where food was found, or null if it wasn't.
*/
private Location findFood()
{
Field field = getField();
List<Location> adjacent = field.adjacentLocations(getLocation());
Iterator<Location> it = adjacent.iterator();
while(it.hasNext()) {
Location where = it.next();
Object animal = field.getObjectAt(where);
if(animal instanceof SeaLion) {
SeaLion seaLion = (SeaLion) animal;
if(seaLion.isAlive()) {
seaLion.setDead();
foodLevel = SEALION_FOOD_VALUE;
return where;
}
}
}
return null;
}
/**
* Check whether or not this fox is to give birth at this step.
* New births will be made into free adjacent locations.
* @param newFoxes A list to return newly born foxes.
*/
private void giveBirth(List<Animal> newSeaLions)
{
// New foxes are born into adjacent locations.
// Get a list of adjacent free locations.
Field field = getField();
List<Location> free = field.getFreeAdjacentLocations(getLocation());
int births = breed();
for(int b = 0; b < births && free.size() > 0; b++) {
Location loc = free.remove(0);
SeaLion young = new SeaLion(false, field, loc);
newSeaLions.add(young);
}
}
/**
* Generate a number representing the number of births,
* if it can breed.
* @return The number of births (may be zero).
*/
private int breed()
{
int births = 0;
if(canBreed() && rand.nextDouble() <= BREEDING_PROBABILITY) {
births = rand.nextInt(MAX_LITTER_SIZE) + 1;
}
return births;
}
/**
* A fox can breed if it has reached the breeding age.
*/
private boolean canBreed()
{
return age >= BREEDING_AGE;
}
}