added the solution for exercise 8 for the client
added the checkMapToLoad() in EditorState.java so if the Player tries to load a map it will be checked if the placement is correct.
This commit is contained in:
parent
1bac56c92c
commit
7b70666332
@@ -16,8 +16,10 @@
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.System.Logger.Level;
|
import java.lang.System.Logger.Level;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import static pp.battleship.Resources.lookup;
|
import static pp.battleship.Resources.lookup;
|
||||||
|
import static pp.battleship.game.client.ClientGameLogic.LOGGER;
|
||||||
import static pp.battleship.model.Battleship.Status.INVALID_PREVIEW;
|
import static pp.battleship.model.Battleship.Status.INVALID_PREVIEW;
|
||||||
import static pp.battleship.model.Battleship.Status.NORMAL;
|
import static pp.battleship.model.Battleship.Status.NORMAL;
|
||||||
import static pp.battleship.model.Battleship.Status.VALID_PREVIEW;
|
import static pp.battleship.model.Battleship.Status.VALID_PREVIEW;
|
||||||
@@ -56,7 +58,7 @@ public boolean showEditor() {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void movePreview(IntPoint pos) {
|
public void movePreview(IntPoint pos) {
|
||||||
ClientGameLogic.LOGGER.log(Level.DEBUG, "move preview to {0}", pos); //NON-NLS
|
LOGGER.log(Level.DEBUG, "move preview to {0}", pos); //NON-NLS
|
||||||
if (preview == null || !ownMap().isValid(pos)) return;
|
if (preview == null || !ownMap().isValid(pos)) return;
|
||||||
preview.moveTo(pos);
|
preview.moveTo(pos);
|
||||||
setPreviewStatus(preview);
|
setPreviewStatus(preview);
|
||||||
@@ -71,7 +73,7 @@ public void movePreview(IntPoint pos) {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void clickOwnMap(IntPoint pos) {
|
public void clickOwnMap(IntPoint pos) {
|
||||||
ClientGameLogic.LOGGER.log(Level.DEBUG, "click at {0} in own map", pos); //NON-NLS
|
LOGGER.log(Level.DEBUG, "click at {0} in own map", pos); //NON-NLS
|
||||||
if (!ownMap().isValid(pos)) return;
|
if (!ownMap().isValid(pos)) return;
|
||||||
if (preview == null)
|
if (preview == null)
|
||||||
modifyShip(pos);
|
modifyShip(pos);
|
||||||
@@ -125,7 +127,7 @@ private void placeShip(IntPoint cursor) {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void clickHarbor(IntPoint pos) {
|
public void clickHarbor(IntPoint pos) {
|
||||||
ClientGameLogic.LOGGER.log(Level.DEBUG, "click at {0} in harbor", pos); //NON-NLS
|
LOGGER.log(Level.DEBUG, "click at {0} in harbor", pos); //NON-NLS
|
||||||
if (!harbor().isValid(pos)) return;
|
if (!harbor().isValid(pos)) return;
|
||||||
final Battleship shipAtCursor = harbor().findShipAt(pos);
|
final Battleship shipAtCursor = harbor().findShipAt(pos);
|
||||||
if (preview != null) {
|
if (preview != null) {
|
||||||
@@ -152,7 +154,7 @@ else if (shipAtCursor != null) {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void rotateShip() {
|
public void rotateShip() {
|
||||||
ClientGameLogic.LOGGER.log(Level.DEBUG, "pushed rotate"); //NON-NLS
|
LOGGER.log(Level.DEBUG, "pushed rotate"); //NON-NLS
|
||||||
if (preview == null) return;
|
if (preview == null) return;
|
||||||
preview.rotated();
|
preview.rotated();
|
||||||
ownMap().remove(preview);
|
ownMap().remove(preview);
|
||||||
@@ -238,6 +240,9 @@ public void loadMap(File file) throws IOException {
|
|||||||
final ShipMapDTO dto = ShipMapDTO.loadFrom(file);
|
final ShipMapDTO dto = ShipMapDTO.loadFrom(file);
|
||||||
if (!dto.fits(logic.getDetails()))
|
if (!dto.fits(logic.getDetails()))
|
||||||
throw new IOException(lookup("map.doesnt.fit"));
|
throw new IOException(lookup("map.doesnt.fit"));
|
||||||
|
else if (!checkMapToLoad(dto)) {
|
||||||
|
throw new IOException(lookup("ships.dont.fit.the.map"));
|
||||||
|
}
|
||||||
ownMap().clear();
|
ownMap().clear();
|
||||||
dto.getShips().forEach(ownMap()::add);
|
dto.getShips().forEach(ownMap()::add);
|
||||||
harbor().clear();
|
harbor().clear();
|
||||||
@@ -245,6 +250,48 @@ public void loadMap(File file) throws IOException {
|
|||||||
selectedInHarbor = null;
|
selectedInHarbor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean checkMapToLoad(ShipMapDTO dto) {
|
||||||
|
int mapWidth = dto.getWidth();
|
||||||
|
int mapHeight = dto.getHeight();
|
||||||
|
|
||||||
|
// check if ship is out of bounds
|
||||||
|
for (int i = 0; i < dto.getShips().size(); i++) {
|
||||||
|
Battleship battleship = dto.getShips().get(i);
|
||||||
|
if (battleship.getMaxX() >= mapWidth || battleship.getMinX() < 0 || battleship.getMaxY() >= mapHeight || battleship.getMinY() < 0) {
|
||||||
|
LOGGER.log(Level.ERROR, "Ship is out of bounds ({0})", battleship.toString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if ships overlap
|
||||||
|
int[][] tempMap = new int[mapWidth][mapHeight];
|
||||||
|
for (int[] row : tempMap)
|
||||||
|
Arrays.fill(row, 0);
|
||||||
|
dto.getShips().forEach(s -> {
|
||||||
|
int deltaX = s.getMaxX() - s.getMinX();
|
||||||
|
int deltaY = s.getMaxY() - s.getMinY();
|
||||||
|
int lastX = s.getX();
|
||||||
|
int lastY = s.getY();
|
||||||
|
tempMap[lastX][lastY] += 1;
|
||||||
|
for (int i = 0; i < deltaX - 1; i++)
|
||||||
|
for (int j = 0; j < deltaY - 1; j++) {
|
||||||
|
tempMap[lastX + (deltaX / Math.abs(deltaX))][lastY + (deltaY / Math.abs(deltaY))] += 1;
|
||||||
|
lastX = lastX + (deltaX / Math.abs(deltaX));
|
||||||
|
lastY = lastY + (deltaY / Math.abs(deltaY));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (int[] row : tempMap) {
|
||||||
|
for (int cell : row) {
|
||||||
|
if (cell > 1) {
|
||||||
|
LOGGER.log(Level.ERROR, "There are multiple ships on one position");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player's own map may be loaded from a file.
|
* Checks if the player's own map may be loaded from a file.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -82,6 +82,20 @@ public List<Battleship> getShips() {
|
|||||||
return ships.stream().map(BattleshipDTO::toBattleship).toList();
|
return ships.stream().map(BattleshipDTO::toBattleship).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the width of the DTO.
|
||||||
|
*
|
||||||
|
* @return the width of the DTO
|
||||||
|
*/
|
||||||
|
public int getWidth() {return width;}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the height of the DTO.
|
||||||
|
*
|
||||||
|
* @return the height of the DTO.
|
||||||
|
*/
|
||||||
|
public int getHeight() {return height;}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the current ShipMapDTO to a file in JSON format.
|
* Saves the current ShipMapDTO to a file in JSON format.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user