001 import swarm.*;
002 import swarm.objectbase.*;
003 import swarm.defobj.*;
004 import swarm.space.*;
005
006 public class Bug extends SwarmObjectImpl {
007 int xPos, yPos;
008 int worldXSize, worldYSize;
009 FoodSpace foodSpace;
010 Grid2d world;
011 int haveEaten;
012
013 public Bug(Zone aZone){
014 super(aZone);
015 }
016
017 public Object setWorld$Food(Grid2d w,FoodSpace f){
018 world=w;
019 foodSpace=f;
020 setWorldSizeX$Y(world.getSizeX(),world.getSizeY());
021 return this;
022 }
023
024 public Object setX$Y(int x, int y){
025 xPos = x;
026 yPos = y;
027 world.putObject$atX$Y(this,xPos,yPos);
028 return this;
029 }
030
031 public Object setWorldSizeX$Y(int xSize, int ySize){
032 worldXSize=xSize;
033 worldYSize=ySize;
034 return this;
035 }
036
037 public void step(){
038 int newX,newY;
039 haveEaten=0;
040
041 newX = xPos + Globals.env.uniformIntRand.getIntegerWithMin$withMax(-1,1);
042 newY = yPos + Globals.env.uniformIntRand.getIntegerWithMin$withMax(-1,1);
043 newX = (newX + worldXSize) % worldXSize;
044 newY = (newY + worldYSize) % worldYSize;
045
046 if (world.getObjectAtX$Y(newX,newY) == null){
047 world.putObject$atX$Y(null,xPos,yPos);
048 setX$Y(newX, newY);
049 }
050
051 if (foodSpace.getValueAtX$Y(xPos,yPos) == 1){
052 foodSpace.putValue$atX$Y(0,xPos,yPos);
053 haveEaten=1; // set flag for reporting
054 }
055 }
056
057 public Object report(){
058 if(haveEaten==1)
059 System.out.println("I found food at X = " + xPos + " Y = " + yPos +"!");
060 return this;
061 }
062 }