AiPlayer Kommentare hinzugefügt
Bitte nicht schlagen. Kommentare sind drin. Kommentiert ja, High Quality Kommentare nein (._.) Bitte nicht schlagen.
This commit is contained in:
parent
fdd2e6d2f1
commit
9d62e74877
|
@ -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,19 +11,34 @@ 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
|
||||||
int posy = random.nextInt(super.board.getSize()); //
|
int posy = random.nextInt(super.board.getSize()); //
|
||||||
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,30 +46,38 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void receiveShoot(Point point) {
|
public synchronized void receiveShoot(Point point) {
|
||||||
super.receiveShoot(point);
|
super.receiveShoot(point);
|
||||||
|
@ -59,15 +87,22 @@ public abstract class AiPlayer extends LocalPlayer implements Runnable {
|
||||||
this.shootThreads.add(t);
|
this.shootThreads.add(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
t.start();
|
t.start();
|
||||||
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();
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue