diff --git a/src/Board.java b/src/Board.java index 08fb3a2..c91468c 100644 --- a/src/Board.java +++ b/src/Board.java @@ -42,6 +42,19 @@ public class Board { return response; } + private void propagateSunk(Point p) { + HitResponse hit = this.getHitResponseOnPoint(p); + + if (hit == null || hit.getType() != HitResponseType.HIT) return; + + hit.setType(HitResponseType.SUNK); + + propagateSunk(new Point(p.getX() + 1, p.getY())); + propagateSunk(new Point(p.getX() - 1, p.getY())); + propagateSunk(new Point(p.getX(), p.getY() + 1)); + propagateSunk(new Point(p.getX(), p.getY() - 1)); + } + private void createShip(int semester){ List shipData = Ship.semeterList.get(semester -1); for (int i = 0; i < shipData.size(); i++) { @@ -54,14 +67,21 @@ public class Board { } public synchronized boolean addHits(HitResponse hitResponse) { - if (this.getHitResponsOnPoint(hitResponse.getPoint()) == null){ + if (this.getHitResponseOnPoint(hitResponse.getPoint()) == null){ this.hits.add(hitResponse); + + //Propagate sunk for display purposes + if (hitResponse.getType() == HitResponseType.SUNK) { + hitResponse.setType(HitResponseType.HIT); + propagateSunk(hitResponse.getPoint()); + } + return true; } return false; } - public synchronized HitResponse getHitResponsOnPoint(Point point) { + public synchronized HitResponse getHitResponseOnPoint(Point point) { for (int i = 0; i < this.hits.size(); i++){ if (this.hits.get(i).getPoint().equals(point)){ return this.hits.get(i); diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index 4046810..4afa8c4 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -63,7 +63,7 @@ public class BoardDisplay extends JPanel { add(rowLabel); } else { // Spielfeld (interaktive Zellen) - JButton field = new JButton(x + ", " + y); + JButton field = new JButton(""); field.setBackground(Color.BLUE); field.setOpaque(true); field.setBorderPainted(true); @@ -196,30 +196,43 @@ public class BoardDisplay extends JPanel { fields[i][j].setEnabled(true); } } - fields[i][j].setBackground(Color.BLUE); - for(Point p : test) { - if(i==p.getX() && j==p.getY() && currentShip.checkValidPlacement(mousePosition,horizontal,player.getBoard().getShips(),gridSize)) { - fields[i][j].setBackground(Color.GREEN); - }else if(i==p.getX() && j==p.getY() && !currentShip.checkValidPlacement(mousePosition,horizontal,player.getBoard().getShips(),gridSize)) { - fields[i][j].setBackground(Color.RED); + if (this.enemyBoard) { + fields[i][j].setBackground(Color.WHITE); + } else { + fields[i][j].setBackground(Color.BLUE); + } + if (!this.player.isReady()) { + for(Point p : test) { + if(i==p.getX() && j==p.getY()) { + if (currentShip.checkValidPlacement(mousePosition,horizontal,player.getBoard().getShips(),gridSize)) { + fields[i][j].setBackground(Color.GREEN); + } else { + fields[i][j].setBackground(Color.RED); + } + } } } for(Ship ship: player.getBoard().getShips()) { if(ship.isShipOnPos(new Point(i,j))) { fields[i][j].setBackground(Color.LIGHT_GRAY); - break; } } - HitResponse hit = this.player.getBoard().getHitResponsOnPoint(new Point(i, j)); + HitResponse hit = this.player.getBoard().getHitResponseOnPoint(new Point(i, j)); if (hit != null) { switch (hit.getType()) { case HIT: - case SUNK: - case VICTORY: fields[i][j].setBackground(Color.ORANGE); break; + case SUNK: + case VICTORY: + fields[i][j].setBackground(Color.RED); + break; case MISS: - fields[i][j].setBackground(Color.CYAN); + if (this.enemyBoard) { + fields[i][j].setBackground(Color.BLUE); + } else { + fields[i][j].setBackground(Color.CYAN); + } break; } } diff --git a/src/LocalPlayer.java b/src/LocalPlayer.java index 2c6980c..f3e434b 100644 --- a/src/LocalPlayer.java +++ b/src/LocalPlayer.java @@ -10,7 +10,7 @@ public class LocalPlayer extends Player { @Override public synchronized void receiveShoot(Point point) { - HitResponse hitResponse = board.getHitResponsOnPoint(point); + HitResponse hitResponse = board.getHitResponseOnPoint(point); if (!(hitResponse == null)){ enemy.receiveHit(hitResponse); diff --git a/src/Point.java b/src/Point.java index d47d401..d5b06ed 100644 --- a/src/Point.java +++ b/src/Point.java @@ -9,7 +9,7 @@ public class Point { public Point (String str) { if (Point.isValidSyntax(str)) { this.setX(str.charAt(0)); - this.setY(Integer.parseInt(str.substring(1))); + this.setY(Integer.parseInt(str.substring(1)) - 1); } else { throw new IllegalArgumentException("String ist keine gültige Koordinate"); } @@ -17,7 +17,7 @@ public class Point { @Override public String toString() { - return (char) ('A' + this.x) + String.valueOf(this.y); + return (char) ('A' + this.x) + String.valueOf(this.y + 1); } public int getX() { diff --git a/src/SpecificAiPlayerMedium.java b/src/SpecificAiPlayerMedium.java index ea1ddfb..de7c14e 100644 --- a/src/SpecificAiPlayerMedium.java +++ b/src/SpecificAiPlayerMedium.java @@ -15,7 +15,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{ // Shoot at the enemy and receive the hit response enemy.receiveShoot(nextShot); - HitResponse hitResponse = enemy.board.getHitResponsOnPoint(nextShot); + HitResponse hitResponse = enemy.board.getHitResponseOnPoint(nextShot); // If it's a hit or sunk, add adjacent cells to the hitsQueue if (hitResponse.getHitResponse() == HitResponseType.HIT) { addAdjacentPoints(nextShot);