public class Wanderer {
private static final char FELD_FREI = 'o';
private static final char WANDERER_A = 'A';
private static final char WANDERER_B = 'B';
private static final char TREFFEN = 'T';
private char feld[][] = null;
private int n = 0;
private Position posA = null;
private Position posB = null;
private boolean fertig = false;
private boolean treffen = false;
private int countA = 0;
private int countB = 0;
/**
* @param args
*/
public static void main(String[] args) {
Wanderer w = new Wanderer(4);
System.out.println("Start:");
// w.laufe();
w.treffenTestLauf();
}
/**
* Erzeugt eine neue Instanz.
*
* @param n
* Matrixgröße.
*/
public Wanderer(int n) {
if (n < 2) {
throw new IllegalArgumentException("n < 2");
}
// Positionsdaten
posA = new Position();
posB = new Position();
this.n = n;
feld = new char[n][n];
// Feld komplett als frei markieren
for (int i = 0; i < feld.length; i++) {
for (int j = 0; j < feld[i].length; j++) {
feld[i][j] = FELD_FREI;
}
}
resetAll();
}
/**
* Zeigt das Muster an.
*/
private void zeigeMuster() {
for (int i = 0; i < feld.length; i++) {
for (int j = 0; j < feld[i].length; j++) {
System.out.print(feld[i][j] + " ");
}
System.out.println();
}
System.out.println();
}
/**
* Laesst die Wanderer wandern.
*/
public void laufe() {
while (!fertig) {
zeigeMuster();
zug();
}
zeigeMuster();
System.out.println("Wanderer A brauchte " + countA + " Schritte.");
System.out.println("Wanderer B brauchte " + countB + " Schritte.");
}
/**
* Alles zuruecksetzen.
*/
private void resetAll() {
// Alte Positionen freigeben
feld[posA.y][posA.x] = FELD_FREI;
feld[posB.y][posB.x] = FELD_FREI;
// Startpunkt Wanderer A
feld[n - 1][0] = WANDERER_A;
posA.x = 0;
posA.y = n - 1;
// Startpunkt Wanderer B
feld[0][n - 1] = WANDERER_B;
posB.x = n - 1;
posB.y = 0;
treffen = false;
fertig = false;
}
public void treffenTestLauf() {
/*
* Das funktioniert irgendwie nicht richtig. Musste mal nachsehn...
*/
int treffZahl = 0;
for (int i = 0; i < 1000000; i++) {
resetAll();
while (!fertig) {
zug();
}
if (treffen) {
treffZahl++;
}
}
System.out.println("Die Wanderer haben sich " + treffZahl
+ "-mal getroffen.");
}
/**
* Berechnet einen neuen Zug und führt ihn ggf. aus.
*/
private void zug() {
// Zufallsvariable (pseudo...)
double rnd = 0.0;
if (posA.x < n - 1 && posA.y > 0) {
// Zug Wanderer A
rnd = Math.random();
// Alte Position freigeben
feld[posA.y][posA.x] = FELD_FREI;
if (rnd < 0.5) {
// nach rechts
posA.x++;
} else {
// nach oben
posA.y--;
}
// Schrittzähler Wanderer A erhöhen
countA++;
if (feld[posA.y][posA.x] != FELD_FREI) {
// Wanderer haben sich getroffen.
fertig = true;
treffen = true;
feld[posA.y][posA.x] = TREFFEN;
return;
} else {
// Neue Position setzen
feld[posA.y][posA.x] = WANDERER_A;
}
} else {
fertig = true;
}
/*
* Dieser Teil kommt erst ab Aufgabe 4 zum Einsatz! Für die vorherigen
* Aufgaben, bitte den kompletten Block unter diesem Kommentar
* auskommentieren.
*/
if (posB.x > 0 && posB.y < n - 1) {
// Zug Wanderer B
rnd = Math.random();
// Alte Position freigeben
feld[posB.y][posB.x] = FELD_FREI;
if (rnd < 0.5) {
// nach links
posB.x--;
} else {
// nach unten
posB.y++;
}
// Schrittzähler Wanderer B erhöhen
countB++;
if (feld[posB.y][posB.x] != FELD_FREI) {
// Wanderer haben sich getroffen.
fertig = true;
treffen = true;
feld[posB.y][posB.x] = TREFFEN;
return;
} else {
// Neue Position setzen
feld[posB.y][posB.x] = WANDERER_B;
}
} else {
fertig = true;
}
}
}