import java.util.*;
class PC_Player2 extends Player {
private int zuege;
private int lastx;
private int lasty;
private boolean horizontal = false;
private boolean vertical = false;
public PC_Player2(Spielfeld sp,int zuege) {
super(sp);
if(zuege > 0) {
this.zuege = zuege;
init(SYSTEM_CONSTRUCT);
}
}
public void init(int mode) {
if(mode == USER_SET) {
/*
* In diesem Modus legt der User die Koordinaten der Schiffe des PC's fest.
* Eigentlich lediglich zu Testzwecken der ganzen Klassen geeignet.
*/
sp.setWert(8,7,true);
sp.setWert(2,1,true);
sp.setWert(2,5,true);
sp.setWert(3,5,true);
sp.setWert(6,2,true);
sp.setWert(6,3,true);
sp.setWert(6,4,true);
sp.setWert(2,8,true);
sp.setWert(3,8,true);
sp.setWert(4,8,true);
sp.setWert(5,8,true);
} else if(mode == RANDOM) {
/*
* In diesem Modus generiert der PC die Koordinaten seiner "Schiffe" zufällig
*/
Random rgen = new Random();
for(int i = 0;i < zuege;) {
lastx = rgen.nextInt(sp.getBreite());
lasty = rgen.nextInt(sp.getHoehe());
if(!sp.getWert(lastx,lasty)) {
sp.setWert(lastx,lasty,true);
i++;
}
}
} else if(mode == SYSTEM_CONSTRUCT) {
/*
* In diesem Modus soll der PC das Spielfeld nach einem
* best. System füllen. D.h. benachbarte Feldelemente zu einem Schiff zusammenfügen etc.
*/
Random rgen = new Random();
int cur = 0,num,neux,neuy,i = 0;
while(cur < zuege) {
i = 1;
/*
* Generiere als "Startwert" eine Koordinate. Von dieser ausgehend "bauen" wir unser
* Schiff in vertikale oder horizontale Richtung.
*/
lastx = rgen.nextInt(sp.getBreite());
lasty = rgen.nextInt(sp.getHoehe());
/* Horizontal */
if(rgen.nextInt(2) == 0) {
/*
* Ein Schiff besteht mindestens aus einer Koordinate, da wir horizontal bauen
* kann das Schiff maximal so breit sein wie das Spielfeld.
*/
num = 1 + rgen.nextInt(sp.getBreite() - 1);
System.out.println("Erzeuge "+num+" Schiffe horizontal");
neux = lastx;
neuy = lasty;
/*
* Überprüfe ob an dieser Stelle bereits eine Koordinate von einem andern
* Schiff liegt.
*/
if(!sp.getWert(neux,neuy)) {
sp.setWert(neux,neuy,true);
cur++;
}
/*
* Es soll ein Schiff mit 'num' Koordinaten entstehen
*/
while(i < num) {
if(cur < zuege) {
/*
* Wenn horizontal = true, dann sind wir rechts an die Grenzen des Spielfelds
* gestossen. Daraus folgt das wir die Koordinate dekrementieren müssen, so
* dass das Schiff "nach links wächst".
*/
if(horizontal)
neux--;
else
neux++;
/*
* Da die Koordinaten verändert wurden, müssen wir erneut überprüfen ob
* wir damit noch innerhalb des erlaubten Bereichs liegen.
*/
if(sp.pruefeIndizes(neux,neuy) != -1) {
/*
* Nur dann Anzahl der gesamten "Züge" erhöhen wenn an der
* entsprechenden Stelle noch keine Koordinate eines anderen
* Schiffs liegt.
*/
if(!sp.getWert(neux,neuy)) {
sp.setWert(neux,neuy,true);
cur++;
}
i++;
}
else {
neux = lastx;
horizontal = true;
}
} else {
break;
}
}
} else {
/* Vertikal */
num = 1 + rgen.nextInt(sp.getHoehe() - 1);
System.out.println("Erzeuge "+num+" Schiffe vertikal");
neux = lastx;
neuy = lasty;
/*
* Überprüfe ob an dieser Stelle bereits eine Koordinate von einem andern
* Schiff liegt.
*/
if(!sp.getWert(neux,neuy)) {
sp.setWert(neux,neuy,true);
cur++;
}
while(i < num) {
if(cur < zuege) {
/*
* Wenn vertical = true, dann sind wir oben an die Grenzen des Spielfelds
* gestossen. Daraus folgt das wir die Koordinate dekrementieren müssen, so
* dass das Schiff "nach unten wächst".
*/
if(vertical)
neuy--;
else
neuy++;
/*
* Da die Koordinaten verändert wurden, müssen wir erneut überprüfen ob
* wir damit noch innerhalb des erlaubten Bereichs liegen.
*/
if(sp.pruefeIndizes(neux,neuy) != -1) {
/*
* Nur dann Anzahl der gesamten "Züge" erhöhen wenn an der
* entsprechenden Stelle noch keine Koordinate eines anderen
* Schiffs liegt.
*/
if(!sp.getWert(neux,neuy)) {
sp.setWert(neux,neuy,true);
cur++;
}
i++;
} else {
neuy = lasty;
vertical = true;
}
} else {
break;
}
}
}
vertical = false;
horizontal = false;
}
}
}
}