001 package model.fish;
002
003 import model.fish.display.RoundFishDisplay;
004 import model.RandNumGenerator;
005 import model.ILambda;
006 import sysModel.fish.AFish;
007 import sysModel.env.IBlockedCommand;
008 import sysModel.env.IOpenCommand;
009
010 import java.awt.*;
011
012 import lrs.LRStruct;
013 import lrs.visitor.GetLength;
014 import lrs.visitor.GetNth;
015
016 /**
017 * Class for a generic fish.
018 *
019 * @author Mathias G. Ricken
020 */
021 public class GenericFish extends AFish {
022 /**
023 * Create a new generic fish.
024 *
025 * @param fishColor color of the fish
026 */
027 public GenericFish(Color fishColor) {
028 super(fishColor, RoundFishDisplay.Singleton);
029 }
030
031 /**
032 * Carry out movement behavior for the fish.
033 */
034 protected void move() {
035 final LRStruct moveLambdas = new LRStruct();
036
037 // turn PI/2 radians to the left and attempt to move forward
038 turnLeft();
039
040 final IBlockedCommand blocked3 = new IBlockedCommand() {
041 public Object apply(Object param) {
042 int size = ((Integer)moveLambdas.execute(GetLength.Singleton, null)).intValue();
043
044 if (0 != size) {
045 // pick random move command
046 Integer randnum = new Integer(RandNumGenerator.instance().nextInt(size));
047 ILambda cmd = (ILambda)moveLambdas.execute(GetNth.Singleton, randnum);
048
049 // apply that command
050 cmd.apply(null);
051 }
052 else {
053 // turn back PI/2 radians to the left
054 turnLeft();
055 }
056 return null;
057 }
058 };
059
060 final IBlockedCommand blocked2 = new IBlockedCommand() {
061 public Object apply(Object param) {
062 // turn PI/2 radians to the right and attempt to move forward
063 turnRight();
064 return tryMoveFwd(blocked3,
065 new IOpenCommand() {
066 public Object apply(Object param) {
067 // the field to the right is open
068 moveLambdas.insertFront(param);
069 return blocked3.apply(null);
070 }
071 });
072 }
073 };
074
075 final IBlockedCommand blocked1 = new IBlockedCommand() {
076 public Object apply(Object param) {
077 // turn PI/2 radians to the right and attempt to move forward
078 turnRight();
079 return tryMoveFwd(blocked2,
080 new IOpenCommand() {
081 public Object apply(Object param) {
082 // the field straight ahead is open
083 moveLambdas.insertFront(param);
084 return blocked2.apply(null);
085 }
086 });
087 }
088 };
089
090
091 tryMoveFwd(blocked1,
092 new IOpenCommand() {
093 public Object apply(Object param) {
094 // the field to the left is open
095 moveLambdas.insertFront(param);
096 return blocked1.apply(null);
097 }
098 });
099 }
100 }