Server site map loading validation

This commit is contained in:
Simon Wilkening 2024-10-12 15:51:44 +02:00
parent 64834e8bf1
commit fae747e504

View File

@ -142,8 +142,15 @@ public class ServerGameLogic implements ClientInterpreter {
public void received(MapMessage msg, int from) { public void received(MapMessage msg, int from) {
if (state != ServerState.SET_UP) if (state != ServerState.SET_UP)
LOGGER.log(Level.ERROR, "playerReady not allowed in {0}", state); //NON-NLS LOGGER.log(Level.ERROR, "playerReady not allowed in {0}", state); //NON-NLS
else
playerReady(getPlayerById(from), msg.getShips()); List<Battleship> ships = msg.getShips();
if (!shipsValidation(ships)){
LOGGER.log(Level.ERROR, "ship placement by player {0} is Invalid", from);
send(getPlayerById(from),null);
return;
}
playerReady(getPlayerById(from), msg.getShips());
} }
/** /**
@ -217,4 +224,41 @@ public class ServerGameLogic implements ClientInterpreter {
} }
} }
} }
/* Tests if any ship in the list occupies the space of another ship and marks occupied points in the Map.
* @param ships list of ships to validate
* @return {@code true} if all ships positions are valid, {@code false} otherwise
*/
private boolean shipsValidation(List<Battleship> ships) {
Set<IntPoint> occupied = new HashSet<>();
for (Battleship ship : ships) {
if (!onMap(ship)){
return false;
}
for (int x = ship.getMinX(); x <= ship.getMaxX(); x++) {
for (int y = ship.getMinY(); y <= ship.getMaxY(); y++) {
IntPoint point = new IntPoint(x,y);
if (!occupied.add(point)){
return false;
}
}
}
}
return true;
}
/* Tests if a given ship is positioned inside of Map constrains
* @param ship the ship to validate
* @return {@code true} if a ship is not violating constrains, {@code false} otherwise
*/
private boolean onMap(Battleship ship){
return ship.getMinX() >= 0 && ship.getMaxX() < config.getMapWidth() &&
ship.getMinY() >= 0 && ship.getMaxY() < config.getMapHeight();
}
} }