Add clientside and serverside map check
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Projekte [test]" type="GradleRunConfiguration" factoryName="Gradle">
|
||||
<ExternalSystemSettings>
|
||||
<option name="executionName" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$/Projekte" />
|
||||
<option name="externalSystemIdString" value="GRADLE" />
|
||||
<option name="scriptParameters" value="--continue" />
|
||||
<option name="taskDescriptions">
|
||||
|
||||
@@ -140,10 +140,20 @@ public Player addPlayer(int id) {
|
||||
*/
|
||||
@Override
|
||||
public void received(MapMessage msg, int from) {
|
||||
Player player = getPlayerById(from);
|
||||
List<Battleship> ships = msg.getShips();
|
||||
|
||||
if (state != ServerState.SET_UP)
|
||||
LOGGER.log(Level.ERROR, "playerReady not allowed in {0}", state); //NON-NLS
|
||||
else
|
||||
playerReady(getPlayerById(from), msg.getShips());
|
||||
else {
|
||||
if (!checkShips(player, ships)) {
|
||||
LOGGER.log(Level.ERROR, "{0} submited an illegal map", player); //NON-NLS
|
||||
send(player, new GameDetails(config));
|
||||
}
|
||||
else {
|
||||
playerReady(player, msg.getShips());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -173,6 +183,7 @@ void playerReady(Player player, List<Battleship> ships) {
|
||||
return;
|
||||
}
|
||||
ships.forEach(player.getMap()::add);
|
||||
|
||||
if (readyPlayers.size() == 2) {
|
||||
for (Player p : players)
|
||||
send(p, new StartBattleMessage(p == activePlayer));
|
||||
@@ -180,6 +191,29 @@ void playerReady(Player player, List<Battleship> ships) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if all ships are placed correctly.
|
||||
*
|
||||
* @param player the player who is ready
|
||||
* @param ships the list of ships placed by the player
|
||||
* @return true if all ships are placed correctly, false otherwise
|
||||
*/
|
||||
private boolean checkShips(Player player, List<Battleship> ships) {
|
||||
for(Battleship ship : ships) {
|
||||
for(Battleship other : ships) {
|
||||
if(ship.collidesWith(other)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(!player.getMap().isValid(ship)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the shooting action by the player.
|
||||
*
|
||||
|
||||
@@ -53,7 +53,7 @@ public ShipMapDTO(ShipMap map) {
|
||||
* Checks if the current ship map fits the game details provided.
|
||||
*
|
||||
* @param details the game details to be matched against
|
||||
* @return true if the ship map fits the game details, false otherwise
|
||||
* @return true if the ship map fits the game details and all ships have a valid position, false otherwise
|
||||
*/
|
||||
public boolean fits(GameDetails details) {
|
||||
if (width != details.getWidth() || height != details.getHeight())
|
||||
@@ -61,6 +61,14 @@ public boolean fits(GameDetails details) {
|
||||
int numShips = details.getShipNums().values().stream().mapToInt(Integer::intValue).sum();
|
||||
if (numShips != ships.size())
|
||||
return false;
|
||||
|
||||
ShipMap map = new ShipMap(width, height, null);
|
||||
for(Battleship ship : map.getShips().toList()) {
|
||||
if(!map.isValid(ship)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (var e : details.getShipNums().entrySet()) {
|
||||
final int shipLength = e.getKey();
|
||||
final int requiredNum = e.getValue();
|
||||
|
||||
Reference in New Issue
Block a user