From 4da9bdc4fa2f44eedba3dff29af7b0ce9180e442 Mon Sep 17 00:00:00 2001 From: Pacien TRAN-GIRARD Date: Tue, 24 Nov 2015 23:43:00 +0100 Subject: Refactor Ghosts --- src/ch/epfl/maze/physical/GhostPredator.java | 224 --------------------------- 1 file changed, 224 deletions(-) delete mode 100644 src/ch/epfl/maze/physical/GhostPredator.java (limited to 'src/ch/epfl/maze/physical/GhostPredator.java') diff --git a/src/ch/epfl/maze/physical/GhostPredator.java b/src/ch/epfl/maze/physical/GhostPredator.java deleted file mode 100644 index c1cfca8..0000000 --- a/src/ch/epfl/maze/physical/GhostPredator.java +++ /dev/null @@ -1,224 +0,0 @@ -package ch.epfl.maze.physical; - -import ch.epfl.maze.util.Direction; -import ch.epfl.maze.util.Vector2D; - -import java.util.EnumSet; -import java.util.Set; - -/** - * Predator ghost that have two different modes and a home position in the labyrinth. - * - * @author Pacien TRAN-GIRARD - */ -abstract public class GhostPredator extends Predator { - - public enum Mode { - CHASE(40), - SCATTER(14); - - public static final Mode DEFAULT = CHASE; - public final int duration; - - /** - * Constructs a new Mode with the given duration. - * - * @param duration The duration in cycles - */ - Mode(int duration) { - this.duration = duration; - } - - /** - * Returns the next Mode. - * - * @return The next Mode - */ - public Mode getNext() { - switch (this) { - case CHASE: - return SCATTER; - case SCATTER: - return CHASE; - default: - return DEFAULT; - } - } - } - - private static Prey commonPrey; - - private final Vector2D homePosition; - - private Mode mode; - private int modeCycle; - - /** - * Constructs a predator with a specified position. - * - * @param position Position of the predator in the labyrinth - */ - public GhostPredator(Vector2D position) { - super(position); - - this.homePosition = position; - - this.mode = Mode.DEFAULT; - this.modeCycle = 0; - } - - /** - * Selects a new random Prey to chase in the Daedalus. - * - * @param daedalus The Daedalus - * @return The Chosen One - */ - private static Prey selectRandomPrey(Daedalus daedalus) { - if (daedalus.getPreys().isEmpty()) return null; - - int randomPreyIndex = GhostPredator.RANDOM_SOURCE.nextInt(daedalus.getPreys().size()); - return daedalus.getPreys().get(randomPreyIndex); - } - - /** - * Returns the commonly targeted Prey. - * - * @param daedalus The Daedalus - * @return The common Prey - */ - private static Prey getPrey(Daedalus daedalus) { - if (GhostPredator.commonPrey == null || !daedalus.hasPrey(GhostPredator.commonPrey)) - GhostPredator.commonPrey = GhostPredator.selectRandomPrey(daedalus); - - return GhostPredator.commonPrey; - } - - /** - * Returns the commonly targeted Prey's position. - * - * @param daedalus The Daedalus - * @return The position of the Prey - */ - protected final Vector2D getPreyPosition(Daedalus daedalus) { - Prey prey = GhostPredator.getPrey(daedalus); - - if (prey == null) return this.homePosition; - return prey.getPosition(); - } - - /** - * Returns the commonly targeted Prey's Direction. - * - * @param daedalus The Daedalus - * @return The Direction the Prey is facing - */ - protected final Direction getPreyDirection(Daedalus daedalus) { - Prey prey = GhostPredator.getPrey(daedalus); - - if (prey == null) return Direction.NONE; - return prey.getDirection(); - } - - /** - * Calculates the Euclidean distance from the adjacent position at the given Direction to the target position. - * - * @param dir The adjacent Direction - * @param targetPosition The targeted position - * @return The Euclidean distance between the two positions - */ - private double calcDistanceFromAdjacentDirectionTo(Direction dir, Vector2D targetPosition) { - return this - .getPosition() - .addDirectionTo(dir) - .sub(targetPosition) - .dist(); - } - - /** - * Selects the best Direction in the given choices by minimizing the Euclidean distance to the targeted position. - * - * @param targetPosition The targeted position - * @param choices A set of Direction choices - * @return A set of optimal Direction choices - */ - private Set selectBestPaths(Vector2D targetPosition, Set choices) { - Set bestPaths = EnumSet.noneOf(Direction.class); - double minDist = Double.MAX_VALUE; - - for (Direction dir : choices) { - double dist = this.calcDistanceFromAdjacentDirectionTo(dir, targetPosition); - - if (dist < minDist) { - minDist = dist; - bestPaths.clear(); - } - - if (dist <= minDist) - bestPaths.add(dir); - } - - return bestPaths; - } - - /** - * Rotates to the next Mode. - */ - protected void rotateMode() { - this.mode = this.mode.getNext(); - this.modeCycle = 0; - } - - /** - * Increments the cycle counter and rotates to the next Mode if the Mode's duration has been reached. - */ - private void countCycle() { - this.modeCycle += 1; - - if (this.modeCycle >= this.mode.duration) - this.rotateMode(); - } - - @Override - public Direction move(Set choices, Daedalus daedalus) { - this.countCycle(); - - Set smartChoices = choices.size() > 1 ? this.excludeOrigin(choices) : choices; - Set bestPaths = this.selectBestPaths(this.getTargetPosition(daedalus), smartChoices); - return this.move(bestPaths); - } - - /** - * Returns the current Mode. - * - * @return The current Mode - */ - protected Mode getMode(Daedalus daedalus) { - return this.mode; - } - - /** - * Returns the position to target according to the current Mode. - * - * @param daedalus The Daedalus - * @return The position to target - */ - protected Vector2D getTargetPosition(Daedalus daedalus) { - switch (this.getMode(daedalus)) { - case CHASE: - return this.getPreyTargetPosition(daedalus); - case SCATTER: - return this.homePosition; - default: - return this.homePosition; - } - } - - /** - * Returns the Prey's projected targeted position. - * - * @param daedalus The Daedalus - * @return The projected position - */ - protected abstract Vector2D getPreyTargetPosition(Daedalus daedalus); - -} -- cgit v1.2.3