diff options
Diffstat (limited to 'src/ch')
-rw-r--r-- | src/ch/epfl/xblast/ArgumentChecker.java | 23 | ||||
-rw-r--r-- | src/ch/epfl/xblast/PlayerID.java | 13 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/Bomb.java | 116 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/Player.java | 291 |
4 files changed, 443 insertions, 0 deletions
diff --git a/src/ch/epfl/xblast/ArgumentChecker.java b/src/ch/epfl/xblast/ArgumentChecker.java new file mode 100644 index 0000000..8e7ba76 --- /dev/null +++ b/src/ch/epfl/xblast/ArgumentChecker.java | |||
@@ -0,0 +1,23 @@ | |||
1 | package ch.epfl.xblast; | ||
2 | |||
3 | /** | ||
4 | * ArgumentChecker. | ||
5 | * | ||
6 | * @author Timothée FLOURE (257420) | ||
7 | */ | ||
8 | public final class ArgumentChecker { | ||
9 | /** | ||
10 | * Return the given value if it is non-negative | ||
11 | * | ||
12 | * @param value the tested value | ||
13 | * @throws IllegalArgumentException if the value is inferior to 0 | ||
14 | * @return the given value if non-negative | ||
15 | */ | ||
16 | public static int requireNonNegative(int value) { | ||
17 | if (value >= 0) { | ||
18 | return value; | ||
19 | } else { | ||
20 | throw new IllegalArgumentException(); | ||
21 | } | ||
22 | } | ||
23 | } | ||
diff --git a/src/ch/epfl/xblast/PlayerID.java b/src/ch/epfl/xblast/PlayerID.java new file mode 100644 index 0000000..05a280b --- /dev/null +++ b/src/ch/epfl/xblast/PlayerID.java | |||
@@ -0,0 +1,13 @@ | |||
1 | package ch.epfl.xblast; | ||
2 | |||
3 | /** | ||
4 | * IDs the 4 different players. | ||
5 | * | ||
6 | * @author Timothée FLOURE (257420) | ||
7 | */ | ||
8 | public enum PlayerID { | ||
9 | PLAYER_1, | ||
10 | PLAYER_2, | ||
11 | PLAYER_3, | ||
12 | PLAYER_4 | ||
13 | } | ||
diff --git a/src/ch/epfl/xblast/server/Bomb.java b/src/ch/epfl/xblast/server/Bomb.java new file mode 100644 index 0000000..3f49f64 --- /dev/null +++ b/src/ch/epfl/xblast/server/Bomb.java | |||
@@ -0,0 +1,116 @@ | |||
1 | package ch.epfl.xblast.server; | ||
2 | |||
3 | import ch.epfl.xblast.PlayerID; | ||
4 | import ch.epfl.xblast.Cell; | ||
5 | import ch.epfl.cs108.Sq; | ||
6 | import ch.epfl.xblast.ArgumentChecker; | ||
7 | import ch.epfl.xblast.Direction; | ||
8 | |||
9 | import java.util.Objects; | ||
10 | import java.util.List; | ||
11 | import java.util.ArrayList; | ||
12 | |||
13 | /** | ||
14 | * @author Timothée FLOURE (257420) | ||
15 | */ | ||
16 | public final class Bomb { | ||
17 | private PlayerID ownerId; | ||
18 | private Cell position; | ||
19 | private Sq<Integer> fuseLengths; | ||
20 | private int range; | ||
21 | |||
22 | /** | ||
23 | * Generate one arm of explosion | ||
24 | */ | ||
25 | private Sq<Sq<Cell>> explosionArmTowards(Direction dir) { | ||
26 | return Sq.constant( Sq.iterate(position, position -> position.neighbor(dir)).limit(range)).limit(Ticks.EXPLOSION_TICKS); | ||
27 | } | ||
28 | |||
29 | /** | ||
30 | * Instanciates a new Bomb. | ||
31 | * | ||
32 | * @param ownerId id of the owner of the bomb | ||
33 | * @param position position of the bomb | ||
34 | * @param fuseLengths length of the bomb's fuse | ||
35 | * @param range range of the bomb | ||
36 | * @throws IllegalArguementException if range is negative or fuseLenghts is empty | ||
37 | * @throws NullPointerException if ownerId, position or fuseLengths is null | ||
38 | */ | ||
39 | public Bomb(PlayerID ownerId, Cell position, Sq<Integer> fuseLengths, int range) { | ||
40 | this.ownerId = Objects.requireNonNull(ownerId); | ||
41 | this.position = Objects.requireNonNull(position); | ||
42 | if (fuseLengths.isEmpty()) { | ||
43 | throw new IllegalArgumentException(); | ||
44 | } else { | ||
45 | this.fuseLengths = Objects.requireNonNull(fuseLengths); | ||
46 | } | ||
47 | this.range = ArgumentChecker.requireNonNegative(range); | ||
48 | } | ||
49 | |||
50 | /** | ||
51 | * Instanciates a new Bomb. | ||
52 | * | ||
53 | * @param ownerId id of the owner of the bomb | ||
54 | * @param position position of the bomb | ||
55 | * @param fuseLengths length of the bomb's fuse | ||
56 | * @param range range of the bomb | ||
57 | * @throws IllegalArguementException if range or fuseLengths is negative | ||
58 | * @throws NullPointerException if ownerId, position or fuseLengths is null | ||
59 | */ | ||
60 | public Bomb(PlayerID ownerId, Cell position, int fuseLength, int range) { | ||
61 | this.ownerId = Objects.requireNonNull(ownerId); | ||
62 | this.position = Objects.requireNonNull(position); | ||
63 | if (fuseLength == 0) { | ||
64 | throw new IllegalArgumentException(); | ||
65 | } else { | ||
66 | fuseLengths = Sq.iterate(fuseLength, fuseLengths -> fuseLength - 1 ); | ||
67 | } | ||
68 | this.range = ArgumentChecker.requireNonNegative(range); | ||
69 | } | ||
70 | |||
71 | /** | ||
72 | * @return the ID of the owner of the bomb | ||
73 | */ | ||
74 | public PlayerID ownerId() { | ||
75 | return ownerId; | ||
76 | } | ||
77 | |||
78 | /** | ||
79 | * @return the position of the bomb | ||
80 | */ | ||
81 | public Cell position() { | ||
82 | return position; | ||
83 | } | ||
84 | |||
85 | /** | ||
86 | * @return the length of the fuse | ||
87 | */ | ||
88 | public Sq<Integer> fuseLengths() { | ||
89 | return fuseLengths; | ||
90 | } | ||
91 | |||
92 | /** | ||
93 | * @return the remaining time before the explosion | ||
94 | */ | ||
95 | public int fuseLength() { | ||
96 | return fuseLengths.head(); | ||
97 | } | ||
98 | |||
99 | /** | ||
100 | * @return the range of the Bomb | ||
101 | */ | ||
102 | public int range() { | ||
103 | return range; | ||
104 | } | ||
105 | |||
106 | /** | ||
107 | * @return the explosion | ||
108 | */ | ||
109 | public List<Sq<Sq<Cell>>> explosion() { | ||
110 | List<Sq<Sq<Cell>>> explosion = new ArrayList<>(); | ||
111 | for (Direction dir : Direction.values()) { | ||
112 | explosion.add(explosionArmTowards(dir)); | ||
113 | } | ||
114 | return explosion; | ||
115 | } | ||
116 | } | ||
diff --git a/src/ch/epfl/xblast/server/Player.java b/src/ch/epfl/xblast/server/Player.java new file mode 100644 index 0000000..b3ae851 --- /dev/null +++ b/src/ch/epfl/xblast/server/Player.java | |||
@@ -0,0 +1,291 @@ | |||
1 | package ch.epfl.xblast.server; | ||
2 | |||
3 | import ch.epfl.xblast.ArgumentChecker; | ||
4 | import ch.epfl.xblast.Direction; | ||
5 | import ch.epfl.xblast.Cell; | ||
6 | import ch.epfl.xblast.SubCell; | ||
7 | import ch.epfl.xblast.PlayerID; | ||
8 | import ch.epfl.cs108.Sq; | ||
9 | |||
10 | import java.util.Objects; | ||
11 | |||
12 | /** | ||
13 | * Player. | ||
14 | * | ||
15 | * @author Timothée FLOURE (257420) | ||
16 | */ | ||
17 | public final class Player { | ||
18 | /** | ||
19 | * The life state of a player. | ||
20 | */ | ||
21 | public static final class LifeState { | ||
22 | /** | ||
23 | * Enum containing all the possible states. | ||
24 | */ | ||
25 | public enum State { | ||
26 | INVULNERABLE, | ||
27 | VULNERABLE, | ||
28 | DYING, | ||
29 | DEAD | ||
30 | } | ||
31 | |||
32 | private final int lives; | ||
33 | private final State state; | ||
34 | |||
35 | /** | ||
36 | * Instanciates a new LifeSate. | ||
37 | * | ||
38 | * @param lives the number of lifes | ||
39 | * @param state the state | ||
40 | * @throws IllegalArgumentException if lives is negative | ||
41 | */ | ||
42 | public LifeState(int lives, State state) { | ||
43 | this.lives = ArgumentChecker.requireNonNegative(lives); | ||
44 | this.state = state; | ||
45 | } | ||
46 | |||
47 | /** | ||
48 | * @return the number of lives | ||
49 | */ | ||
50 | public int lives() { | ||
51 | return lives; | ||
52 | } | ||
53 | |||
54 | /** | ||
55 | * @return the state | ||
56 | */ | ||
57 | public State state() { | ||
58 | return state; | ||
59 | } | ||
60 | |||
61 | /** | ||
62 | * @return true if the actual state allow to move | ||
63 | */ | ||
64 | public boolean canMove() { | ||
65 | return (state() == State.INVULNERABLE || state() == State.VULNERABLE); | ||
66 | } | ||
67 | } | ||
68 | |||
69 | /** | ||
70 | * The "directed" position of a player. | ||
71 | */ | ||
72 | public static final class DirectedPosition { | ||
73 | private final SubCell position; | ||
74 | private final Direction direction; | ||
75 | |||
76 | /** | ||
77 | * @return an infinite sequence of directed positions corresponding to a stopped player. | ||
78 | */ | ||
79 | public static Sq<DirectedPosition> stopped(DirectedPosition p) { | ||
80 | return Sq.constant(p); |