WIP CaptureTheFlag
This commit is contained in:
parent
ba24a0e430
commit
07e292a5e1
1 changed files with 84 additions and 8 deletions
|
|
@ -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<Castle> 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,11 +50,22 @@ 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
|
||||
|
||||
|
||||
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;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -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<Player> 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<Castle> pickRandomCastles(List<Castle> castles, int num) {
|
||||
|
||||
int min = 0;
|
||||
int max = castles.size();
|
||||
|
||||
List<Integer> nums = new ArrayList<Integer>();
|
||||
|
||||
if (num >= max)
|
||||
return new ArrayList<Castle>(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());
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue