improved world class
This commit is contained in:
@@ -369,7 +369,7 @@ public class Facade implements IFacade {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether the given worls is terminated.
|
* Check whether the given world is terminated.
|
||||||
*
|
*
|
||||||
* @param world
|
* @param world
|
||||||
*/
|
*/
|
||||||
|
@@ -1,10 +1,9 @@
|
|||||||
package worms.model;
|
package worms.model;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
public class World {
|
public class World {
|
||||||
|
|
||||||
private boolean terminated = false;
|
|
||||||
|
|
||||||
|
|
||||||
public World(double width, double height, boolean[][] map) {
|
public World(double width, double height, boolean[][] map) {
|
||||||
|
|
||||||
if (!isValidDimension(width) || !isValidDimension(height)) throw new IllegalArgumentException();
|
if (!isValidDimension(width) || !isValidDimension(height)) throw new IllegalArgumentException();
|
||||||
@@ -12,12 +11,67 @@ public class World {
|
|||||||
this.width = width;
|
this.width = width;
|
||||||
this.height = height;
|
this.height = height;
|
||||||
this.map = map;
|
this.map = map;
|
||||||
|
this.wormList = new ArrayList<>();
|
||||||
|
this.foodSet = new HashSet<>();
|
||||||
|
|
||||||
lengthX = width / map[0].length;
|
this.lengthX = width / map[0].length;
|
||||||
lengthY = height / map.length;
|
this.lengthY = height / map.length;
|
||||||
|
this.game = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// region game
|
||||||
|
//===================================================================================
|
||||||
|
|
||||||
|
public boolean hasActiveGame() {
|
||||||
|
return this.game;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startGame() {
|
||||||
|
this.game = true;
|
||||||
|
this.activeWorm = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void finishGame() {
|
||||||
|
this.game = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void activateNextWorm() {
|
||||||
|
|
||||||
|
this.activeWorm++;
|
||||||
|
if (this.activeWorm == getWormList().size()) {
|
||||||
|
this.activeWorm = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Worm getActiveWorm() {
|
||||||
|
return getWormList().get(this.activeWorm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWinner() {
|
||||||
|
if (getWormList().size() == 1) {
|
||||||
|
return getWormList().get(0).getName();
|
||||||
|
} else if (getWormList().size() > 1) {
|
||||||
|
|
||||||
|
Team lastTeam = getWormList().get(0).getTeam();
|
||||||
|
for(Worm worm: getWormList()) {
|
||||||
|
if (!lastTeam.equals(worm.getTeam())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lastTeam.getName();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean game;
|
||||||
|
private int activeWorm;
|
||||||
|
|
||||||
|
//===================================================================================
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
|
||||||
// region Dimensions
|
// region Dimensions
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
@@ -38,15 +92,37 @@ public class World {
|
|||||||
// ===================================================================================
|
// ===================================================================================
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// region map
|
// region map
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
|
|
||||||
private final double lengthX;
|
|
||||||
private final double lengthY;
|
|
||||||
public boolean[][] getMap() {
|
public boolean[][] getMap() {
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isTerminated() {
|
||||||
|
return this.terminated;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terminate() {
|
||||||
|
this.terminated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final boolean[][] map;
|
||||||
|
private boolean terminated = false;
|
||||||
|
|
||||||
|
// ===================================================================================
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
// region passable
|
||||||
|
//===================================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param location ...
|
||||||
|
* @return ...
|
||||||
|
*/
|
||||||
public boolean isPassable(double[] location) {
|
public boolean isPassable(double[] location) {
|
||||||
|
|
||||||
if (location[0] / lengthX >= getMap()[0].length || location[0] < 0.0 ||
|
if (location[0] / lengthX >= getMap()[0].length || location[0] < 0.0 ||
|
||||||
@@ -56,23 +132,12 @@ public class World {
|
|||||||
return this.map[(int) Math.floor(location[1] / lengthY)][(int) Math.floor(location[0] / lengthX)];
|
return this.map[(int) Math.floor(location[1] / lengthY)][(int) Math.floor(location[0] / lengthX)];
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isPassable(double x, double y) {
|
/**
|
||||||
int xCoord = (int) Math.floor(x / lengthX);
|
*
|
||||||
int yCoord = (int) Math.floor(y / lengthY);
|
* @param center ...
|
||||||
return this.map[yCoord][xCoord];
|
* @param radius ...
|
||||||
}
|
* @return ...
|
||||||
|
*/
|
||||||
private boolean canHaveAsPartialCircle(double x, double y, double[] center) {
|
|
||||||
|
|
||||||
if (!isPassable(x + center[0], y + center[1])) return false;
|
|
||||||
x *= -1;
|
|
||||||
if (!isPassable(x + center[0], y + center[1])) return false;
|
|
||||||
y *= -1;
|
|
||||||
if (!isPassable(x + center[0], y + center[1])) return false;
|
|
||||||
x *= -1;
|
|
||||||
return isPassable(x + center[0], y + center[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isPassable(double[] center, double radius) {
|
public boolean isPassable(double[] center, double radius) {
|
||||||
|
|
||||||
int radX = (int) Math.floor(radius / lengthX);
|
int radX = (int) Math.floor(radius / lengthX);
|
||||||
@@ -90,6 +155,12 @@ public class World {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param center ...
|
||||||
|
* @param radius ...
|
||||||
|
* @return ...
|
||||||
|
*/
|
||||||
public boolean isAdjacent(double[] center, double radius) {
|
public boolean isAdjacent(double[] center, double radius) {
|
||||||
|
|
||||||
double maxDistance = radius * 0.1;
|
double maxDistance = radius * 0.1;
|
||||||
@@ -99,20 +170,105 @@ public class World {
|
|||||||
return isPassable(center, radius) && !isPassable(center, radius + maxDistance + length);
|
return isPassable(center, radius) && !isPassable(center, radius + maxDistance + length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTerminated() {
|
private final double lengthX;
|
||||||
return terminated;
|
private final double lengthY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param x ...
|
||||||
|
* @param y ...
|
||||||
|
* @return ...
|
||||||
|
*/
|
||||||
|
private boolean isPassable(double x, double y) {
|
||||||
|
int xCoord = (int) Math.floor(x / lengthX);
|
||||||
|
int yCoord = (int) Math.floor(y / lengthY);
|
||||||
|
return getMap()[yCoord][xCoord];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void terminate() {
|
/**
|
||||||
setTerminated(true);
|
*
|
||||||
}
|
* @param x ...
|
||||||
|
* @param y ...
|
||||||
|
* @param center ...
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean canHaveAsPartialCircle(double x, double y, double[] center) {
|
||||||
|
|
||||||
private final boolean[][] map;
|
if (!isPassable(x + center[0], y + center[1])) return false;
|
||||||
|
x *= -1;
|
||||||
private void setTerminated(boolean terminated) {
|
if (!isPassable(x + center[0], y + center[1])) return false;
|
||||||
this.terminated = terminated;
|
y *= -1;
|
||||||
|
if (!isPassable(x + center[0], y + center[1])) return false;
|
||||||
|
x *= -1;
|
||||||
|
return isPassable(x + center[0], y + center[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===================================================================================
|
// ===================================================================================
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
|
||||||
|
// region objects
|
||||||
|
//===================================================================================
|
||||||
|
|
||||||
|
public Collection<Object> getAllItems() {
|
||||||
|
Set<Object> all = new HashSet<Object>();
|
||||||
|
all.add(getWormList());
|
||||||
|
all.add(getFoodSet());
|
||||||
|
return all;
|
||||||
|
}
|
||||||
|
|
||||||
|
// public Set<Team> getAllTeams() {
|
||||||
|
//
|
||||||
|
// Set<Team> teams = new HashSet<Team>();
|
||||||
|
// for(Worm worm: getWormList()) {
|
||||||
|
// teams.add(worm.getTeam());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public boolean hasAsWorm(Worm worm) throws NullPointerException {
|
||||||
|
return getWormList().contains(worm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addWorm(Worm worm) throws IllegalArgumentException, NullPointerException, IllegalStateException {
|
||||||
|
|
||||||
|
if (hasActiveGame()) throw new IllegalStateException();
|
||||||
|
if (hasAsWorm(worm)) throw new IllegalArgumentException();
|
||||||
|
getWormList().add(worm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeWorm(Worm worm) throws IllegalArgumentException, NullPointerException {
|
||||||
|
if (!getWormList().remove(worm)) throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Worm> getWormList() {
|
||||||
|
return this.wormList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean hasAsFood(Food food) throws NullPointerException {
|
||||||
|
return getFoodSet().contains(food);
|
||||||
|
}
|
||||||
|
public void addFood(Food food) throws IllegalArgumentException, NullPointerException, IllegalStateException {
|
||||||
|
|
||||||
|
if (hasActiveGame()) throw new IllegalStateException();
|
||||||
|
if (!getFoodSet().add(food)) throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeFood(Food food) throws IllegalArgumentException, NullPointerException {
|
||||||
|
if (!getFoodSet().remove(food)) throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<Food> getFoodSet() {
|
||||||
|
return this.foodSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Worm> wormList;
|
||||||
|
private Set<Food> foodSet;
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================================================
|
||||||
|
// endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package worms.model;
|
package worms.model;
|
||||||
|
|
||||||
import be.kuleuven.cs.som.annotate.*;
|
import be.kuleuven.cs.som.annotate.*;
|
||||||
|
import jdk.jshell.spi.ExecutionControl;
|
||||||
import worms.util.Coordinate;
|
import worms.util.Coordinate;
|
||||||
import worms.util.IllegalNameException;
|
import worms.util.IllegalNameException;
|
||||||
|
|
||||||
@@ -593,7 +594,7 @@ public class Worm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Coordinate getFurthestLocationInDirection() {
|
public Coordinate getFurthestLocationInDirection() {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void collision(Worm basicWorm, Worm... worm) {
|
public void collision(Worm basicWorm, Worm... worm) {
|
||||||
|
Reference in New Issue
Block a user