Fix drawn players

This commit is contained in:
Michel ten Voorde
2024-10-27 17:15:14 +01:00
parent f91c50af7b
commit 5a9b46b298
2 changed files with 18 additions and 55 deletions

View File

@@ -69,23 +69,26 @@ public class Tournament extends AbstractEntity {
.collect(Collectors.toCollection(ArrayList::new)); .collect(Collectors.toCollection(ArrayList::new));
} }
public boolean hasPlayersDrawnOutMaxOnce() { public List<Player> getDrawnOutPlayers() {
var drawnOutPlayers = new HashSet<Player>(); var drawnOutPlayers = new ArrayList<Player>();
for (var event : events) { for (var event : events) {
for (var group : event.getGroups()) { for (var group : event.getGroups()) {
for (var round : group.getRounds()) { for (var round : group.getRounds()) {
var drawnOut = round.getDrawnOut(); var drawnOut = round.getDrawnOut();
if (drawnOut != null) { if (drawnOut != null) {
if (!drawnOutPlayers.add(drawnOut.getPlayer1())) { drawnOutPlayers.add(drawnOut.getPlayer1());
return false; if (drawnOut.getPlayer2() != null) {
} drawnOutPlayers.add(drawnOut.getPlayer2());
if (drawnOut.getPlayer2() != null && !drawnOutPlayers.add(drawnOut.getPlayer2())) {
return false;
} }
} }
} }
} }
} }
return true; return drawnOutPlayers;
}
public boolean hasPlayersDrawnOutMaxOnce() {
var drawnOutPlayers = this.getDrawnOutPlayers();
return drawnOutPlayers.size() == new HashSet<>(drawnOutPlayers).size();
} }
} }

View File

@@ -61,15 +61,16 @@ public class TournamentPlayService {
round.setStatus(Status.NOT_STARTED); round.setStatus(Status.NOT_STARTED);
if (remainingTeams.size() % 2 == 1) { if (remainingTeams.size() % 2 == 1) {
var random = new Random(); var drawnOutPlayers = tournament.getDrawnOutPlayers();
var drawnOutPlayers = getDrawnOutPlayers(tournament); var tryPosition = remainingTeams.size() - 1;
do { do {
var randomTeam = remainingTeams.get(random.nextInt(remainingTeams.size())); var tryDrawOutTeam = remainingTeams.get(tryPosition);
if (!drawnOutPlayers.contains(randomTeam.getPlayer1()) && (randomTeam.getPlayer2() == null || !drawnOutPlayers.contains(randomTeam.getPlayer2()))) { if (!drawnOutPlayers.contains(tryDrawOutTeam.getPlayer1()) && (tryDrawOutTeam.getPlayer2() == null || !drawnOutPlayers.contains(tryDrawOutTeam.getPlayer2()))) {
remainingTeams.remove(randomTeam); remainingTeams.remove(tryDrawOutTeam);
round.setDrawnOut(randomTeam); round.setDrawnOut(tryDrawOutTeam);
break; break;
} }
tryPosition--;
} while(true); } while(true);
} }
@@ -92,47 +93,6 @@ public class TournamentPlayService {
return tournament; return tournament;
} }
private List<Player> getDrawnOutPlayers(Tournament tournament) {
var players = new ArrayList<Player>();
for (var event : tournament.getEvents()) {
for (var group : event.getGroups()) {
var playersInGroup = group.getTeams().stream()
.map(this::getPlayersInTeam)
.flatMap(List::stream)
.toList();
for (var player : playersInGroup) {
for (var round : group.getRounds()) {
var foundInRound = false;
for (var match : round.getMatches()) {
if (playerIsInMatch(match, player)) {
foundInRound = true;
}
}
if (!foundInRound) {
players.add(player);
log.info(player.getFullName() + " is al uitgeloot in het toernooi.");
}
}
}
}
}
return players;
}
private List<Player> getPlayersInTeam(Team team) {
return team.getPlayer2() == null ? List.of(team.getPlayer1()) : List.of(team.getPlayer1(), team.getPlayer2());
}
private boolean playerIsInTeam(Team team, Player player) {
return Objects.equals(team.getPlayer1(), player) || Objects.equals(team.getPlayer2(), player);
}
private boolean playerIsInMatch(Match match, Player player) {
return playerIsInTeam(match.getTeam1(), player) || playerIsInTeam(match.getTeam2(), player);
}
private void printRound(Round round, List<StandingsEntry> standings) { private void printRound(Round round, List<StandingsEntry> standings) {
for (var match: round.getMatches()) { for (var match: round.getMatches()) {
log.info("%s - %s".formatted( log.info("%s - %s".formatted(