📄 fox.java
字号:
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 Kolling * @version 2006.03.30 */public class Fox{ // Characteristics shared by all foxes (static fields). // The age at which a fox can start to breed. private static final int BREEDING_AGE = 10; // 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.09; // The maximum number of births. private static final int MAX_LITTER_SIZE = 3; // 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 RABBIT_FOOD_VALUE = 4; // A shared random number generator to control breeding. private static final Random rand = new Random(); // Individual characteristics (instance fields). // The fox's age. private int age; // Whether the fox is alive or not. private boolean alive; // The fox's position private Location location; // 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 random age. * * @param randomAge If true, the fox will have random age and hunger level. */ public Fox(boolean randomAge) { age = 0; alive = true; if(randomAge) { age = rand.nextInt(MAX_AGE); foodLevel = rand.nextInt(RABBIT_FOOD_VALUE); } else { // leave age at 0 foodLevel = RABBIT_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 currentField The field currently occupied. * @param updatedField The field to transfer to. * @param newFoxes A list to add newly born foxes to. */ public void hunt(Field currentField, Field updatedField, List<Fox> newFoxes) { incrementAge(); incrementHunger(); if(alive) { // New foxes are born into adjacent locations. int births = breed(); for(int b = 0; b < births; b++) { Fox newFox = new Fox(false); newFoxes.add(newFox); Location loc = updatedField.randomAdjacentLocation(location); newFox.setLocation(loc); updatedField.place(newFox, loc); } // Move towards the source of food if found. Location newLocation = findFood(currentField, location); if(newLocation == null) { // no food found - move randomly newLocation = updatedField.freeAdjacentLocation(location); } if(newLocation != null) { setLocation(newLocation); updatedField.place(this, newLocation); } else { // can neither move nor stay - overcrowding - all locations taken alive = false; } } } /** * Increase the age. This could result in the fox's death. */ private void incrementAge() { age++; if(age > MAX_AGE) { alive = false; } } /** * Make this fox more hungry. This could result in the fox's death. */ private void incrementHunger() { foodLevel--; if(foodLevel <= 0) { alive = false; } } /** * Tell the fox to look for rabbits adjacent to its current location. * Only the first live rabbit is eaten. * @param field The field in which it must look. * @param location Where in the field it is located. * @return Where food was found, or null if it wasn't. */ private Location findFood(Field field, Location location) { Iterator<Location> adjacentLocations = field.adjacentLocations(location); while(adjacentLocations.hasNext()) { Location where = adjacentLocations.next(); Object animal = field.getObjectAt(where); if(animal instanceof Rabbit) { Rabbit rabbit = (Rabbit) animal; if(rabbit.isAlive()) { rabbit.setEaten(); foodLevel = RABBIT_FOOD_VALUE; return where; } } } return null; } /** * 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; } /** * Check whether the fox is alive or not. * @return True if the fox is still alive. */ public boolean isAlive() { return alive; } /** * Set the animal's location. * @param row The vertical coordinate of the location. * @param col The horizontal coordinate of the location. */ public void setLocation(int row, int col) { this.location = new Location(row, col); } /** * Set the fox's location. * @param location The fox's location. */ public void setLocation(Location location) { this.location = location; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -