Lobby has now a parameter that indicates if the lobby is still open or if the game has already started.

only the admin can start a game and only one game per lobby can be started
This commit is contained in:
Seraina 2022-04-15 17:24:51 +02:00
parent 5b0004f8ff
commit 1ba30663be
4 changed files with 80 additions and 11 deletions

View File

@ -131,7 +131,10 @@ public class Game implements Runnable {
} }
if (gameOverCheck.equals(ClientGameInfoHandler.gameOverGhostsWin) || gameOverCheck.equals( if (gameOverCheck.equals(ClientGameInfoHandler.gameOverGhostsWin) || gameOverCheck.equals(
ClientGameInfoHandler.gameOverHumansWin)) { ClientGameInfoHandler.gameOverHumansWin)) {
lobby.getAdmin().broadcastAnnouncementToLobby(gameOverCheck); //ToDo(Seraina): adjust for lobby lobby.getAdmin().broadcastAnnouncementToLobby(gameOverCheck);
lobby.removeGameFromRunningGames(this);
lobby.addGameToFinishedGames(this);
lobby.setLobbyIsOpen(true);
return; return;
} }
} }

View File

@ -90,6 +90,10 @@ public class MessageFormatter {
System.out.println("invalid vote"); System.out.println("invalid vote");
} }
stringBuilder.append(Protocol.votedFor + "$" + position + "$"); stringBuilder.append(Protocol.votedFor + "$" + position + "$");
break;
case "/s":
stringBuilder.append(Protocol.startANewGame);
break; break;
default: default:
s = msg; s = msg;

View File

@ -135,7 +135,6 @@ public class ClientHandler implements Runnable {
try { try {
getLobby().getGame().getGameState().changeUsername(helper,newName); getLobby().getGame().getGameState().changeUsername(helper,newName);
} catch (NullPointerException e) { } catch (NullPointerException e) {
LOGGER.warn("No game has been started yet in this lobby");
} }
} }
@ -306,15 +305,27 @@ public class ClientHandler implements Runnable {
} }
/** /**
* Initializes a new Game instance and starts its run method in a new thread * Initializes a new Game instance and starts its run method in a new thread.
* Puts the game in the corresponding lobby. Only the admin of this lobby can start a new
* game.
*/ */
public void startNewGame() { public void startNewGame() {
try { try {
Lobby l = getLobby(); Lobby l = getLobby();
Game game = new Game(6,1, l.getLobbyClients().size(), l); if (l.getLobbyIsOpen()) {
l.setGame(game); if (l.getAdmin().equals(this)) {
Thread t = new Thread(game); Game game = new Game(6, 1, l.getLobbyClients().size(), l);
t.start(); l.setGame(game);
Thread t = new Thread(game);
t.start();
l.addGameToRunningGames(game);
l.setLobbyIsOpen(false);
} else {
sendAnnouncementToClient("Only the admin can start the game");
}
} else {
sendAnnouncementToClient("The game has already started");
}
} catch (TrainOverflow e) { } catch (TrainOverflow e) {
LOGGER.warn(e.getMessage()); LOGGER.warn(e.getMessage());
} catch (NullPointerException e) { } catch (NullPointerException e) {
@ -379,7 +390,11 @@ public class ClientHandler implements Runnable {
public void joinLobby(int i) { public void joinLobby(int i) {
Lobby l = Lobby.getLobbyFromID(i); Lobby l = Lobby.getLobbyFromID(i);
if (l != null) { if (l != null) {
l.addPlayer(this); if (l.getLobbyIsOpen()) {
l.addPlayer(this);
} else {
sendAnnouncementToClient("The game in Lobby " + l.getLobbyID() + " has already started");
}
} else { } else {
sendAnnouncementToClient("Invalid Lobby nr."); sendAnnouncementToClient("Invalid Lobby nr.");
sendAnnouncementToClient("use LISTL to list lobbies"); sendAnnouncementToClient("use LISTL to list lobbies");
@ -411,7 +426,11 @@ public class ClientHandler implements Runnable {
sendAnnouncementToClient("No open Lobbies."); sendAnnouncementToClient("No open Lobbies.");
} else { } else {
for (Lobby l : Lobby.lobbies) { for (Lobby l : Lobby.lobbies) {
sendAnnouncementToClient("Lobby nr. " + l.getLobbyID() + ":"); String lobbyStatus = "closed";
if(l.getLobbyIsOpen()) {
lobbyStatus = "open";
}
sendAnnouncementToClient("Lobby nr. " + l.getLobbyID() + ": (" + lobbyStatus + ")");
for (ClientHandler c : l.getLobbyClients()) { for (ClientHandler c : l.getLobbyClients()) {
if (c.equals(l.getAdmin())) { if (c.equals(l.getAdmin())) {
sendAnnouncementToClient(" -" + c.getClientUserName() + " (admin)"); sendAnnouncementToClient(" -" + c.getClientUserName() + " (admin)");

View File

@ -17,8 +17,20 @@ public class Lobby {
public static final Logger LOGGER = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();
public static final BudaLogConfig l = new BudaLogConfig(LOGGER); public static final BudaLogConfig l = new BudaLogConfig(LOGGER);
public static HashSet<Lobby> lobbies = new HashSet<>(); public static HashSet<Lobby> lobbies = new HashSet<>();
public Game game; public static HashSet<Game> runningGames = new HashSet<>();
public boolean gameIsOngoing; //TODO(Seraina): getter and setter public static HashSet<Game> finishedGames = new HashSet<>();
/**
* The currently ongoing game, is set, when a game is started
*/
private Game game;
/**
* true by default
* true if game has not started yet, false if game has. If true, potential players can still join the game.
* Should be set to true again, after a game is finished.
* Games can only be started if Lobby is open.
*/
private boolean lobbyIsOpen = true;
private static final int MAX_NO_OF_CLIENTS = 6; private static final int MAX_NO_OF_CLIENTS = 6;
@ -96,6 +108,14 @@ public class Lobby {
return null; return null;
} }
public static HashSet<Game> getFinishedGames() {
return finishedGames;
}
public static HashSet<Game> getRunningGames() {
return runningGames;
}
/** /**
* Returns the game that the clients in this lobby are in * Returns the game that the clients in this lobby are in
* *
@ -105,6 +125,10 @@ public class Lobby {
return game; return game;
} }
public boolean getLobbyIsOpen() {
return lobbyIsOpen;
}
/** /**
* Sets the game of this lobby to a certain game * Sets the game of this lobby to a certain game
* *
@ -114,10 +138,16 @@ public class Lobby {
this.game = game; this.game = game;
} }
public void setLobbyIsOpen(boolean lobbyIsOpen) {
this.lobbyIsOpen = lobbyIsOpen;
}
/** /**
* Returns the ID of the lobby that the client is in. If the client is not in any * Returns the ID of the lobby that the client is in. If the client is not in any
* lobby, it returns -1. * lobby, it returns -1.
*/ */
public static int clientIsInLobby(ClientHandler h) { public static int clientIsInLobby(ClientHandler h) {
for (Lobby l: lobbies) { for (Lobby l: lobbies) {
for (ClientHandler clientHandler: l.getLobbyClients()) { for (ClientHandler clientHandler: l.getLobbyClients()) {
@ -172,6 +202,18 @@ public class Lobby {
return false; return false;
} }
public void addGameToRunningGames(Game game) {
runningGames.add(game);
}
public void removeGameFromRunningGames(Game game) {
runningGames.remove(game);
}
public void addGameToFinishedGames(Game game) {
finishedGames.add(game);
}
/** /**
* Closes the lobby. * Closes the lobby.
* *
@ -179,6 +221,7 @@ public class Lobby {
public void closeLobby() { public void closeLobby() {
lobbies.remove(this); lobbies.remove(this);
ClientHandler.broadcastAnnouncementToAll("Lobby nr. " + this.getLobbyID() + " has been closed."); ClientHandler.broadcastAnnouncementToAll("Lobby nr. " + this.getLobbyID() + " has been closed.");
/* /*
Todo: theoretically, this is enough to close a lobby. Todo: theoretically, this is enough to close a lobby.
ClientHandlers dont have to manually be removed from the lobby ClientHandlers dont have to manually be removed from the lobby