diff options
-rw-r--r-- | src/ch/epfl/xblast/ArgumentChecker.java | 5 | ||||
-rw-r--r-- | src/ch/epfl/xblast/Lists.java | 40 | ||||
-rw-r--r-- | src/ch/epfl/xblast/Time.java | 31 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/Block.java | 53 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/Bonus.java | 55 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/GameState.java | 146 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/Ticks.java | 22 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/debug/GameStatePrinter.java | 81 | ||||
-rw-r--r-- | test/ch/epfl/xblast/ListsTest.java | 15 | ||||
-rw-r--r-- | test/ch/epfl/xblast/namecheck/NameCheck04.java | 78 |
10 files changed, 519 insertions, 7 deletions
diff --git a/src/ch/epfl/xblast/ArgumentChecker.java b/src/ch/epfl/xblast/ArgumentChecker.java index 311807e..589c197 100644 --- a/src/ch/epfl/xblast/ArgumentChecker.java +++ b/src/ch/epfl/xblast/ArgumentChecker.java | |||
@@ -16,11 +16,10 @@ public final class ArgumentChecker { | |||
16 | * @throws IllegalArgumentException if the value is inferior to 0 | 16 | * @throws IllegalArgumentException if the value is inferior to 0 |
17 | */ | 17 | */ |
18 | public static int requireNonNegative(int value) { | 18 | public static int requireNonNegative(int value) { |
19 | if (value >= 0) { | 19 | if (value >= 0) |
20 | return value; | 20 | return value; |
21 | } else { | 21 | else |
22 | throw new IllegalArgumentException(); | 22 | throw new IllegalArgumentException(); |
23 | } | ||
24 | } | 23 | } |
25 | 24 | ||
26 | } | 25 | } |
diff --git a/src/ch/epfl/xblast/Lists.java b/src/ch/epfl/xblast/Lists.java index 51e76b0..4ea45c2 100644 --- a/src/ch/epfl/xblast/Lists.java +++ b/src/ch/epfl/xblast/Lists.java | |||
@@ -1,8 +1,6 @@ | |||
1 | package ch.epfl.xblast; | 1 | package ch.epfl.xblast; |
2 | 2 | ||
3 | import java.util.ArrayList; | 3 | import java.util.*; |
4 | import java.util.Collections; | ||
5 | import java.util.List; | ||
6 | import java.util.stream.Collectors; | 4 | import java.util.stream.Collectors; |
7 | import java.util.stream.Stream; | 5 | import java.util.stream.Stream; |
8 | 6 | ||
@@ -44,4 +42,40 @@ public final class Lists { | |||
44 | .collect(Collectors.toList()); | 42 | .collect(Collectors.toList()); |
45 | } | 43 | } |
46 | 44 | ||
45 | /** | ||
46 | * Returns a copy of the given list with element e inserted at index i. | ||
47 | * | ||
48 | * @param l the list | ||
49 | * @param i the insertion index | ||
50 | * @param e the element to insert | ||
51 | * @param <T> the type of the list's elements | ||
52 | * @return a copy of the list with the element inserted | ||
53 | */ | ||
54 | public static <T> List<T> inserted(List<T> l, int i, T e) { | ||
55 | List<T> r = new LinkedList<>(l); | ||
56 | r.add(i, e); | ||
57 | return r; | ||
58 | } | ||
59 | |||
60 | /** | ||
61 | * Returns all the permutations of the elements of the given list | ||
62 | * | ||
63 | * @param l given list | ||
64 | * @param <T> the type of the list's elements | ||
65 | * @return a list of all the permutations of the list | ||
66 | * @throws IllegalArgumentException if the given list is null | ||
67 | */ | ||
68 | public static <T> List<List<T>> permutations(List<T> l) { | ||
69 | if (l == null) throw new IllegalArgumentException(); | ||
70 | if (l.size() <= 1) return Collections.singletonList(l); | ||
71 | if (l.size() == 2) return Arrays.asList(l, Lists.reversed(l)); | ||
72 | |||
73 | List<List<T>> p = new LinkedList<>(); | ||
74 | for (List<T> sp : Lists.permutations(l.subList(1, l.size()))) | ||
75 | for (int i = 0; i <= sp.size(); ++i) | ||
76 | p.add(Lists.inserted(sp, i, l.get(0))); | ||
77 | |||
78 | return p; | ||
79 | } | ||
80 | |||
47 | } | 81 | } |
diff --git a/src/ch/epfl/xblast/Time.java b/src/ch/epfl/xblast/Time.java new file mode 100644 index 0000000..7c84257 --- /dev/null +++ b/src/ch/epfl/xblast/Time.java | |||
@@ -0,0 +1,31 @@ | |||
1 | package ch.epfl.xblast; | ||
2 | |||
3 | /** | ||
4 | * Time unit constants. | ||
5 | * | ||
6 | * @author Pacien TRAN-GIRARD (261948) | ||
7 | * @author Timothée FLOURE (257420) | ||
8 | */ | ||
9 | public interface Time { | ||
10 | |||
11 | /** | ||
12 | * Number of seconds per minute. | ||
13 | */ | ||
14 | int S_PER_MIN = 60; | ||
15 | |||
16 | /** | ||
17 | * Number of milliseconds per second. | ||
18 | */ | ||
19 | int MS_PER_S = 1000; | ||
20 | |||
21 | /** | ||
22 | * Number of microseconds per second. | ||
23 | */ | ||
24 | int US_PER_S = 1000 * MS_PER_S; | ||
25 | |||
26 | /** | ||
27 | * Number of nanoseconds per second. | ||
28 | */ | ||
29 | int NS_PER_S = 1000 * US_PER_S; | ||
30 | |||
31 | } | ||
diff --git a/src/ch/epfl/xblast/server/Block.java b/src/ch/epfl/xblast/server/Block.java index 409f68e..5a139ff 100644 --- a/src/ch/epfl/xblast/server/Block.java +++ b/src/ch/epfl/xblast/server/Block.java | |||
@@ -1,5 +1,7 @@ | |||
1 | package ch.epfl.xblast.server; | 1 | package ch.epfl.xblast.server; |
2 | 2 | ||
3 | import java.util.NoSuchElementException; | ||
4 | |||
3 | /** | 5 | /** |
4 | * A Block. | 6 | * A Block. |
5 | * | 7 | * |
@@ -26,7 +28,36 @@ public enum Block { | |||
26 | /** | 28 | /** |
27 | * Crumbling Wall. | 29 | * Crumbling Wall. |
28 | */ | 30 | */ |
29 | CRUMBLING_WALL; | 31 | CRUMBLING_WALL, |
32 | |||
33 | /** | ||
34 | * Bonus increasing the maximum number of bombs. | ||
35 | */ | ||
36 | BONUS_BOMB(Bonus.INC_BOMB), | ||
37 | |||
38 | /** | ||
39 | * Bonus increasing the range of the bombs. | ||
40 | */ | ||
41 | BONUS_RANGE(Bonus.INC_RANGE); | ||
42 | |||
43 | /** | ||
44 | * Corresponding bonus, or null | ||
45 | */ | ||
46 | private Bonus maybeAssociatedBonus; | ||
47 | |||
48 | /** | ||
49 | * Main builder, used by the bonus blocks | ||
50 | */ | ||
51 | Block(Bonus maybeAssociatedBonus) { | ||
52 | this.maybeAssociatedBonus = maybeAssociatedBonus; | ||
53 | } | ||
54 | |||
55 | /** | ||
56 | * Default builder, used by the non-bonus blocks | ||
57 | */ | ||
58 | Block() { | ||
59 | this.maybeAssociatedBonus = null; | ||
60 | } | ||
30 | 61 | ||
31 | /** | 62 | /** |
32 | * Returns T(this block is free). | 63 | * Returns T(this block is free). |
@@ -55,4 +86,24 @@ public enum Block { | |||
55 | return this == INDESTRUCTIBLE_WALL || this == DESTRUCTIBLE_WALL || this == CRUMBLING_WALL; | 86 | return this == INDESTRUCTIBLE_WALL || this == DESTRUCTIBLE_WALL || this == CRUMBLING_WALL; |
56 | } | 87 | } |
57 | 88 | ||
89 | /** | ||
90 | * Returns T(this block is a bonus). | ||
91 | * | ||
92 | * @return T(this block is a bonus) | ||
93 | */ | ||
94 | public boolean isBonus() { | ||
95 | return this == BONUS_BOMB || this == BONUS_RANGE; | ||
96 | } | ||
97 | |||
98 | /** | ||
99 | * Returns the bonus associated with the block. | ||
100 | * | ||
101 | * @return the bonus associated with the block. | ||
102 | * @throws NoSuchElementException if there is no such bonus. | ||
103 | */ | ||
104 | public Bonus associatedBonus() { | ||
105 | if (this.maybeAssociatedBonus == null) throw new NoSuchElementException(); | ||
106 | return this.maybeAssociatedBonus; | ||
107 | } | ||
108 | |||
58 | } | 109 | } |
diff --git a/src/ch/epfl/xblast/server/Bonus.java b/src/ch/epfl/xblast/server/Bonus.java new file mode 100644 index 0000000..80ca8a9 --- /dev/null +++ b/src/ch/epfl/xblast/server/Bonus.java | |||
@@ -0,0 +1,55 @@ | |||
1 | package ch.epfl.xblast.server; | ||
2 | |||
3 | /** | ||
4 | * Bonuses. | ||
5 | * | ||
6 | * @author Pacien TRAN-GIRARD (261948) | ||
7 | * @author Timothée FLOURE (257420) | ||
8 | */ | ||
9 | public enum Bonus { | ||
10 | |||
11 | /** | ||
12 | * Increases the maximum number of bombs used simultaneously. | ||
13 | */ | ||
14 | INC_BOMB { | ||
15 | @Override | ||
16 | public Player applyTo(Player player) { | ||
17 | if (player.maxBombs() < BOMBS_LIMIT) | ||
18 | return player.withMaxBombs(player.maxBombs() + 1); | ||
19 | else | ||
20 | return player.withMaxBombs(BOMBS_LIMIT); | ||
21 | } | ||
22 | }, | ||
23 | |||
24 | /** | ||
25 | * Increases the range of the bombs. | ||
26 | */ | ||
27 | INC_RANGE { | ||
28 | @Override | ||
29 | public Player applyTo(Player player) { | ||
30 | if (player.bombRange() < RANGE_LIMIT) | ||
31 | return player.withBombRange(player.bombRange() + 1); | ||
32 | else | ||
33 | return player.withBombRange(RANGE_LIMIT); | ||
34 | } | ||
35 | }; | ||
36 | |||
37 | /** | ||
38 | * Maximum number of bombs. | ||
39 | */ | ||
40 | private final int BOMBS_LIMIT = 9; | ||
41 | |||
42 | /** | ||
43 | * Maximum range of a bomb. | ||
44 | */ | ||
45 | private final int RANGE_LIMIT = 9; | ||