AiPlayer Kommentare hinzugefügt #21

Merged
flo merged 2 commits from FH_Fixes into main 2024-12-22 22:36:39 +00:00
4 changed files with 95 additions and 13 deletions
Showing only changes of commit 9d62e74877 - Show all commits

View File

@ -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.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -6,12 +11,23 @@ import java.util.Random;
public abstract class AiPlayer extends LocalPlayer implements Runnable { public abstract class AiPlayer extends LocalPlayer implements Runnable {
/**
* Liste aller erstellten ShootThreads
*/
List<Thread> shootThreads; List<Thread> shootThreads;
/**
* Konstruktor
*/
public AiPlayer() { public AiPlayer() {
this.setName("AI Player"); this.setName("AI Player");
this.shootThreads = new ArrayList<>(); this.shootThreads = new ArrayList<>();
} }
/**
* Gibt einen zufälligen Punkt im Spielfeld zurück.
* @return Ein zufälliger Punkt
*/
public Point RandomPoint() { public Point RandomPoint() {
Random random = new Random(); // Pseudo Random für zufallszahlen Random random = new Random(); // Pseudo Random für zufallszahlen
int posx = random.nextInt(super.board.getSize()); // Generiert 0 - 13 int posx = random.nextInt(super.board.getSize()); // Generiert 0 - 13
@ -19,6 +35,10 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable {
return new Point(posx,posy); return new Point(posx,posy);
} }
/**
* Initialisiert das Board.
* @param size größe des Boards
*/
@Override @Override
public void createBoard(int size) { public void createBoard(int size) {
super.createBoard(size); super.createBoard(size);
@ -26,23 +46,31 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable {
this.ready(); this.ready();
} }
/**
* Ki Methode zum zufälligen Setzten der Schiffe
*/
public void aiSetShips() { public void aiSetShips() {
for(int i = 0; i < super.board.getShips().size(); i++) { // Interiert durch alle Shiffe for(int i = 0; i < super.board.getShips().size(); i++) { // Interiert durch alle Shiffe
//TODO: set horizontal //TODO: set horizontal
while(!super.board.getShips().get(i).setPosition(RandomPoint(), true, super.board.getShips(), super.board.getSize())) {} 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; return;
} }
/**
* Ki Methode zum zufälligen Schießen auf das gegnerische Board.
*/
public void aiShoot() { public void aiShoot() {
this.enemy.receiveShoot(RandomPoint()); this.enemy.receiveShoot(RandomPoint());
return; return;
} }
@Override @Override
public synchronized void receiveHit(HitResponse hitResponse) { public synchronized void receiveHit(HitResponse hitResponse) {
// Eltern-Klasse LocalPlayer updatet myTurn
super.receiveHit(hitResponse); super.receiveHit(hitResponse);
if (this.myTurn) { if (this.myTurn) {
// Neuer Schuss wird erstellt und gestartet.
Thread t = new Thread(this); Thread t = new Thread(this);
t.start(); t.start();
this.shootThreads.add(t); this.shootThreads.add(t);
@ -60,7 +88,10 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable {
} }
} }
/**
* Wird aufgerufen, wenn in determineCoinToss festgestellt wurde das die Ki anfängt.
* Erster Schuss wird gestartet.
*/
@Override @Override
public void beginTurn() { public void beginTurn() {
Thread t = new Thread(this); Thread t = new Thread(this);
@ -68,6 +99,10 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable {
this.shootThreads.add(t); 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() { public void run() {
Iterator<Thread> i = this.shootThreads.iterator(); Iterator<Thread> i = this.shootThreads.iterator();
while(i.hasNext()) { while(i.hasNext()) {
@ -85,7 +120,7 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable {
} }
try { try {
Thread.sleep(300); Thread.sleep(250);
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();

View File

@ -1,6 +1,13 @@
/**
* Diese Klasse implementiert den Einfachsten Ki Spieler.
* @author Florian und Florian
* */
public class SpecificAiPlayerEasy extends AiPlayer{ 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() { public SpecificAiPlayerEasy() {
super(); super();
this.setName("AI Player Easy"); this.setName("AI Player Easy");

View File

@ -1,3 +1,7 @@
/**
* Diese Klasse implementiert den Harten Ki Spieler.
* @author Florian und Florian
* */
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random; import java.util.Random;
@ -64,7 +68,10 @@ public class SpecificAiPlayerHard extends AiPlayer{
addAdjacentPoints(hitResponse.getPoint()); addAdjacentPoints(hitResponse.getPoint());
} }
} }
/**
* Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten.
* @param point
*/
private void addAdjacentPoints(Point point) { private void addAdjacentPoints(Point point) {
int x = point.getX(); int x = point.getX();
int y = point.getY(); 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) { private boolean isValidPoint(Point point) {
return point.getX() >= 0 && point.getX() < gridSize && return point.getX() >= 0 && point.getX() < gridSize &&
point.getY() >= 0 && point.getY() < gridSize; point.getY() >= 0 && point.getY() < gridSize;
} }
/**
* Ki Methode um zu schießen.
*/
@Override @Override
public void aiShoot() { public void aiShoot() {
this.enemy.receiveShoot(getNextMove()); this.enemy.receiveShoot(getNextMove());

View File

@ -1,8 +1,14 @@
/**
* Diese Klasse implementiert den Medium Ki Spieler.
* @author Florian und Florian
* */
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class SpecificAiPlayerMedium extends AiPlayer{ public class SpecificAiPlayerMedium extends AiPlayer{
/**
* Liste an Punkten die beschossen werden sollen. (Mögliche weitere Segmente vom schiff)
*/
private List<Point> hitsQueue = new ArrayList<>(); private List<Point> hitsQueue = new ArrayList<>();
public SpecificAiPlayerMedium() { public SpecificAiPlayerMedium() {
@ -10,6 +16,9 @@ public class SpecificAiPlayerMedium extends AiPlayer{
this.setName("AI Player Medium"); this.setName("AI Player Medium");
} }
/**
* Ki Methode um zu schießen.
*/
@Override @Override
public void aiShoot() { public void aiShoot() {
Point nextShot = ComputeNextShot(); 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() { public Point ComputeNextShot() {
Point nextShot; Point nextShot;
@ -45,6 +58,10 @@ public class SpecificAiPlayerMedium extends AiPlayer{
return nextShot; return nextShot;
} }
/**
* Diese Methode erweitert die hitsQueue um die umliegenden Punkte die Schiffe seien könnten.
* @param point
*/
private void addAdjacentPoints(Point point) { private void addAdjacentPoints(Point point) {
int x = point.getX(); int x = point.getX();
int y = point.getY(); 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) { private boolean alreadyShot(Point p) {
return this.enemy.board.getHitResponseOnPoint(p) != null; 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) { private boolean isValidPoint(Point point) {
return point.getX() >= 0 && point.getX() < board.getSize() && return point.getX() >= 0 && point.getX() < board.getSize() &&
point.getY() >= 0 && point.getY() < board.getSize(); point.getY() >= 0 && point.getY() < board.getSize();