import greenfoot.*;
| An ant that collects food.
|
| @author Michael Kölling
| @version 1.1
|
public class Ant
extends Creature
{
| Every how many steps can we place a pheromone drop.
|
private static final int MAX_PH_LEVEL = 18;
| How long do we keep direction after finding pheromones.
|
private static final int PH_TIME = 30;
| Indicate whether we have any food with us.
|
private boolean carryingFood = false;
| How much pheromone do we have right now.
|
private int pheromoneLevel = MAX_PH_LEVEL;
| How well do we remember the last pheromone - larger number: more recent
|
private int foundLastPheromone = 0;
| Create an ant with a given home hill. The initial speed is zero (not moving).
|
public Ant(AntHill home)
{
setHomeHill(home);
}
| Do what an ant's gotta do.
|
public void act()
{
if (carryingFood) {
walkTowardsHome();
handlePheromoneDrop();
checkHome();
}
else {
searchForFood();
}
}
| Walk around in search of food.
|
private void searchForFood()
{
if (foundLastPheromone > 0) {
foundLastPheromone--;
walkAwayFromHome();
}
else if (smellPheromone()) {
walkTowardsPheromone();
}
else {
randomWalk();
}
checkFood();
}
| Are we home? Drop the food if we are, and start heading back out.
|
private void checkHome()
{
if (atHome()) {
dropFood();
}
}
| Are we home?
|
private boolean atHome()
{
if (getHomeHill() != null) {
return (Math.abs(getX() - getHomeHill().getX()) < 4) && (Math.abs(getY() - getHomeHill().getY()) < 4);
}
else {
return false;
}
}
| Is there any food here where we are? If so, take some!.
|
public void checkFood()
{
Food food = (Food) getOneIntersectingObject(Food.class);
if (food != null) {
takeFood(food);
}
}
| Take some food from a fool pile.
|
private void takeFood(Food food)
{
carryingFood = true;
food.takeSome();
setImage("ant-with-food.gif");
}
| Drop our food in the ant hill.
|
private void dropFood()
{
carryingFood = false;
getHomeHill().countFood();
setImage("ant.gif");
}
| Check whether we can drop some pheromone yet. If we can, do it.
|
private void handlePheromoneDrop()
{
if (pheromoneLevel == MAX_PH_LEVEL) {
Pheromone ph = new Pheromone();
getWorld().addObject(ph, getX(), getY());
pheromoneLevel = 0;
}
else {
pheromoneLevel++;
}
}
| Check whether we can smell pheromones. If we can, return true, otherwise return false.
|
public boolean smellPheromone()
{
Actor ph = getOneIntersectingObject(Pheromone.class);
return (ph != null);
}
| If we can smell some pheromone, walk towards it. If not, do nothing.
|
public void walkTowardsPheromone()
{
Actor ph = getOneIntersectingObject(Pheromone.class);
if (ph != null) {
headTowards(ph);
walk();
if (ph.getX() == getX() && ph.getY() == getY()) {
foundLastPheromone = PH_TIME;
}
}
}
}
top,
use,
map,
class Ant
. Ant
. act
. searchForFood
. checkHome
. atHome
. checkFood
. takeFood
. dropFood
. handlePheromoneDrop
. smellPheromone
. walkTowardsPheromone
115 neLoCode
+ 19 LoComm