Compare commits

..

4 Commits

11 changed files with 60 additions and 22 deletions

BIN
Sound/hit.mp3 Normal file

Binary file not shown.

BIN
Sound/plop.mp3 Normal file

Binary file not shown.

BIN
Sound/shipdestroyed.mp3 Normal file

Binary file not shown.

View File

@ -42,6 +42,19 @@ public class Board {
return response; 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){ private void createShip(int semester){
List<ShipData> shipData = Ship.semeterList.get(semester -1); List<ShipData> shipData = Ship.semeterList.get(semester -1);
for (int i = 0; i < shipData.size(); i++) { for (int i = 0; i < shipData.size(); i++) {
@ -54,14 +67,21 @@ public class Board {
} }
public synchronized boolean addHits(HitResponse hitResponse) { public synchronized boolean addHits(HitResponse hitResponse) {
if (this.getHitResponsOnPoint(hitResponse.getPoint()) == null){ if (this.getHitResponseOnPoint(hitResponse.getPoint()) == null){
this.hits.add(hitResponse); this.hits.add(hitResponse);
//Propagate sunk for display purposes
if (hitResponse.getType() == HitResponseType.SUNK) {
hitResponse.setType(HitResponseType.HIT);
propagateSunk(hitResponse.getPoint());
}
return true; return true;
} }
return false; return false;
} }
public synchronized HitResponse getHitResponsOnPoint(Point point) { public synchronized HitResponse getHitResponseOnPoint(Point point) {
for (int i = 0; i < this.hits.size(); i++){ for (int i = 0; i < this.hits.size(); i++){
if (this.hits.get(i).getPoint().equals(point)){ if (this.hits.get(i).getPoint().equals(point)){
return this.hits.get(i); return this.hits.get(i);

View File

@ -63,7 +63,7 @@ public class BoardDisplay extends JPanel {
add(rowLabel); add(rowLabel);
} else { } else {
// Spielfeld (interaktive Zellen) // Spielfeld (interaktive Zellen)
JButton field = new JButton(x + ", " + y); JButton field = new JButton("");
field.setBackground(Color.BLUE); field.setBackground(Color.BLUE);
field.setOpaque(true); field.setOpaque(true);
field.setBorderPainted(true); field.setBorderPainted(true);
@ -102,6 +102,7 @@ public class BoardDisplay extends JPanel {
} else if (SwingUtilities.isLeftMouseButton(e)) { } else if (SwingUtilities.isLeftMouseButton(e)) {
Point o = new Point(x, y); Point o = new Point(x, y);
handleFieldClick(o); handleFieldClick(o);
SoundHandler.playSound("plop");
} }
} }
}); });
@ -196,30 +197,46 @@ public class BoardDisplay extends JPanel {
fields[i][j].setEnabled(true); fields[i][j].setEnabled(true);
} }
} }
fields[i][j].setBackground(Color.BLUE); if (this.enemyBoard) {
for(Point p : test) { fields[i][j].setBackground(Color.WHITE);
if(i==p.getX() && j==p.getY() && currentShip.checkValidPlacement(mousePosition,horizontal,player.getBoard().getShips(),gridSize)) { } else {
fields[i][j].setBackground(Color.GREEN); fields[i][j].setBackground(Color.BLUE);
}else if(i==p.getX() && j==p.getY() && !currentShip.checkValidPlacement(mousePosition,horizontal,player.getBoard().getShips(),gridSize)) { }
fields[i][j].setBackground(Color.RED); 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()) { for(Ship ship: player.getBoard().getShips()) {
if(ship.isShipOnPos(new Point(i,j))) { if(ship.isShipOnPos(new Point(i,j))) {
fields[i][j].setBackground(Color.LIGHT_GRAY); 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) { if (hit != null) {
switch (hit.getType()) { switch (hit.getType()) {
case HIT: case HIT:
fields[i][j].setBackground(Color.ORANGE);
SoundHandler.playSound("hit");
break;
case SUNK: case SUNK:
case VICTORY: case VICTORY:
fields[i][j].setBackground(Color.ORANGE); SoundHandler.playSound("destroyed");
fields[i][j].setBackground(Color.RED);
break; break;
case MISS: case MISS:
fields[i][j].setBackground(Color.CYAN); if (this.enemyBoard) {
SoundHandler.playSound("miss");
fields[i][j].setBackground(Color.BLUE);
} else {
fields[i][j].setBackground(Color.CYAN);
}
break; break;
} }
} }

View File

@ -7,8 +7,8 @@ public class HalloSchiffeVersenken {
System.out.println("HelloSchiffeVersenekn"); System.out.println("HelloSchiffeVersenekn");
System.out.println("sound"); //System.out.println("sound");
SoundHandler.playSound("hit"); //SoundHandler.playSound("hit");
Thread.sleep(10000); Thread.sleep(10000);

View File

@ -8,8 +8,6 @@ import java.net.InetSocketAddress;
/** /**
* Das JoinGame Panel dient zum setzten des Ports/IP-Adresse. * Das JoinGame Panel dient zum setzten des Ports/IP-Adresse.
* Anschließend kann das Verbinden Panel gezeigt werden. * Anschließend kann das Verbinden Panel gezeigt werden.
* 51525
* ssh.lgc.sh
*/ */
public class JoinGame extends JPanel { public class JoinGame extends JPanel {
// Grafiken // Grafiken

View File

@ -10,7 +10,7 @@ public class LocalPlayer extends Player {
@Override @Override
public synchronized void receiveShoot(Point point) { public synchronized void receiveShoot(Point point) {
HitResponse hitResponse = board.getHitResponsOnPoint(point); HitResponse hitResponse = board.getHitResponseOnPoint(point);
if (!(hitResponse == null)){ if (!(hitResponse == null)){
enemy.receiveHit(hitResponse); enemy.receiveHit(hitResponse);

View File

@ -9,7 +9,7 @@ public class Point {
public Point (String str) { public Point (String str) {
if (Point.isValidSyntax(str)) { if (Point.isValidSyntax(str)) {
this.setX(str.charAt(0)); this.setX(str.charAt(0));
this.setY(Integer.parseInt(str.substring(1))); this.setY(Integer.parseInt(str.substring(1)) - 1);
} else { } else {
throw new IllegalArgumentException("String ist keine gültige Koordinate"); throw new IllegalArgumentException("String ist keine gültige Koordinate");
} }
@ -17,7 +17,7 @@ public class Point {
@Override @Override
public String toString() { 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() { public int getX() {

View File

@ -16,7 +16,10 @@ public class SoundHandler {
// Wenn fehler beim erstellen von .jar mit sound hier gucken // Wenn fehler beim erstellen von .jar mit sound hier gucken
private static HashMap<String, String> sounds = new HashMap<String, String>(Map.of( private static HashMap<String, String> sounds = new HashMap<String, String>(Map.of(
"hit", "./Sound/water-drip.mp3" "miss", "./Sound/water-drip.mp3",
"hit", "./Sound/hit.mp3",
"destroyed", "./Sound/hit.mp3",
"plop", "./Sound/plop.mp3"
)); ));
public static void playSound(String soundName) { public static void playSound(String soundName) {

View File

@ -15,7 +15,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{
// Shoot at the enemy and receive the hit response // Shoot at the enemy and receive the hit response
enemy.receiveShoot(nextShot); 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 it's a hit or sunk, add adjacent cells to the hitsQueue
if (hitResponse.getHitResponse() == HitResponseType.HIT) { if (hitResponse.getHitResponse() == HitResponseType.HIT) {
addAdjacentPoints(nextShot); addAdjacentPoints(nextShot);