001 package model.fish;
002
003 import model.fish.display.NarrowFishDisplay;
004 import model.ILambda;
005 import sysModel.fish.AFish;
006 import sysModel.env.IBlockedCommand;
007 import sysModel.env.IOpenCommand;
008
009 import java.awt.*;
010
011 /**
012 * Class for a darter fish.
013 *
014 * @author Mathias G. Ricken
015 */
016 public class DarterFish extends AFish {
017 /**
018 * Create a new darter fish.
019 */
020 public DarterFish(Color fishColor) {
021 super(fishColor, NarrowFishDisplay.Singleton);
022 }
023
024 /**
025 * Carry out movement behavior for the fish.
026 */
027 protected void move() {
028 // attempt to move forward
029 tryMoveFwd(new IBlockedCommand() {
030 public Object apply(Object param) {
031 // could not move forward at all
032 // turn PI radians
033 turnRight(Math.PI);
034 return null;
035 }
036 },
037 new IOpenCommand() {
038 public Object apply(Object param) {
039 // the field ahead is open, move
040 ((ILambda)param).apply(null);
041 // attempt to move forward again
042 tryMoveFwd(new IBlockedCommand() {
043 public Object apply(Object param) {
044 // could not move forward any more
045 // do nothing
046 return null;
047 }
048 },
049 new IOpenCommand() {
050 public Object apply(Object param) {
051 // second field ahead is open, move
052 ((ILambda)param).apply(null);
053 return null;
054 }
055 });
056 return null;
057 }
058 });
059 }
060 }