From 9d62e74877ff97c1b87275c653d667522b92534f Mon Sep 17 00:00:00 2001 From: eyFlorian <45431375+eyFlorian@users.noreply.github.com> Date: Sat, 21 Dec 2024 21:11:21 +0100 Subject: [PATCH] =?UTF-8?q?AiPlayer=20Kommentare=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bitte nicht schlagen. Kommentare sind drin. Kommentiert ja, High Quality Kommentare nein (._.) Bitte nicht schlagen. --- src/AiPlayer.java | 51 +++++++++++++++++++++++++++------ src/SpecificAiPlayerEasy.java | 9 +++++- src/SpecificAiPlayerHard.java | 19 ++++++++++-- src/SpecificAiPlayerMedium.java | 29 ++++++++++++++++++- 4 files changed, 95 insertions(+), 13 deletions(-) diff --git a/src/AiPlayer.java b/src/AiPlayer.java index 724233c..47f3109 100644 --- a/src/AiPlayer.java +++ b/src/AiPlayer.java @@ -1,3 +1,8 @@ +/** + * Die Klasse AiPlayer ist die Basis für alle Ki Spieler und jede Spezifische Ki erweitert diese Klasse. + * @author Florian und Florian + * */ + import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -6,19 +11,34 @@ import java.util.Random; public abstract class AiPlayer extends LocalPlayer implements Runnable { + /** + * Liste aller erstellten ShootThreads + */ List shootThreads; + /** + * Konstruktor + */ public AiPlayer() { this.setName("AI Player"); this.shootThreads = new ArrayList<>(); } + + /** + * Gibt einen zufälligen Punkt im Spielfeld zurück. + * @return Ein zufälliger Punkt + */ public Point RandomPoint() { Random random = new Random(); // Pseudo Random für zufallszahlen int posx = random.nextInt(super.board.getSize()); // Generiert 0 - 13 int posy = random.nextInt(super.board.getSize()); // return new Point(posx,posy); } - + + /** + * Initialisiert das Board. + * @param size größe des Boards + */ @Override public void createBoard(int size) { super.createBoard(size); @@ -26,30 +46,38 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable { this.ready(); } + /** + * Ki Methode zum zufälligen Setzten der Schiffe + */ public void aiSetShips() { for(int i = 0; i < super.board.getShips().size(); i++) { // Interiert durch alle Shiffe //TODO: set horizontal while(!super.board.getShips().get(i).setPosition(RandomPoint(), true, super.board.getShips(), super.board.getSize())) {} - } // Versucht das Aktuelle Shiff zu setzten und wiederholt solange bis es funktioniert + } // Versucht das aktuelle Schiff zu setzten und wiederholt solange bis es funktioniert return; } - + /** + * Ki Methode zum zufälligen Schießen auf das gegnerische Board. + */ public void aiShoot() { this.enemy.receiveShoot(RandomPoint()); return; } + @Override public synchronized void receiveHit(HitResponse hitResponse) { + // Eltern-Klasse LocalPlayer updatet myTurn super.receiveHit(hitResponse); if (this.myTurn) { + // Neuer Schuss wird erstellt und gestartet. Thread t = new Thread(this); t.start(); this.shootThreads.add(t); } } - + @Override public synchronized void receiveShoot(Point point) { super.receiveShoot(point); @@ -59,15 +87,22 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable { this.shootThreads.add(t); } } - - + + /** + * Wird aufgerufen, wenn in determineCoinToss festgestellt wurde das die Ki anfängt. + * Erster Schuss wird gestartet. + */ @Override public void beginTurn() { Thread t = new Thread(this); t.start(); this.shootThreads.add(t); } - + + /** + * Die Methode wird immer aufgerufen, wenn ein Schuss abgefeuert werden soll. + * Es wird erst ein Schuss abgefeuert, wenn der vorherige schuss abgeschlossen wurde. + */ public void run() { Iterator i = this.shootThreads.iterator(); while(i.hasNext()) { @@ -85,7 +120,7 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable { } try { - Thread.sleep(300); + Thread.sleep(250); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/src/SpecificAiPlayerEasy.java b/src/SpecificAiPlayerEasy.java index 4825ec5..a499e81 100644 --- a/src/SpecificAiPlayerEasy.java +++ b/src/SpecificAiPlayerEasy.java @@ -1,6 +1,13 @@ - +/** + * Diese Klasse implementiert den Einfachsten Ki Spieler. + * @author Florian und Florian + * */ public class SpecificAiPlayerEasy extends AiPlayer{ + /** + * 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. + */ public SpecificAiPlayerEasy() { super(); this.setName("AI Player Easy"); diff --git a/src/SpecificAiPlayerHard.java b/src/SpecificAiPlayerHard.java index 079279f..a9a1345 100644 --- a/src/SpecificAiPlayerHard.java +++ b/src/SpecificAiPlayerHard.java @@ -1,3 +1,7 @@ +/** + * Diese Klasse implementiert den Harten Ki Spieler. + * @author Florian und Florian + * */ import java.util.ArrayList; import java.util.Random; @@ -64,7 +68,10 @@ public class SpecificAiPlayerHard extends AiPlayer{ addAdjacentPoints(hitResponse.getPoint()); } } - + /** + * Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten. + * @param point + */ private void addAdjacentPoints(Point point) { int x = point.getX(); int y = point.getY(); @@ -83,12 +90,18 @@ public class SpecificAiPlayerHard extends AiPlayer{ } } } - + /** + * Die Methode gibt zurück, ob eine Position auf dem Board ist. (Boolean) + * @param point Punkt der geprüft werden soll + * @return Ist auf dem Board oder nicht. + */ private boolean isValidPoint(Point point) { return point.getX() >= 0 && point.getX() < gridSize && point.getY() >= 0 && point.getY() < gridSize; } - + /** + * Ki Methode um zu schießen. + */ @Override public void aiShoot() { this.enemy.receiveShoot(getNextMove()); diff --git a/src/SpecificAiPlayerMedium.java b/src/SpecificAiPlayerMedium.java index 0562b3a..a27390a 100644 --- a/src/SpecificAiPlayerMedium.java +++ b/src/SpecificAiPlayerMedium.java @@ -1,8 +1,14 @@ +/** + * Diese Klasse implementiert den Medium Ki Spieler. + * @author Florian und Florian + * */ import java.util.ArrayList; import java.util.List; public class SpecificAiPlayerMedium extends AiPlayer{ - + /** + * Liste an Punkten die beschossen werden sollen. (Mögliche weitere Segmente vom schiff) + */ private List hitsQueue = new ArrayList<>(); public SpecificAiPlayerMedium() { @@ -10,6 +16,9 @@ public class SpecificAiPlayerMedium extends AiPlayer{ this.setName("AI Player Medium"); } + /** + * Ki Methode um zu schießen. + */ @Override public void aiShoot() { Point nextShot = ComputeNextShot(); @@ -26,6 +35,10 @@ public class SpecificAiPlayerMedium extends AiPlayer{ } } + /** + * Die Methode bestimmt welche Position als nächstes beschossen werden soll. + * @return + */ public Point ComputeNextShot() { Point nextShot; @@ -45,6 +58,10 @@ public class SpecificAiPlayerMedium extends AiPlayer{ return nextShot; } + /** + * Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten. + * @param point + */ private void addAdjacentPoints(Point point) { int x = point.getX(); int y = point.getY(); @@ -64,12 +81,22 @@ public class SpecificAiPlayerMedium extends AiPlayer{ } } + /** + * Diese Methode gibt zurück, ob eine Position schon beschossen wurde. (Boolean) + * @param p Punkt der geprüft werden soll + * @return wurde schon beschossen oder nicht. + */ private boolean alreadyShot(Point p) { return this.enemy.board.getHitResponseOnPoint(p) != null; } + /** + * Die Methode gibt zurück, ob eine Position auf dem Board ist. (Boolean) + * @param point Punkt der geprüft werden soll + * @return Ist auf dem Board oder nicht. + */ private boolean isValidPoint(Point point) { return point.getX() >= 0 && point.getX() < board.getSize() && point.getY() >= 0 && point.getY() < board.getSize();