Kommentare und Withdraw #24

Merged
lgc merged 3 commits from FH_Last_changes into main 2024-12-23 19:39:53 +00:00
8 changed files with 100 additions and 24 deletions

View File

@ -1,3 +1,7 @@
/**
* Die Board-Klasse repräsentiert das Spielfeld.
* @author Peer Ole Wachtel, Florian Alexy und Florian Hantzschel
*/
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -8,7 +12,11 @@ public class Board {
private List<Ship> ships; private List<Ship> ships;
private final int size; private final int size;
/**
* Initialisiert das Board und die zu Setzenden schiffe.
* @param size
* @author Peer Ole Wachtel, Florian Alexy und Florian Hantzschel
*/
public Board(int size) { public Board(int size) {
this.size = size; this.size = size;
this.ships = new ArrayList<>(); this.ships = new ArrayList<>();
@ -64,6 +72,7 @@ public class Board {
/** /**
* creates all the ships on a board given a certain semester * creates all the ships on a board given a certain semester
* @param semester the semester to be played in * @param semester the semester to be played in
* @author Peer Ole Wachtel
*/ */
private void createShip(int semester){ private void createShip(int semester){
List<ShipData> shipData = Ship.semeterList.get(semester); List<ShipData> shipData = Ship.semeterList.get(semester);

View File

@ -56,12 +56,9 @@ public class GameBoard extends JPanel {
List<Ship> shipsP1 =p1.getBoard().getShips(); List<Ship> shipsP1 =p1.getBoard().getShips();
List<Ship> shipsP2 =p2.getBoard().getShips(); List<Ship> shipsP2 =p2.getBoard().getShips();
giveUpButton.addActionListener(new ActionListener() { giveUpButton.addActionListener((e) -> {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Hier könnte Ihr Backend Code stehen
frame.showPanel("MainMenu"); frame.showPanel("MainMenu");
} p1.withdraw();
}); });
} }

View File

@ -33,7 +33,7 @@ public class LocalPlayer extends Player {
switch (hitResponse.getType()) { switch (hitResponse.getType()) {
case HIT, SUNK -> this.myTurn = false; case HIT, SUNK -> this.myTurn = false;
case MISS -> this.myTurn = true; case MISS -> this.myTurn = true;
case VICTORY -> GameController.getMainFrame().showPanelLose("LoseScreen", this); case VICTORY -> this.lose();
} }
GameController.getMainFrame().refreshGameBoard(); GameController.getMainFrame().refreshGameBoard();
} }
@ -49,7 +49,7 @@ public class LocalPlayer extends Player {
switch (hitResponse.getType()) { switch (hitResponse.getType()) {
case HIT, SUNK -> this.myTurn = true; case HIT, SUNK -> this.myTurn = true;
case MISS -> this.myTurn = false; case MISS -> this.myTurn = false;
case VICTORY -> GameController.getMainFrame().showPanelWin("", this); case VICTORY -> this.win();
} }
GameController.getMainFrame().refreshGameBoard(); GameController.getMainFrame().refreshGameBoard();
} }

View File

@ -10,7 +10,7 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer {
* receives a message from the AsyncSocket * receives a message from the AsyncSocket
* implemented according to version 1.1.0 of https://github.com/lgc-4/ProgProjekt-Netzwerkstandard * implemented according to version 1.1.0 of https://github.com/lgc-4/ProgProjekt-Netzwerkstandard
* @param message the message from the socket * @param message the message from the socket
* @author Peer Ole Wachtel, Luca Conte * @author Peer Ole Wachtel, Luca Conte, Florian Hantzschel
*/ */
@Override @Override
public void receive(String message) { public void receive(String message) {
@ -83,6 +83,10 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer {
//TODO CHAT //TODO CHAT
break; break;
case "WITHDRAW":
this.withdraw();
break;
default: default:
//nichts passier da Paket ungültig //nichts passier da Paket ungültig
break; break;
@ -153,4 +157,10 @@ public class OnlinePlayer_1_1_0 extends OnlinePlayer {
// SHOULD NEVER BE CALLED ON ONLINE PLAYER. ONLY ON HUMAN PLAYER // SHOULD NEVER BE CALLED ON ONLINE PLAYER. ONLY ON HUMAN PLAYER
return; return;
} }
@Override
public void receiveWithdraw() {
this.socket.send(new SocketPackage("WITHDRAW"));
super.receiveWithdraw();
}
} }

View File

@ -137,6 +137,7 @@ public abstract class Player {
* and players * and players
* *
* This method should be called at the end of a game * This method should be called at the end of a game
* This method should be called at the end of a game
* *
* @author Luca Conte * @author Luca Conte
*/ */
@ -146,4 +147,20 @@ public abstract class Player {
this.board = null; this.board = null;
this.enemy = null; this.enemy = null;
} }
public void win() {
GameController.getMainFrame().showPanelWin("", this);
}
public void lose() {
GameController.getMainFrame().showPanelLose("", this);
}
public void withdraw() {
this.enemy.receiveWithdraw();
this.lose();
}
public void receiveWithdraw(){
this.win();
}
} }

View File

@ -1,12 +1,13 @@
/** /**
* Diese Klasse implementiert den Einfachsten Ki Spieler. * Diese Klasse implementiert den Einfachsten Ki Spieler.
* @author Florian und Florian * @author Florian Alexy und Florian Hantzschel
* */ * */
public class SpecificAiPlayerEasy extends AiPlayer{ public class SpecificAiPlayerEasy extends AiPlayer{
/** /**
* Bein einfachen Ki Spieler wird nur der AiPlayer initialisiert und der Name gesetzt, * Bein einfachen Ki Spieler wird nur der AiPlayer initialisiert und der Name gesetzt,
* da in der Eltern-Klasse AiPlayer eine default implementierung für alle Methoden existieren. * da in der Eltern-Klasse AiPlayer eine default implementierung für alle Methoden existieren.
* @author Florian Alexy und Florian Hantzschel
*/ */
public SpecificAiPlayerEasy() { public SpecificAiPlayerEasy() {
super(); super();

View File

@ -1,16 +1,16 @@
/** /**
* Diese Klasse implementiert den Harten Ki Spieler. * Diese Klasse implementiert den Harten Ki Spieler.
* @author Florian und Florian * @author Florian Alexy und Florian Hantzschel
* */ * */
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random; // import java.util.Random; wird nicht mehr verwendet
public class SpecificAiPlayerHard extends AiPlayer{ public class SpecificAiPlayerHard extends AiPlayer{
private int gridSize; private int gridSize;
private boolean[][] shotsFired; private boolean[][] shotsFired;
private final ArrayList<Point> hitQueue; private final ArrayList<Point> hitQueue;
private final Random random; //private final Random random; wird nicht mehr verwendet
private int nextChessRow; private int nextChessRow;
private int nextChessCol; private int nextChessCol;
@ -24,7 +24,11 @@ public class SpecificAiPlayerHard extends AiPlayer{
private Point firstHit; // Speichert den ersten Treffer zur Bestimmung der Orientierung private Point firstHit; // Speichert den ersten Treffer zur Bestimmung der Orientierung
/**
* Eltern-Klasse wird initialisiert und alle lokalen variablen,
* die gesetzt werden können, werden initialisiert.
* @author Florian Alexy und Florian Hantzschel
*/
public SpecificAiPlayerHard() { public SpecificAiPlayerHard() {
super(); super();
this.setName("AI Player Hard"); this.setName("AI Player Hard");
@ -32,19 +36,28 @@ public class SpecificAiPlayerHard extends AiPlayer{
this.shotsFired = new boolean[gridSize][gridSize];*/ this.shotsFired = new boolean[gridSize][gridSize];*/
this.gridSize = 0; this.gridSize = 0;
this.hitQueue = new ArrayList<>(); this.hitQueue = new ArrayList<>();
this.random = new Random(); //this.random = new Random(); wird nicht mehr verwendet
this.nextChessRow = 0; this.nextChessRow = 0;
this.nextChessCol = 0; this.nextChessCol = 0;
this.orientierung = Orientierung.UNBEKANNT; this.orientierung = Orientierung.UNBEKANNT;
this.firstHit = null; this.firstHit = null;
} }
// Checks if a position has already been shot at /**
* Prüft, ob auf den punkt schonmal geschossen wurde.
* @param p zu prüfender Punkt
* @return boolean
* @author Florian Alexy und Florian Hantzschel
*/
public boolean alreadyShot(Point p) { public boolean alreadyShot(Point p) {
return shotsFired[p.getX()][p.getY()]; return shotsFired[p.getX()][p.getY()];
} }
// Generates the next move for the AI /**
* Bestimmt den nächsten punkt, der beschossen werden soll.
* @return Position
* @author Florian Alexy und Florian Hantzschel
*/
public Point getNextMove() { public Point getNextMove() {
if(gridSize == 0) { if(gridSize == 0) {
this.gridSize = super.board.getSize(); this.gridSize = super.board.getSize();
@ -73,6 +86,12 @@ public class SpecificAiPlayerHard extends AiPlayer{
return new Point(row, col); return new Point(row, col);
} }
/**
* Nachdem receiveShoot beim gegner den schuss verarbeitet hat,
* wird diese Methode mit der antwort aufgerufen.
* @param hitResponse the hitresponse
* @author Florian Alexy und Florian Hantzschel
*/
@Override @Override
public synchronized void receiveHit(HitResponse hitResponse) { public synchronized void receiveHit(HitResponse hitResponse) {
super.receiveHit(hitResponse); super.receiveHit(hitResponse);
@ -113,6 +132,7 @@ public class SpecificAiPlayerHard extends AiPlayer{
/** /**
* Entfernt aus der hitQueue alle Punkte, die nicht der erkannten Orientierung entsprechen. * Entfernt aus der hitQueue alle Punkte, die nicht der erkannten Orientierung entsprechen.
* @author Florian Alexy und Florian Hantzschel
*/ */
private void cleanUpHitQueue() { private void cleanUpHitQueue() {
if (firstHit == null || this.orientierung == Orientierung.UNBEKANNT) { if (firstHit == null || this.orientierung == Orientierung.UNBEKANNT) {
@ -136,9 +156,10 @@ public class SpecificAiPlayerHard extends AiPlayer{
} }
/** /**
* Fügt benachbarte Felder in der **erkannten Orientierung** hinzu. * Fügt benachbarte Felder in der erkannten Orientierung hinzu.
* - Ist die Orientierung HORIZONTAL, so werden nur links/rechts hinzugefügt. * Ist die Orientierung HORIZONTAL, so werden nur links/rechts hinzugefügt.
* - Ist sie VERTICAL, so werden nur oben/unten hinzugefügt. * Ist sie VERTICAL, so werden nur oben/unten hinzugefügt.
* @author Florian Alexy und Florian Hantzschel
*/ */
private void addPointsByOrientation(Point point) { private void addPointsByOrientation(Point point) {
if (this.orientierung == Orientierung.UNBEKANNT) { if (this.orientierung == Orientierung.UNBEKANNT) {
@ -178,6 +199,7 @@ public class SpecificAiPlayerHard extends AiPlayer{
/** /**
* Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten. * Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten.
* @param point * @param point
* @author Florian Alexy und Florian Hantzschel
*/ */
private void addAdjacentPoints(Point point) { private void addAdjacentPoints(Point point) {
int x = point.getX(); int x = point.getX();
@ -201,6 +223,7 @@ public class SpecificAiPlayerHard extends AiPlayer{
* Die Methode gibt zurück, ob eine Position auf dem Board ist. (Boolean) * Die Methode gibt zurück, ob eine Position auf dem Board ist. (Boolean)
* @param point Punkt der geprüft werden soll * @param point Punkt der geprüft werden soll
* @return Ist auf dem Board oder nicht. * @return Ist auf dem Board oder nicht.
* @author Florian Alexy und Florian Hantzschel
*/ */
private boolean isValidPoint(Point point) { private boolean isValidPoint(Point point) {
return point.getX() >= 0 && point.getX() < gridSize && return point.getX() >= 0 && point.getX() < gridSize &&
@ -208,13 +231,17 @@ public class SpecificAiPlayerHard extends AiPlayer{
} }
/** /**
* Ki Methode um zu schießen. * Ki Methode um zu schießen.
* @author Florian Alexy und Florian Hantzschel
*/ */
@Override @Override
public void aiShoot() { public void aiShoot() {
this.enemy.receiveShoot(getNextMove()); this.enemy.receiveShoot(getNextMove());
} }
// Advances the chess pattern to the next cell /**
* Die Zeilen und spalten variable wird hier angepasst, sodass beim nächsten schuss im Muster geschossen wird.
* @author Florian Alexy und Florian Hantzschel
*/
private void advanceChessPattern() { private void advanceChessPattern() {
nextChessCol += 2; nextChessCol += 2;
if (nextChessCol >= gridSize) { if (nextChessCol >= gridSize) {

View File

@ -1,6 +1,6 @@
/** /**
* Diese Klasse implementiert den Medium Ki Spieler. * Diese Klasse implementiert den Medium Ki Spieler.
* @author Florian und Florian * @author Florian Alexy und Florian Hantzschel
* */ * */
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -11,6 +11,10 @@ public class SpecificAiPlayerMedium extends AiPlayer{
*/ */
private List<Point> hitsQueue = new ArrayList<>(); private List<Point> hitsQueue = new ArrayList<>();
/**
* Eltern-Klasse wird initialisiert und der Name wird gesetzt.
* @author Florian Alexy und Florian Hantzschel
*/
public SpecificAiPlayerMedium() { public SpecificAiPlayerMedium() {
super(); super();
this.setName("AI Player Medium"); this.setName("AI Player Medium");
@ -18,6 +22,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{
/** /**
* Ki Methode um zu schießen. * Ki Methode um zu schießen.
* @author Florian Alexy und Florian Hantzschel
*/ */
@Override @Override
public void aiShoot() { public void aiShoot() {
@ -26,6 +31,12 @@ public class SpecificAiPlayerMedium extends AiPlayer{
enemy.receiveShoot(nextShot); enemy.receiveShoot(nextShot);
} }
/**
* Nachdem receiveShoot beim gegner den schuss verarbeitet hat,
* wird diese Methode mit der antwort aufgerufen.
* @param hitResponse the hitresponse
* @author Florian Alexy und Florian Hantzschel
*/
@Override @Override
public synchronized void receiveHit(HitResponse hitResponse) { public synchronized void receiveHit(HitResponse hitResponse) {
super.receiveHit(hitResponse); super.receiveHit(hitResponse);
@ -38,6 +49,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{
/** /**
* Die Methode bestimmt welche Position als nächstes beschossen werden soll. * Die Methode bestimmt welche Position als nächstes beschossen werden soll.
* @return * @return
* @author Florian Alexy und Florian Hantzschel
*/ */
public Point ComputeNextShot() { public Point ComputeNextShot() {
Point nextShot; Point nextShot;
@ -61,6 +73,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{
/** /**
* Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten. * Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten.
* @param point * @param point
* @author Florian Alexy und Florian Hantzschel
*/ */
private void addAdjacentPoints(Point point) { private void addAdjacentPoints(Point point) {
int x = point.getX(); int x = point.getX();
@ -85,6 +98,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{
* Diese Methode gibt zurück, ob eine Position schon beschossen wurde. (Boolean) * Diese Methode gibt zurück, ob eine Position schon beschossen wurde. (Boolean)
* @param p Punkt der geprüft werden soll * @param p Punkt der geprüft werden soll
* @return wurde schon beschossen oder nicht. * @return wurde schon beschossen oder nicht.
* @author Florian Alexy und Florian Hantzschel
*/ */
private boolean alreadyShot(Point p) { private boolean alreadyShot(Point p) {
@ -96,6 +110,7 @@ public class SpecificAiPlayerMedium extends AiPlayer{
* Die Methode gibt zurück, ob eine Position auf dem Board ist. (Boolean) * Die Methode gibt zurück, ob eine Position auf dem Board ist. (Boolean)
* @param point Punkt der geprüft werden soll * @param point Punkt der geprüft werden soll
* @return Ist auf dem Board oder nicht. * @return Ist auf dem Board oder nicht.
* @author Florian Alexy und Florian Hantzschel
*/ */
private boolean isValidPoint(Point point) { private boolean isValidPoint(Point point) {
return point.getX() >= 0 && point.getX() < board.getSize() && return point.getX() >= 0 && point.getX() < board.getSize() &&