improved passable
This commit is contained in:
@@ -1,24 +1,27 @@
|
|||||||
|
import worms.facade.Facade;
|
||||||
|
import worms.facade.IFacade;
|
||||||
import worms.model.Team;
|
import worms.model.Team;
|
||||||
|
import worms.model.World;
|
||||||
import worms.model.Worm;
|
import worms.model.Worm;
|
||||||
import worms.util.Coordinate;
|
import worms.util.Coordinate;
|
||||||
|
|
||||||
import java.io.Console;
|
import java.io.Console;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
|
private static final double EPS = 1e-4;
|
||||||
|
private static boolean[][] passableMap = new boolean[][] { //
|
||||||
|
{ false, false, false, false }, //
|
||||||
|
{ true, true, true, true }, //
|
||||||
|
{ true, true, true, true }, //
|
||||||
|
{ false, false, false, false } };
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
Worm worm1 = new Worm(Coordinate.create(0.0, 0.0), 0.0, "Alpha", 1.0);
|
IFacade facade = new Facade();
|
||||||
Worm worm2 = new Worm(Coordinate.create(0.0, 0.0), 0.0, "Beta", 1.0);
|
World world = facade.createWorld(4.0, 4.0, passableMap);
|
||||||
Worm worm3 = new Worm(Coordinate.create(0.0, 0.0), 0.0, "Gamma", 1.0);
|
|
||||||
Worm worm4 = new Worm(Coordinate.create(0.0, 0.0), 0.0, "Delta", 1.0);
|
|
||||||
|
|
||||||
Team team1 = new Team("TestTeam");
|
Worm worm = facade.createWorm(world, new double[] { 1, 1.5 }, Math.PI / 2, 0.5, "Test", null);
|
||||||
|
System.out.println(world.isPassable(worm.getLocationArray(), worm.getRadius()));
|
||||||
|
|
||||||
team1.addWorm(worm1);
|
|
||||||
team1.addWorm(worm2);
|
|
||||||
team1.addWorm(worm3);
|
|
||||||
team1.addWorm(worm4);
|
|
||||||
team1.getAllWormsOfTeam();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -618,7 +618,7 @@ public class Facade implements IFacade {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Worm createWorm(World world, double[] location, double direction, double radius, String name, Team team) throws ModelException {
|
public Worm createWorm(World world, double[] location, double direction, double radius, String name, Team team) throws ModelException {
|
||||||
return null;
|
return new Worm(world, location, direction, radius, name, team);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -119,15 +119,15 @@ public abstract class GameObject {
|
|||||||
double radius = getRadius();
|
double radius = getRadius();
|
||||||
|
|
||||||
if (world == null) {
|
if (world == null) {
|
||||||
return !Double.isNaN(location.getCoordinateX()) &&
|
return !Double.isNaN(location.getX()) &&
|
||||||
!Double.isNaN(location.getCoordinateY());
|
!Double.isNaN(location.getY());
|
||||||
}
|
}
|
||||||
return !Double.isNaN(location.getCoordinateX()) &&
|
return !Double.isNaN(location.getX()) &&
|
||||||
!Double.isNaN(location.getCoordinateY()) &&
|
!Double.isNaN(location.getY()) &&
|
||||||
!(location.getCoordinateX() - radius < 0) &&
|
!(location.getX() - radius < 0) &&
|
||||||
!(location.getCoordinateX() + radius > getWorld().getWidth()) &&
|
!(location.getX() + radius > getWorld().getWidth()) &&
|
||||||
!(location.getCoordinateY() + radius > getWorld().getHeight()) &&
|
!(location.getY() + radius > getWorld().getHeight()) &&
|
||||||
!(location.getCoordinateY() - radius < 0 &&
|
!(location.getY() - radius < 0 &&
|
||||||
!getWorld().isPassable(location));
|
!getWorld().isPassable(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -146,21 +146,42 @@ public class World {
|
|||||||
*/
|
*/
|
||||||
public boolean isPassable(double[] center, double radius) {
|
public boolean isPassable(double[] center, double radius) {
|
||||||
|
|
||||||
int radX = (int) Math.floor(radius / lengthX);
|
ArrayList<Coordinate> circle = getCircleList(Coordinate.create(center),radius);
|
||||||
|
|
||||||
for (int x = 0, y = 0; x <= radX; x++, y++) {
|
for (Coordinate cord: circle) {
|
||||||
double realX = x * radius;
|
if (!isPassable(cord.getX(), cord.getY())) return false;
|
||||||
double realY = Math.sqrt(Math.pow(radius, 2) - Math.pow(realX, 2));
|
|
||||||
if (canHaveAsPartialCircle(realX, realY, center)) return false;
|
|
||||||
|
|
||||||
realY = y * radius;
|
|
||||||
realX = Math.sqrt(Math.pow(radius, 2) + center[0] - Math.pow(realY, 2) + center[1]);
|
|
||||||
if (canHaveAsPartialCircle(realX, realY, center)) return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isUnderCircle(Coordinate square, Coordinate center, double radius) {
|
||||||
|
|
||||||
|
double angle = Math.atan2(square.getY() - center.getY(), square.getX() - center.getX());
|
||||||
|
|
||||||
|
double x = Math.abs(radius * Math.cos(angle) + center.getX());
|
||||||
|
double y = Math.abs(radius * Math.sin(angle) + center.getY());
|
||||||
|
|
||||||
|
return Math.floor(square.getX() / getLengthX()) - Math.floor(x / getLengthX()) == 0 &&
|
||||||
|
Math.floor(square.getY() / getLengthY()) - Math.floor(y / getLengthY()) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Coordinate> getCircleList(Coordinate center, double radius) {
|
||||||
|
double[] pos = {Math.floor(center.getX()), Math.floor(center.getY())};
|
||||||
|
ArrayList<Coordinate> circle = new ArrayList<Coordinate>();
|
||||||
|
int parts = (int) Math.ceil(2 * radius / getLengthX());
|
||||||
|
|
||||||
|
for (int x = 0; x <= parts; x++) {
|
||||||
|
for (int y = 0; y <= parts; y++) {
|
||||||
|
Coordinate temp = Coordinate.create(x * getLengthX(), y * getLengthY());
|
||||||
|
if (isUnderCircle(temp, center, radius)) {
|
||||||
|
circle.add(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return circle;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param center ...
|
* @param center ...
|
||||||
@@ -176,6 +197,12 @@ public class World {
|
|||||||
return isPassable(center, radius) && !isPassable(center, radius + maxDistance + length);
|
return isPassable(center, radius) && !isPassable(center, radius + maxDistance + length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getLengthX() {
|
||||||
|
return this.lengthX;
|
||||||
|
}
|
||||||
|
public double getLengthY() {
|
||||||
|
return this.lengthY;
|
||||||
|
}
|
||||||
private final double lengthX;
|
private final double lengthX;
|
||||||
private final double lengthY;
|
private final double lengthY;
|
||||||
|
|
||||||
|
@@ -3,7 +3,6 @@ package worms.model;
|
|||||||
import be.kuleuven.cs.som.annotate.*;
|
import be.kuleuven.cs.som.annotate.*;
|
||||||
import worms.util.Coordinate;
|
import worms.util.Coordinate;
|
||||||
import worms.util.IllegalNameException;
|
import worms.util.IllegalNameException;
|
||||||
import worms.util.MustNotImplementException;
|
|
||||||
|
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
|
|
||||||
@@ -130,6 +129,13 @@ public class Worm extends GameObject {
|
|||||||
setHitPoints(startHitPoints);
|
setHitPoints(startHitPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Worm(World world, double[] location, double direction, double radius, String name, Team team) {
|
||||||
|
|
||||||
|
this(Coordinate.create(location), direction, name, radius, 0.25);
|
||||||
|
setWorld(world);
|
||||||
|
setTeam(team);
|
||||||
|
}
|
||||||
|
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
@@ -220,6 +226,7 @@ public class Worm extends GameObject {
|
|||||||
this.radius = radius;
|
this.radius = radius;
|
||||||
final double rho = 1062;
|
final double rho = 1062;
|
||||||
setMass(radius, rho);
|
setMass(radius, rho);
|
||||||
|
setMaxActionPoints(getMass());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -469,13 +476,13 @@ public class Worm extends GameObject {
|
|||||||
* that the x-coordinate should move (distance is equal to the radius multiplied
|
* that the x-coordinate should move (distance is equal to the radius multiplied
|
||||||
* with the cosinus of the orientation)
|
* with the cosinus of the orientation)
|
||||||
* |distanceX = this.radius * cos(getOrientation())
|
* |distanceX = this.radius * cos(getOrientation())
|
||||||
* |new.xCoordinate = getLocation().getCoordinateX() + numberSteps * distanceX
|
* |new.xCoordinate = getLocation().getX() + numberSteps * distanceX
|
||||||
* @post the y-coordinate of the new location of the worm should be the location of
|
* @post the y-coordinate of the new location of the worm should be the location of
|
||||||
* the old y-coordinate plus the number of steps multiplied with the distance
|
* the old y-coordinate plus the number of steps multiplied with the distance
|
||||||
* that the y-coordinate should move (distance is equal to the radius multiplied
|
* that the y-coordinate should move (distance is equal to the radius multiplied
|
||||||
* with the sinus of the orientation)
|
* with the sinus of the orientation)
|
||||||
* |distanceY = this.radius * sin(getOrientation())
|
* |distanceY = this.radius * sin(getOrientation())
|
||||||
* |new.yCoordinate = getLocation().getCoordinateY() + numberSteps * distanceY
|
* |new.yCoordinate = getLocation().getY() + numberSteps * distanceY
|
||||||
* @post the current value of action actionPoints has changed. The current value of action actionPoints
|
* @post the current value of action actionPoints has changed. The current value of action actionPoints
|
||||||
* minus the cost of moving (abs(cos(theta)) + abs(4 sin(theta)))
|
* minus the cost of moving (abs(cos(theta)) + abs(4 sin(theta)))
|
||||||
* |cost = (long) ceil(abs(cos(getOrientation())) + abs(4 * sin(getOrientation()))) * numberSteps
|
* |cost = (long) ceil(abs(cos(getOrientation())) + abs(4 * sin(getOrientation()))) * numberSteps
|
||||||
@@ -511,19 +518,19 @@ public class Worm extends GameObject {
|
|||||||
Coordinate currentLocation = getLocation();
|
Coordinate currentLocation = getLocation();
|
||||||
double radius = getRadius();
|
double radius = getRadius();
|
||||||
World world = getWorld();
|
World world = getWorld();
|
||||||
double step = Math.sqrt(Math.pow(world.getWidth(), 2) + Math.pow(world.getHeight(), 2));
|
double step = Math.sqrt(Math.pow(world.getLengthX(), 2) + Math.pow(world.getLengthY(), 2));
|
||||||
Coordinate nextLoc, prevLoc;
|
Coordinate nextLoc, prevLoc;
|
||||||
nextLoc = prevLoc = currentLocation;
|
nextLoc = prevLoc = currentLocation;
|
||||||
|
|
||||||
while(getDistance(currentLocation, nextLoc) < maxDistance) {
|
while(getDistance(currentLocation, nextLoc) < maxDistance) {
|
||||||
|
|
||||||
prevLoc = nextLoc;
|
prevLoc = nextLoc;
|
||||||
nextLoc = Coordinate.create(nextLoc.getCoordinateX() + step * Math.cos(direction),
|
nextLoc = Coordinate.create(round((nextLoc.getX() + step * cos(direction)) * 100.0) / 100.0,
|
||||||
nextLoc.getCoordinateY() + step * Math.sin(direction));
|
round((nextLoc.getY() + step * sin(direction)) * 100.0) / 100.0);
|
||||||
if (!world.isPassable(nextLoc.toArray(), radius)) {
|
if (!world.isPassable(nextLoc.toArray(), radius)) {
|
||||||
while (!world.isPassable(nextLoc.toArray(), radius)) {
|
while (!world.isPassable(nextLoc.toArray(), radius)) {
|
||||||
nextLoc = Coordinate.create(nextLoc.getCoordinateX() - 0.1 * Math.cos(direction),
|
nextLoc = Coordinate.create(nextLoc.getX() - 0.1 * cos(direction),
|
||||||
nextLoc.getCoordinateY() - 0.1 * Math.sin(direction));
|
nextLoc.getY() - 0.1 * sin(direction));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -550,8 +557,8 @@ public class Worm extends GameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getDistance(Coordinate start, Coordinate end) {
|
public double getDistance(Coordinate start, Coordinate end) {
|
||||||
return Math.sqrt(Math.pow(Math.abs(start.getCoordinateX() - end.getCoordinateX()), 2) +
|
return Math.sqrt(Math.pow(Math.abs(start.getX() - end.getX()), 2) +
|
||||||
Math.pow(Math.abs(start.getCoordinateY() - end.getCoordinateY()), 2));
|
Math.pow(Math.abs(start.getY() - end.getY()), 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void collision(Worm basicWorm, Worm... worm) {
|
public void collision(Worm basicWorm, Worm... worm) {
|
||||||
@@ -642,7 +649,7 @@ public class Worm extends GameObject {
|
|||||||
*
|
*
|
||||||
* @post the worm jumps to his new place. The new place is the x-coordinate plus the jump distance
|
* @post the worm jumps to his new place. The new place is the x-coordinate plus the jump distance
|
||||||
* with the jump velocity
|
* with the jump velocity
|
||||||
* |setLocation(Coordinate.create(getLocation().getCoordinateX() + jumpDistance(this.jumpVelocity()), getLocation().getCoordinateY()))
|
* |setLocation(Coordinate.create(getLocation().getX() + jumpDistance(this.jumpVelocity()), getLocation().getY()))
|
||||||
* @post the current action actionPoints should be 0 after a jump
|
* @post the current action actionPoints should be 0 after a jump
|
||||||
* |setActionPoints(0)
|
* |setActionPoints(0)
|
||||||
* @throws IllegalStateException
|
* @throws IllegalStateException
|
||||||
@@ -655,7 +662,7 @@ public class Worm extends GameObject {
|
|||||||
if (!canJump())
|
if (!canJump())
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
|
|
||||||
setLocation(Coordinate.create( getLocation().getCoordinateX() + jumpDistance(this.jumpVelocity()), getLocation().getCoordinateY()));
|
setLocation(Coordinate.create( getLocation().getX() + jumpDistance(this.jumpVelocity()), getLocation().getY()));
|
||||||
setActionPoints(0);
|
setActionPoints(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,8 +692,8 @@ public class Worm extends GameObject {
|
|||||||
* multiplied with the cosinus of the orientation multiplied with delta time. The new y-coordinate is the old y-coordinate plus
|
* multiplied with the cosinus of the orientation multiplied with delta time. The new y-coordinate is the old y-coordinate plus
|
||||||
* the jump velocity multiplied with the sinus of the orientation multiplied with delta time minus 0,5 times the gravity multiplied
|
* the jump velocity multiplied with the sinus of the orientation multiplied with delta time minus 0,5 times the gravity multiplied
|
||||||
* with the second power of delta time
|
* with the second power of delta time
|
||||||
* |Coordinate.create(getLocation().getCoordinateX() + this.jumpVelocity() * cos(getOrientation()) * deltaTime,
|
* |Coordinate.create(getLocation().getX() + this.jumpVelocity() * cos(getOrientation()) * deltaTime,
|
||||||
|getLocation().getCoordinateY() + this.jumpVelocity() * sin(getOrientation()) * deltaTime - 0.5 * G * pow(deltaTime, 2))
|
|getLocation().getY() + this.jumpVelocity() * sin(getOrientation()) * deltaTime - 0.5 * G * pow(deltaTime, 2))
|
||||||
* @throws IllegalArgumentException()
|
* @throws IllegalArgumentException()
|
||||||
* if the deltaTime is not a number or bigger then jumpTime or smaller then 0
|
* if the deltaTime is not a number or bigger then jumpTime or smaller then 0
|
||||||
* |if (Double.isNaN(deltaTime) || deltaTime > this.jumpTime() || deltaTime < 0)
|
* |if (Double.isNaN(deltaTime) || deltaTime > this.jumpTime() || deltaTime < 0)
|
||||||
@@ -695,8 +702,8 @@ public class Worm extends GameObject {
|
|||||||
if (Double.isNaN(deltaTime) || deltaTime > this.jumpTime() || deltaTime < 0)
|
if (Double.isNaN(deltaTime) || deltaTime > this.jumpTime() || deltaTime < 0)
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
|
|
||||||
return Coordinate.create(getLocation().getCoordinateX() + this.jumpVelocity() * cos(getOrientation()) * deltaTime,
|
return Coordinate.create(getLocation().getX() + this.jumpVelocity() * cos(getOrientation()) * deltaTime,
|
||||||
getLocation().getCoordinateY() + this.jumpVelocity() * sin(getOrientation()) * deltaTime - 0.5 * G * pow(deltaTime, 2));
|
getLocation().getY() + this.jumpVelocity() * sin(getOrientation()) * deltaTime - 0.5 * G * pow(deltaTime, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -818,17 +825,17 @@ public class Worm extends GameObject {
|
|||||||
// region falling
|
// region falling
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
|
|
||||||
private void fall() {
|
public void fall() {
|
||||||
double[] center = {getLocation().getCoordinateX(), getLocation().getCoordinateY()};
|
double[] center = {getLocation().getX(), getLocation().getY()};
|
||||||
Coordinate oldLocation = getLocation();
|
Coordinate oldLocation = getLocation();
|
||||||
double endY = getLocation().getCoordinateY();
|
double endY = getLocation().getY();
|
||||||
if (! getWorld().isAdjacent(center, minRadius)) {
|
if (! getWorld().isAdjacent(center, minRadius)) {
|
||||||
for (double y = oldLocation.getCoordinateY(); y < 0; y--) {
|
for (double y = oldLocation.getY(); y < 0; y--) {
|
||||||
if (y < 0) {
|
if (y < 0) {
|
||||||
terminate();
|
terminate();
|
||||||
}
|
}
|
||||||
if (getWorld().isAdjacent(center, minRadius)) {
|
if (getWorld().isAdjacent(center, minRadius)) {
|
||||||
double[] newLoc = {oldLocation.getCoordinateX(), y};
|
double[] newLoc = {oldLocation.getX(), y};
|
||||||
setLocation(newLoc);
|
setLocation(newLoc);
|
||||||
endY = y;
|
endY = y;
|
||||||
break;
|
break;
|
||||||
@@ -840,7 +847,7 @@ public class Worm extends GameObject {
|
|||||||
//TODO hitpoints en eventuele botsing
|
//TODO hitpoints en eventuele botsing
|
||||||
double distanceY = getWorld().getHeight();
|
double distanceY = getWorld().getHeight();
|
||||||
|
|
||||||
long cost = 3 * (long) (oldLocation.getCoordinateY() - endY);
|
long cost = 3 * (long) (oldLocation.getY() - endY);
|
||||||
incrementHitPoints(cost);
|
incrementHitPoints(cost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -52,15 +52,15 @@ public class Coordinate extends Tuple<Double, Double> {
|
|||||||
|
|
||||||
public double[] toArray() {
|
public double[] toArray() {
|
||||||
|
|
||||||
return new double[]{getCoordinateX(), getCoordinateY()};
|
return new double[]{getX(), getY()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Basic @Immutable
|
@Basic @Immutable
|
||||||
public double getCoordinateX() {
|
public double getX() {
|
||||||
return this.item1;
|
return this.item1;
|
||||||
}
|
}
|
||||||
@Basic @Immutable
|
@Basic @Immutable
|
||||||
public double getCoordinateY() {
|
public double getY() {
|
||||||
return this.item2;
|
return this.item2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -82,7 +82,7 @@
|
|||||||
// double v = force / worm.getMass() * Worm.FORCE_TIME;
|
// double v = force / worm.getMass() * Worm.FORCE_TIME;
|
||||||
// double newLocX = worm.getLocation().item1 + Math.pow(v, 2) * Math.sin(2 * orient) / Worm.G;
|
// double newLocX = worm.getLocation().item1 + Math.pow(v, 2) * Math.sin(2 * orient) / Worm.G;
|
||||||
// worm.jump();
|
// worm.jump();
|
||||||
// assertEquals(Coordinate.create(newLocX, worm.getLocation().getCoordinateY()), worm.getLocation());
|
// assertEquals(Coordinate.create(newLocX, worm.getLocation().getY()), worm.getLocation());
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// @Test
|
// @Test
|
||||||
|
Reference in New Issue
Block a user