summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ch/epfl/maze/physical/pacman/Blinky.java3
-rw-r--r--src/ch/epfl/maze/physical/pacman/Clyde.java3
-rw-r--r--src/ch/epfl/maze/physical/pacman/Ghost.java (renamed from src/ch/epfl/maze/physical/GhostPredator.java)185
-rw-r--r--src/ch/epfl/maze/physical/pacman/Inky.java15
-rw-r--r--src/ch/epfl/maze/physical/pacman/Pinky.java3
-rw-r--r--src/ch/epfl/maze/physical/stragegies/reducer/CostReducer.java51
6 files changed, 163 insertions, 97 deletions
diff --git a/src/ch/epfl/maze/physical/pacman/Blinky.java b/src/ch/epfl/maze/physical/pacman/Blinky.java
index 4e8c4a0..5f81d13 100644
--- a/src/ch/epfl/maze/physical/pacman/Blinky.java
+++ b/src/ch/epfl/maze/physical/pacman/Blinky.java
@@ -2,7 +2,6 @@ package ch.epfl.maze.physical.pacman;
2 2
3import ch.epfl.maze.physical.Animal; 3import ch.epfl.maze.physical.Animal;
4import ch.epfl.maze.physical.Daedalus; 4import ch.epfl.maze.physical.Daedalus;
5import ch.epfl.maze.physical.GhostPredator;
6import ch.epfl.maze.util.Vector2D; 5import ch.epfl.maze.util.Vector2D;
7 6
8/** 7/**
@@ -11,7 +10,7 @@ import ch.epfl.maze.util.Vector2D;
11 * @author EPFL 10 * @author EPFL
12 * @author Pacien TRAN-GIRARD 11 * @author Pacien TRAN-GIRARD
13 */ 12 */
14public class Blinky extends GhostPredator { 13public class Blinky extends Ghost {
15 14
16 /** 15 /**
17 * Constructs a Blinky with a starting position. 16 * Constructs a Blinky with a starting position.
diff --git a/src/ch/epfl/maze/physical/pacman/Clyde.java b/src/ch/epfl/maze/physical/pacman/Clyde.java
index 40089db..2d7e47a 100644
--- a/src/ch/epfl/maze/physical/pacman/Clyde.java
+++ b/src/ch/epfl/maze/physical/pacman/Clyde.java
@@ -2,7 +2,6 @@ package ch.epfl.maze.physical.pacman;
2 2
3import ch.epfl.maze.physical.Animal; 3import ch.epfl.maze.physical.Animal;
4import ch.epfl.maze.physical.Daedalus; 4import ch.epfl.maze.physical.Daedalus;
5import ch.epfl.maze.physical.GhostPredator;
6import ch.epfl.maze.util.Vector2D; 5import ch.epfl.maze.util.Vector2D;
7 6
8/** 7/**
@@ -12,7 +11,7 @@ import ch.epfl.maze.util.Vector2D;
12 * @author EPFL 11 * @author EPFL
13 * @author Pacien TRAN-GIRARD 12 * @author Pacien TRAN-GIRARD
14 */ 13 */
15public class Clyde extends GhostPredator { 14public class Clyde extends Ghost {
16 15
17 private static double PROXIMITY_THRESHOLD = 4.0d; 16 private static double PROXIMITY_THRESHOLD = 4.0d;
18 17
diff --git a/src/ch/epfl/maze/physical/GhostPredator.java b/src/ch/epfl/maze/physical/pacman/Ghost.java
index c1cfca8..f8f511e 100644
--- a/src/ch/epfl/maze/physical/GhostPredator.java
+++ b/src/ch/epfl/maze/physical/pacman/Ghost.java
@@ -1,5 +1,11 @@
1package ch.epfl.maze.physical; 1package ch.epfl.maze.physical.pacman;
2 2
3import ch.epfl.maze.physical.Daedalus;
4import ch.epfl.maze.physical.Predator;
5import ch.epfl.maze.physical.Prey;
6import ch.epfl.maze.physical.stragegies.picker.RandomPicker;
7import ch.epfl.maze.physical.stragegies.reducer.BackwardReducer;
8import ch.epfl.maze.physical.stragegies.reducer.CostReducer;
3import ch.epfl.maze.util.Direction; 9import ch.epfl.maze.util.Direction;
4import ch.epfl.maze.util.Vector2D; 10import ch.epfl.maze.util.Vector2D;
5 11
@@ -11,7 +17,7 @@ import java.util.Set;
11 * 17 *
12 * @author Pacien TRAN-GIRARD 18 * @author Pacien TRAN-GIRARD
13 */ 19 */
14abstract public class GhostPredator extends Predator { 20abstract public class Ghost extends Predator implements BackwardReducer, CostReducer, RandomPicker {
15 21
16 public enum Mode { 22 public enum Mode {
17 CHASE(40), 23 CHASE(40),
@@ -58,7 +64,7 @@ abstract public class GhostPredator extends Predator {
58 * 64 *
59 * @param position Position of the predator in the labyrinth 65 * @param position Position of the predator in the labyrinth
60 */ 66 */
61 public GhostPredator(Vector2D position) { 67 public Ghost(Vector2D position) {
62 super(position); 68 super(position);
63 69
64 this.homePosition = position; 70 this.homePosition = position;
@@ -68,16 +74,98 @@ abstract public class GhostPredator extends Predator {
68 } 74 }
69 75
70 /** 76 /**
77 * Returns the cost to reach the target by choosing the given Direction by calculating the Euclidean distance.
78 *
79 * @param choice The Direction choice
80 * @param daedalus The Daedalus
81 * @return The Euclidean distance cost
82 */
83 @Override
84 public int getChoiceCost(Direction choice, Daedalus daedalus) {
85 Vector2D target = this.getTargetPosition(daedalus);
86 return (int) (this.getDistanceTo(choice, target) * 100);
87 }
88
89 @Override
90 public Set<Direction> reduce(Set<Direction> choices) {
91 return EnumSet.noneOf(Direction.class);
92 }
93
94 /**
95 * Selects the best Direction in the given choices by minimizing the Euclidean distance to the targeted position
96 * after excluding the provenance if possible.
97 *
98 * @param choices A set of Direction choices
99 * @param daedalus The Daedalus
100 * @return A set of optimal Direction choices
101 */
102 @Override
103 public Set<Direction> reduce(Set<Direction> choices, Daedalus daedalus) {
104 Set<Direction> forwardChoices = choices.size() > 1 ? BackwardReducer.super.reduce(choices) : choices;
105 return CostReducer.super.reduce(forwardChoices, daedalus);
106 }
107
108 @Override
109 public Direction move(Set<Direction> choices, Daedalus daedalus) {
110 this.countCycle();
111
112 Set<Direction> bestChoices = this.reduce(choices, daedalus);
113 return this.pick(bestChoices);
114 }
115
116 /**
117 * Returns the Prey's projected targeted position.
118 *
119 * @param daedalus The Daedalus
120 * @return The projected position
121 */
122 abstract protected Vector2D getPreyTargetPosition(Daedalus daedalus);
123
124 /**
125 * Returns the current Mode.
126 *
127 * @param daedalus The Daedalus
128 * @return The current Mode
129 */
130 protected Mode getMode(Daedalus daedalus) {
131 return this.mode;
132 }
133
134 /**
135 * Returns the position to target according to the current Mode.
136 *
137 * @param daedalus The Daedalus
138 * @return The position to target
139 */
140 protected Vector2D getTargetPosition(Daedalus daedalus) {
141 switch (this.getMode(daedalus)) {
142 case CHASE:
143 return this.getPreyTargetPosition(daedalus);
144 case SCATTER:
145 return this.homePosition;
146 default:
147 return this.homePosition;
148 }
149 }
150
151 /**
71 * Selects a new random Prey to chase in the Daedalus. 152 * Selects a new random Prey to chase in the Daedalus.
72 * 153 *
73 * @param daedalus The Daedalus 154 * @param daedalus The Daedalus
74 * @return The Chosen One 155 * @return The Chosen One
75 */ 156 */
76 private static Prey selectRandomPrey(Daedalus daedalus) { 157 private static Prey selectAnyPrey(Daedalus daedalus) {
77 if (daedalus.getPreys().isEmpty()) return null; 158 if (daedalus.getPreySet().isEmpty()) return null;
159 return daedalus.getPreySet().stream().findAny().get();
160 }
78 161
79 int randomPreyIndex = GhostPredator.RANDOM_SOURCE.nextInt(daedalus.getPreys().size()); 162 /**
80 return daedalus.getPreys().get(randomPreyIndex); 163 * Sets a random Prey as the common Pre.
164 *
165 * @param daedalus The Daedalus
166 */
167 private static synchronized void setAnyPrey(Daedalus daedalus) {
168 Ghost.commonPrey = Ghost.selectAnyPrey(daedalus);
81 } 169 }
82 170
83 /** 171 /**
@@ -87,10 +175,10 @@ abstract public class GhostPredator extends Predator {
87 * @return The common Prey 175 * @return The common Prey
88 */ 176 */
89 private static Prey getPrey(Daedalus daedalus) { 177 private static Prey getPrey(Daedalus daedalus) {
90 if (GhostPredator.commonPrey == null || !daedalus.hasPrey(GhostPredator.commonPrey)) 178 if (Ghost.commonPrey == null || !daedalus.hasPrey(Ghost.commonPrey))
91 GhostPredator.commonPrey = GhostPredator.selectRandomPrey(daedalus); 179 Ghost.setAnyPrey(daedalus);
92 180
93 return GhostPredator.commonPrey; 181 return Ghost.commonPrey;
94 } 182 }
95 183
96 /** 184 /**
@@ -100,7 +188,7 @@ abstract public class GhostPredator extends Predator {
100 * @return The position of the Prey 188 * @return The position of the Prey
101 */ 189 */
102 protected final Vector2D getPreyPosition(Daedalus daedalus) { 190 protected final Vector2D getPreyPosition(Daedalus daedalus) {
103 Prey prey = GhostPredator.getPrey(daedalus); 191 Prey prey = Ghost.getPrey(daedalus);