diff --git a/OGP1718-Worms/src/worms/model/GameObject.java b/OGP1718-Worms/src/worms/model/GameObject.java index 0c8707f..f641e3d 100644 --- a/OGP1718-Worms/src/worms/model/GameObject.java +++ b/OGP1718-Worms/src/worms/model/GameObject.java @@ -251,4 +251,14 @@ public abstract class GameObject { return Math.sqrt(Math.pow((otherLocation.getX() - location.getX()), 2) + Math.pow((otherLocation.getY() - location.getY()), 2)); } + + public double getAngle(GameObject o) { + + double x1 = getLocation().getX(); + double y1 = getLocation().getY(); + double x2 = o.getLocation().getX(); + double y2 = o.getLocation().getY(); + + return Math.atan(Math.abs(x1 - x2) / Math.abs(y1 - y2)); + } } \ No newline at end of file diff --git a/OGP1718-Worms/src/worms/programs/ArgumentBinaryExpression.java b/OGP1718-Worms/src/worms/programs/ArgumentBinaryExpression.java new file mode 100644 index 0000000..198dad5 --- /dev/null +++ b/OGP1718-Worms/src/worms/programs/ArgumentBinaryExpression.java @@ -0,0 +1,26 @@ +package worms.programs; + +import java.util.function.BiFunction; + +public class ArgumentBinaryExpression extends ArgumentExpression { + + private final Expression expression; + private final BiFunction function; + + ArgumentBinaryExpression(Expression expression, BiFunction function, Type type) { + super(type); + this.expression = expression; + this.function = function; + } + + @Override + @SuppressWarnings("unchecked") + public R execute(O o) { + + try { + return function.apply(((Expression) expression).execute(), o); + } catch (ClassCastException e) { + throw new IllegalArgumentException(); + } + } +} diff --git a/OGP1718-Worms/src/worms/programs/ArgumentExpression.java b/OGP1718-Worms/src/worms/programs/ArgumentExpression.java new file mode 100644 index 0000000..d5f25e1 --- /dev/null +++ b/OGP1718-Worms/src/worms/programs/ArgumentExpression.java @@ -0,0 +1,27 @@ +package worms.programs; + +public abstract class ArgumentExpression implements Expression { + + public final Type type; + + protected ArgumentExpression(Type type) { + this.type = type; + } + + @Override + public R execute() { + throw new UnsupportedOperationException(); + } + + public abstract R execute(O o); + + + public Type getType() { + return this.type; + } + public enum Type { + WORM, + VAR, + GOBJECTS + } +} diff --git a/OGP1718-Worms/src/worms/programs/BinaryExpression.java b/OGP1718-Worms/src/worms/programs/BinaryExpression.java index a18d44b..7099b65 100644 --- a/OGP1718-Worms/src/worms/programs/BinaryExpression.java +++ b/OGP1718-Worms/src/worms/programs/BinaryExpression.java @@ -2,7 +2,7 @@ package worms.programs; import java.util.function.BiFunction; -public class BinaryExpression extends Expression { +public class BinaryExpression implements Expression { private final Expression left; private final Expression right; @@ -22,6 +22,5 @@ public class BinaryExpression extends Expression { } catch (ClassCastException e) { throw new IllegalArgumentException(); } - } } diff --git a/OGP1718-Worms/src/worms/programs/Expression.java b/OGP1718-Worms/src/worms/programs/Expression.java index 733e272..3620556 100644 --- a/OGP1718-Worms/src/worms/programs/Expression.java +++ b/OGP1718-Worms/src/worms/programs/Expression.java @@ -2,7 +2,7 @@ package worms.programs; import worms.model.Program; -public abstract class Expression extends Program { +public interface Expression { - public abstract T execute(); + T execute(); } diff --git a/OGP1718-Worms/src/worms/programs/Procedure.java b/OGP1718-Worms/src/worms/programs/Procedure.java index d7b28dd..88a9300 100644 --- a/OGP1718-Worms/src/worms/programs/Procedure.java +++ b/OGP1718-Worms/src/worms/programs/Procedure.java @@ -2,7 +2,7 @@ package worms.programs; import worms.model.Program; -public class Procedure extends Program { +public class Procedure { private final String name; diff --git a/OGP1718-Worms/src/worms/programs/ProgramFactory.java b/OGP1718-Worms/src/worms/programs/ProgramFactory.java index 4f44090..31348da 100644 --- a/OGP1718-Worms/src/worms/programs/ProgramFactory.java +++ b/OGP1718-Worms/src/worms/programs/ProgramFactory.java @@ -5,9 +5,10 @@ import worms.model.Program; import worms.model.Worm; import worms.util.ModelException; import worms.util.MustNotImplementException; -import worms.programs.Expression; +import java.util.Comparator; import java.util.List; +import java.util.Set; public class ProgramFactory implements IProgramFactory { /** @@ -195,10 +196,10 @@ public class ProgramFactory implements IProgramFactory>(ArgumentExpression.Type.VAR) { @Override - public Object execute() { - return findVar(variableName); + public Object execute(List o) { + return null; } }; } @@ -211,12 +212,7 @@ public class ProgramFactory implements IProgramFactory() { - @Override - public Double execute() { - return value; - } - }; + return () -> value; } /** @@ -227,12 +223,7 @@ public class ProgramFactory implements IProgramFactory() { - @Override - public Boolean execute() { - return value; - } - }; + return () -> value; } /** @@ -242,12 +233,7 @@ public class ProgramFactory implements IProgramFactory() { - @Override - public Object execute() { - return null; - } - }; + return () -> null; } /** @@ -259,10 +245,10 @@ public class ProgramFactory implements IProgramFactory() { + return new ArgumentExpression(ArgumentExpression.Type.WORM) { @Override - public Worm execute() { - return getWorm(); + public Worm execute(Worm o) { + return o; } }; } @@ -320,7 +306,7 @@ public class ProgramFactory implements IProgramFactory(left, right, (l,r) -> l.equals(r)); + return new BinaryExpression(left, right, (l, r) -> l.equals(r)); } /** @@ -340,7 +326,18 @@ public class ProgramFactory implements IProgramFactory(ArgumentExpression.Type.GOBJECTS) { + @Override + public GameObject execute(Worm o) { + throw new UnsupportedOperationException(); + } + + public GameObject execute(Worm o, Set gobjects) { + return gobjects.stream().filter(g -> g.getAngle(o) == o.getOrientation()).min( + Comparator.comparingDouble(gameObject -> gameObject.getDistance(o))).orElse(null); + } + }; } /** @@ -354,7 +351,7 @@ public class ProgramFactory implements IProgramFactory(entity, w -> (w).getTeam().equals((w).getWorld().getActiveWorm().getTeam())); + return new ArgumentBinaryExpression(entity, (w, y) -> w.getTeam().equals(y.getTeam()), ArgumentExpression.Type.WORM); } /** @@ -367,7 +364,7 @@ public class ProgramFactory implements IProgramFactory(entity, (l) -> (l).getWorld().getActiveWorm().getDistance(l)); + return new ArgumentBinaryExpression(entity, (e, o) -> e.getDistance(o), ArgumentExpression.Type.WORM); } /** @@ -379,6 +376,7 @@ public class ProgramFactory implements IProgramFactory(entity, w -> w instanceof Worm); + + return new UnaryExpression(entity, w -> w instanceof Worm); } } diff --git a/OGP1718-Worms/src/worms/programs/Statement.java b/OGP1718-Worms/src/worms/programs/Statement.java index 2e0a3f9..e1a6c1c 100644 --- a/OGP1718-Worms/src/worms/programs/Statement.java +++ b/OGP1718-Worms/src/worms/programs/Statement.java @@ -1,8 +1,6 @@ package worms.programs; -import worms.model.Program; - -public class Statement extends Program { +public class Statement { private final Type type; private final Object data; diff --git a/OGP1718-Worms/src/worms/programs/UnaryExpression.java b/OGP1718-Worms/src/worms/programs/UnaryExpression.java index 47153ee..fd2e7a6 100644 --- a/OGP1718-Worms/src/worms/programs/UnaryExpression.java +++ b/OGP1718-Worms/src/worms/programs/UnaryExpression.java @@ -2,7 +2,7 @@ package worms.programs; import java.util.function.Function; -public class UnaryExpression extends Expression { +public class UnaryExpression implements Expression { protected final Expression expression; private final Function function;