diff options
-rw-r--r-- | src/ch/epfl/xblast/server/GameState.java | 48 | ||||
-rw-r--r-- | src/ch/epfl/xblast/server/debug/GameStatePrinter.java | 29 |
2 files changed, 47 insertions, 30 deletions
diff --git a/src/ch/epfl/xblast/server/GameState.java b/src/ch/epfl/xblast/server/GameState.java index c51afe7..4ed1af5 100644 --- a/src/ch/epfl/xblast/server/GameState.java +++ b/src/ch/epfl/xblast/server/GameState.java | |||
@@ -473,13 +473,29 @@ public final class GameState { | |||
473 | * @return the highest priority player | 473 | * @return the highest priority player |
474 | */ | 474 | */ |
475 | private PlayerID resolveConflict(List<PlayerID> claimants) { | 475 | private PlayerID resolveConflict(List<PlayerID> claimants) { |
476 | if (claimants == null || claimants.isEmpty()) throw new IllegalArgumentException(); | 476 | if (claimants == null || claimants.isEmpty()) return null; |
477 | 477 | ||
478 | return this.currentPlayerPriorityOrder() | 478 | return this.currentPlayerPriorityOrder().stream() |
479 | .stream() | ||
480 | .filter(claimants::contains) | 479 | .filter(claimants::contains) |
481 | .findFirst() | 480 | .findFirst().get(); |
482 | .get(); | 481 | } |
482 | |||
483 | /** | ||
484 | * Resolves a conflict according to the current priority order. | ||
485 | * | ||
486 | * @param claimants the list of claimants | ||
487 | * @return the highest priority player | ||
488 | */ | ||
489 | public Player resolvePlayerConflict(List<Player> claimants) { | ||
490 | if (claimants == null || claimants.isEmpty()) return null; | ||
491 | |||
492 | Map<PlayerID, Player> claimantsMap = claimants.stream() | ||
493 | .collect(Collectors.toMap(Player::id, Function.identity())); | ||
494 | |||
495 | List<PlayerID> claimantsIDs = claimants.stream() | ||
496 | .map(Player::id).collect(Collectors.toList()); | ||
497 | |||
498 | return claimantsMap.get(this.resolveConflict(claimantsIDs)); | ||
483 | } | 499 | } |
484 | 500 | ||
485 | /** | 501 | /** |
@@ -488,11 +504,11 @@ public final class GameState { | |||
488 | * @param players a list of players to map | 504 | * @param players a list of players to map |
489 | * @return the location->player mapping | 505 | * @return the location->player mapping |
490 | */ | 506 | */ |
491 | private Map<Cell, List<PlayerID>> mapPlayersCells(List<Player> players) { | 507 | public Map<Cell, List<Player>> mapPlayersCells(List<Player> players) { |
492 | return players.stream() | 508 | return players.stream() |
493 | .collect( | 509 | .collect( |
494 | Collectors.groupingBy(p -> p.position().containingCell(), | 510 | Collectors.groupingBy(p -> p.position().containingCell(), |
495 | Collectors.mapping(Player::id, Collectors.toList()))); | 511 | Collectors.mapping(Function.identity(), Collectors.toList()))); |
496 | } | 512 | } |
497 | 513 | ||
498 | /** | 514 | /** |
@@ -502,11 +518,11 @@ public final class GameState { | |||
502 | * @param players a list of players to map | 518 | * @param players a list of players to map |
503 | * @return the location->top-priority player mapping | 519 | * @return the location->top-priority player mapping |
504 | */ | 520 | */ |
505 | private Map<Cell, PlayerID> mapTopPriorityPlayerCells(List<Player> players) { | 521 | private Map<Cell, Player> mapTopPriorityPlayerCells(List<Player> players) { |
506 | return this.mapPlayersCells(players).entrySet().stream() | 522 | return this.mapPlayersCells(players).entrySet().stream() |
507 | .collect(Collectors.toMap( | 523 | .collect(Collectors.toMap( |
508 | Map.Entry::getKey, | 524 | Map.Entry::getKey, |
509 | e -> resolveConflict(e.getValue()))); | 525 | e -> resolvePlayerConflict(e.getValue()))); |
510 | } | 526 | } |
511 | 527 | ||
512 | /** | 528 | /** |
@@ -519,7 +535,9 @@ public final class GameState { | |||
519 | this.alivePlayers().stream() | 535 | this.alivePlayers().stream() |
520 | .filter(p -> p.position().isCentral()) | 536 | .filter(p -> p.position().isCentral()) |
521 | .filter(p -> this.board.blockAt(p.position().containingCell()).isBonus()) | 537 | .filter(p -> this.board.blockAt(p.position().containingCell()).isBonus()) |
522 | .collect(Collectors.toList())); | 538 | .collect(Collectors.toList())) |
539 | .entrySet().stream() | ||
540 | .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().id())); | ||
523 | } | 541 | } |
524 | 542 | ||
525 | /** | 543 | /** |
@@ -542,13 +560,13 @@ public final class GameState { | |||
542 | * @return the conflict-free set of bomb drop events | 560 | * @return the conflict-free set of bomb drop events |
543 | */ | 561 | */ |
544 | private Set<PlayerID> discardConflictingBombDropEvents(Set<PlayerID> bombDropEvents) { | 562 | private Set<PlayerID> discardConflictingBombDropEvents(Set<PlayerID> bombDropEvents) { |
545 | Map<Cell, PlayerID> bombDropMap = this.mapTopPriorityPlayerCells( | 563 | return this.mapTopPriorityPlayerCells( |
546 | this.alivePlayers().stream() | 564 | this.alivePlayers().stream() |
547 | .filter(p -> bombDropEvents.contains(p.id())) | 565 | .filter(p -> bombDropEvents.contains(p.id())) |
548 | .collect(Collectors.toList()) | 566 | .collect(Collectors.toList())) |
549 | ); | 567 | .values().stream() |
550 | 568 | .map(Player::id) | |
551 | return bombDropMap.isEmpty() ? EnumSet.noneOf(PlayerID.class) : EnumSet.copyOf(bombDropMap.values()); | 569 | .collect(Collectors.toSet()); |
552 | } | 570 | } |
553 | 571 | ||
554 | @Override | 572 | @Override |
diff --git a/src/ch/epfl/xblast/server/debug/GameStatePrinter.java b/src/ch/epfl/xblast/server/debug/GameStatePrinter.java index d81c6b9..575b09a 100644 --- a/src/ch/epfl/xblast/server/debug/GameStatePrinter.java +++ b/src/ch/epfl/xblast/server/debug/GameStatePrinter.java | |||
@@ -1,13 +1,12 @@ | |||
1 | package ch.epfl.xblast.server.debug; | 1 | package ch.epfl.xblast.server.debug; |
2 | 2 | ||
3 | import ch.epfl.xblast.Cell; | 3 | import ch.epfl.xblast.Cell; |
4 | import ch.epfl.xblast.server.*; | 4 | import ch.epfl.xblast.server.Block; |
5 | import ch.epfl.xblast.server.GameState; | ||
6 | import ch.epfl.xblast.server.Player; | ||
5 | 7 | ||
6 | import java.util.List; | 8 | import java.util.List; |
7 | import java.util.Map; | 9 | import java.util.Map; |
8 | import java.util.Set; | ||
9 | import java.util.function.Function; | ||
10 | import java.util.stream.Collectors; | ||
11 | 10 | ||
12 | /** | 11 | /** |
13 | * Game state printer utility class that outputs the board to the terminal. | 12 | * Game state printer utility class that outputs the board to the terminal. |
@@ -40,36 +39,36 @@ public final class GameStatePrinter { | |||
40 | 39 | ||
41 | public static void printGameState(GameState s) { | 40 | public static void printGameState(GameState s) { |
42 | printStats(s); | 41 | printStats(s); |
43 | printBoard(s.board(), s.alivePlayers(), s.bombedCells(), s.blastedCells()); | 42 | printBoard(s); |
44 | } | 43 | } |
45 | 44 | ||
46 | private static void printStats(GameState s) { | 45 | private static void printStats(GameState s) { |
47 | System.out.println(s); | 46 | System.out.println(s); |
48 | } | 47 | } |
49 | 48 | ||
50 | private static void printBoard(Board b, List<Player> ps, Map<Cell, Bomb> bc, Set<Cell> blastedCells) { | 49 | private static void printBoard(GameState s) { |
51 | Map<Cell, Player> playerMap = ps.stream() | 50 | Map<Cell, List<Player>> playerMap = s.mapPlayersCells(s.alivePlayers()); |
52 | .collect(Collectors.toMap(p -> p.position().containingCell(), Function.identity())); | ||
53 | 51 | ||
54 | for (int y = 0; y < Cell.ROWS; ++y) { | 52 | for (int y = 0; y < Cell.ROWS; ++y) { |
55 | for (int x = 0; x < Cell.COLUMNS; ++x) | 53 | for (int x = 0; x < Cell.COLUMNS; ++x) |
56 | System.out.print(GameStatePrinter.stringForCellContent(new Cell(x, y), b, bc, playerMap, blastedCells)); | 54 | System.out.print(GameStatePrinter.stringForCellContent(s, new Cell(x, y), playerMap)); |
57 | 55 | ||
58 | System.out.println(); | 56 | System.out.println(); |
59 | } | 57 | } |
60 | } | 58 | } |
61 | 59 | ||
62 | private static String stringForCellContent(Cell c, Board b, Map<Cell, Bomb> bc, Map<Cell, Player> p, Set<Cell> blastedCells) { | 60 | private static String stringForCellContent(GameState s, Cell c, Map<Cell, List<Player>> pl) { |
63 | if (bc.containsKey(c)) | 61 | if (s.bombedCells().containsKey(c)) |
64 | return ANSIColor.RED.coloredText("@@"); | 62 | return ANSIColor.RED.coloredText("@@"); |
65 | 63 | ||
66 | if (p.containsKey(c)) | 64 | Player p = s.resolvePlayerConflict(pl.get(c)); |
67 | return GameStatePrinter.stringForPlayer(p.get(c)); | 65 | if (p != null) |
66 | return GameStatePrinter.stringForPlayer(p); | ||
68 | 67 | ||
69 | if (blastedCells.contains(c)) | 68 | if (s.blastedCells().contains(c)) |
70 | return ANSIColor.MAGENTA.coloredText("**"); | 69 | return ANSIColor.MAGENTA.coloredText("**"); |
71 | 70 | ||
72 | return GameStatePrinter.stringForBlock(b.blockAt(c)); | 71 | return GameStatePrinter.stringForBlock(s.board().blockAt(c)); |
73 | } | 72 | } |
74 | 73 | ||
75 | private static String stringForPlayer(Player p) { | 74 | private static String stringForPlayer(Player p) { |