From 07e292a5e1cced182274a92d096ae5fd1a408a3d Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Fri, 22 Mar 2019 15:11:56 +0100 Subject: [PATCH] WIP CaptureTheFlag --- .../src/game/goals/CaptureTheFlagGoal.java | 92 +++++++++++++++++-- 1 file changed, 84 insertions(+), 8 deletions(-) diff --git a/Projektgruppe_175/src/game/goals/CaptureTheFlagGoal.java b/Projektgruppe_175/src/game/goals/CaptureTheFlagGoal.java index c2f63bd..63a21ed 100644 --- a/Projektgruppe_175/src/game/goals/CaptureTheFlagGoal.java +++ b/Projektgruppe_175/src/game/goals/CaptureTheFlagGoal.java @@ -1,6 +1,9 @@ package game.goals; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.Random; import game.Game; import game.Goal; @@ -9,13 +12,20 @@ import game.map.Castle; public class CaptureTheFlagGoal extends Goal { - final int ROUND_FOR_DISTRIBUTION = 2; - final int MIN_ROUND_FOR_WIN = 2; + final static int ROUND_FOR_DISTRIBUTION = 2; + final static int MIN_ROUND_FOR_WIN = 2; + final static int NUM_FLAG_CASTLES = 4; List flagCastles; + private static Random random = new Random(); + private static int newRandomInt(int min, int max) { + return min + random.nextInt(max - min + 1); + } + public CaptureTheFlagGoal() { - super("Capture the flag", ""); + super("Capture the flag", "Derjenige Spieler gewinnt, der zuerst" + + " alle " + NUM_FLAG_CASTLES + " Flaggen-Schlösser erobert."); } @Override @@ -40,12 +50,23 @@ public class CaptureTheFlagGoal extends Goal { if (game.getRound() < MIN_ROUND_FOR_WIN) return null; + if (flagCastles.size() < 1) + return null; + + return // Check if all flag castles belong // to exactly one player - - - return null; - + flagCastles.stream() + .map(x -> x.getOwner()) + .reduce(flagCastles.get(0).getOwner(), (x, y) -> { + if (x == null || y == null) + return null; + else if (!x.equals(y)) + return null; + else + return x; + }); + } @Override @@ -59,12 +80,67 @@ public class CaptureTheFlagGoal extends Goal { } /** - * Distribute the flag castles + * Distribute the flag castles evenly to + * all players */ private void distributeFlagCastles() { + Game game = this.getGame(); + List players = game.getPlayers(); + + int numCastlesToDistribute = + /*if*/ NUM_FLAG_CASTLES < players.size() ? + /*then*/ players.size() : + /*else*/ NUM_FLAG_CASTLES; + + for (int i = 0; i < players.size(); i++) { + + int playersLeft = players.size() - i; + int numCastlesForPlayer = numCastlesToDistribute / playersLeft; + + if (numCastlesForPlayer > players.get(i).getCastles(game).size()) + numCastlesForPlayer = players.get(i).getCastles(game).size(); + + pickRandomCastles(players.get(i).getCastles(game), numCastlesForPlayer) + .stream() + .forEach(x -> flagCastles.add(x)); + + numCastlesToDistribute -= numCastlesForPlayer; + + } + + } + + /** + * Pick a number of random castles + * @param castles All castles + * @param num The number of castles to choose + * @return The picked castles + */ + private List pickRandomCastles(List castles, int num) { + + int min = 0; + int max = castles.size(); + + List nums = new ArrayList(); + + if (num >= max) + return new ArrayList(castles); + + for (int i = 0; i < num; i++) { + + int newNum = newRandomInt(min, max); + while (nums.contains(newNum)) + newNum = newRandomInt(min, max); + nums.add(newNum); + + } + + return nums.stream().map(x -> castles.get(x)).collect(Collectors.toList()); } + + }