BotHard und miniMax sind so gut wie fertig, fehlt nur noch die Bewertung der Züge

main
Nico Piehl 2022-12-17 22:04:21 +01:00
parent b13e58d0d3
commit 75bc558ff3
3 changed files with 297 additions and 508 deletions

View File

@ -1,6 +1,5 @@
package domain; package domain;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
public class BotHardFuchs extends Bot { public class BotHardFuchs extends Bot {
@ -14,15 +13,27 @@ public class BotHardFuchs extends Bot {
char[][] spielbrettArray = spiel.getSpielbrettArray(); char[][] spielbrettArray = spiel.getSpielbrettArray();
char[][] kopieSpielbrett = Arrays.stream(spielbrettArray).map(char[]::clone).toArray(char[][]::new); char[][] kopieSpielbrett = Arrays.stream(spielbrettArray).map(char[]::clone).toArray(char[][]::new);
ArrayList<String> alleZüge = new ArrayList<>(); // ArrayList<String> alleZüge = new ArrayList<>();
alleZüge = spiel.alleZügeFuchs(kopieSpielbrett, spiel); // long start = System.currentTimeMillis();
for (String züge : alleZüge) { // alleZüge = spiel.alleZügeFuchs(kopieSpielbrett, spiel);
System.out.println(züge); // for (String züge : alleZüge) {
} // System.out.println(züge);
// }
// long end = System.currentTimeMillis();
// System.out.println("--------------------------------------------------------");
// System.out.println(end - start);
// System.out.println("--------------------------------------------------------");
int bewertung = spiel.miniMax(kopieSpielbrett, null, 1, false, spiel); long start = System.currentTimeMillis();
int bewertung = spiel.miniMax(kopieSpielbrett, null, 5, false, spiel);
long end = System.currentTimeMillis();
System.out.println("--------------------------------------------------------");
System.out.println(end - start);
System.out.println("--------------------------------------------------------");
System.out.println();
System.out.println(bewertung);
System.out.println(); System.out.println();
System.out.println("HIER IST ENDE FÜR BOTHARDFUCHS! -----------------------------------------------------------------"); System.out.println("HIER IST ENDE FÜR BOTHARDFUCHS! -----------------------------------------------------------------");
System.out.println(); System.out.println();

View File

@ -1,6 +1,5 @@
package domain; package domain;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
public class BotHardHenne extends Bot { public class BotHardHenne extends Bot {
@ -14,15 +13,27 @@ public class BotHardHenne extends Bot {
char[][] spielbrettArray = spiel.getSpielbrettArray(); char[][] spielbrettArray = spiel.getSpielbrettArray();
char[][] kopieSpielbrett = Arrays.stream(spielbrettArray).map(char[]::clone).toArray(char[][]::new); char[][] kopieSpielbrett = Arrays.stream(spielbrettArray).map(char[]::clone).toArray(char[][]::new);
ArrayList<String> alleZüge = new ArrayList<>(); // ArrayList<String> alleZüge = new ArrayList<>();
alleZüge = spiel.alleZügeHennen(kopieSpielbrett, spiel); // long start = System.currentTimeMillis();
for (String züge : alleZüge) { // alleZüge = spiel.alleZügeHennen(kopieSpielbrett, spiel);
System.out.println(züge); // for (String züge : alleZüge) {
} // System.out.println(züge);
// }
// long end = System.currentTimeMillis();
// System.out.println("--------------------------------------------------------");
// System.out.println(end - start);
// System.out.println("--------------------------------------------------------");
int bewertung = spiel.miniMax(kopieSpielbrett, null, 1, true, spiel); long start = System.currentTimeMillis();
int bewertung = spiel.miniMax(kopieSpielbrett, null, 5, true, spiel);
long end = System.currentTimeMillis();
System.out.println("--------------------------------------------------------");
System.out.println(end - start);
System.out.println("--------------------------------------------------------");
System.out.println();
System.out.println(bewertung);
System.out.println(); System.out.println();
System.out.println("HIER IST ENDE FÜR BOTHARDHENNE! -----------------------------------------------------------------"); System.out.println("HIER IST ENDE FÜR BOTHARDHENNE! -----------------------------------------------------------------");
System.out.println(); System.out.println();

View File

@ -198,6 +198,7 @@ public class Spiel {
return zug; return zug;
} }
// überprüfen wann und ob die Hennen gewonnen haben
public boolean gewinnBedingungHennen() { public boolean gewinnBedingungHennen() {
if (spielbrettArray[0][4] == 'X' && spielbrettArray[0][5] == 'X' && spielbrettArray[0][6] == 'X' if (spielbrettArray[0][4] == 'X' && spielbrettArray[0][5] == 'X' && spielbrettArray[0][6] == 'X'
&& spielbrettArray[1][4] == 'X' && spielbrettArray[1][5] == 'X' && spielbrettArray[1][6] == 'X' && spielbrettArray[1][4] == 'X' && spielbrettArray[1][5] == 'X' && spielbrettArray[1][6] == 'X'
@ -206,6 +207,7 @@ public class Spiel {
} }
int spielfigurExistiert = 0; int spielfigurExistiert = 0;
// wenn kein Fuchs mehr existiert, dann ist automatisch gewonnen
for (int i = 0; i < spielbrettArray.length; i++) { for (int i = 0; i < spielbrettArray.length; i++) {
for (int k = 0; k < spielbrettArray[i].length; k++) { for (int k = 0; k < spielbrettArray[i].length; k++) {
if (spielbrettArray[i][k] == 'O') { if (spielbrettArray[i][k] == 'O') {
@ -222,6 +224,7 @@ public class Spiel {
return false; return false;
} }
// überprüfen wann und ob der Fuchs gewonnen hat
public boolean gewinnBedingungFuchs() { public boolean gewinnBedingungFuchs() {
int spielfigurExistiert = 0; int spielfigurExistiert = 0;
@ -238,9 +241,11 @@ public class Spiel {
return false; return false;
} }
// prüfen ob und wie viele Spielfiguren eines Typs momentan auf dem Spielbrett existieren
public ArrayList<String> spielfigurExistiert(Spielfigur spielfigur) { public ArrayList<String> spielfigurExistiert(Spielfigur spielfigur) {
ArrayList<String> spielfigurExistiert = new ArrayList<>(); ArrayList<String> spielfigurExistiert = new ArrayList<>();
// überprüfen wie viele Füchse momentan existieren, bei 2 ist Schluss, weil mehr können nicht gleichzeitig existieren
if(spielfigur instanceof Fuchs) { if(spielfigur instanceof Fuchs) {
for(int i = 0; i < spielbrettArray.length; i++ ) for(int i = 0; i < spielbrettArray.length; i++ )
{ {
@ -256,6 +261,7 @@ public class Spiel {
return spielfigurExistiert; return spielfigurExistiert;
} }
// überprüfen wie viele Hennen momentan existieren, bei 27 ist Schluss, weil mehr können nicht gleichzeitig existieren
if(spielfigur instanceof Hennen) { if(spielfigur instanceof Hennen) {
for(int i = 0; i < spielbrettArray.length; i++ ) for(int i = 0; i < spielbrettArray.length; i++ )
{ {
@ -273,21 +279,27 @@ public class Spiel {
return null; return null;
} }
// rekursiver Aufruf zum Vorhersagen und bewerten der möglichen Züge die der Computer und Mensch tätigen könnten
public int miniMax(char[][] kopieSpielbrett, String zug, int tiefe, boolean maxPlayer, Spiel spiel) { public int miniMax(char[][] kopieSpielbrett, String zug, int tiefe, boolean maxPlayer, Spiel spiel) {
// wenn Vorhersagungstiefe erreicht, dann aktuellen Zug bewerten
if(tiefe == 0) { if(tiefe == 0) {
int bewertung = bewerteSpielzug(zug); int bewertung = bewerteSpielzug(zug, maxPlayer);
// System.out.println(bewertung);
return bewertung; return bewertung;
} }
// wenn Henne dran ist, dann vorhersagen welche Züge die Henne tätigen könnte
if(maxPlayer == true) { if(maxPlayer == true) {
int maxWert = (-9999); int maxWert = -9999;
ArrayList<String> potenzielleZüge = getMoves(kopieSpielbrett, maxPlayer, spiel); ArrayList<String> potenzielleZüge = getMoves(kopieSpielbrett, maxPlayer, spiel);
// mit einem bestimmten Spielzug der Henne rekursiv vorhersagen wie optimal dieser ist
for(int i = 0; i< potenzielleZüge.size(); i++) { for(int i = 0; i< potenzielleZüge.size(); i++) {
zug = potenzielleZüge.get(i); zug = potenzielleZüge.get(i);
// Henne verschieben simulieren
ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), '\u25A1'); ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), '\u25A1');
ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), 'X'); ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), 'X');
// rekursiv die Tiefe der Vorhersagung ändern
int wert = miniMax(kopieSpielbrett, zug, tiefe-1, false, spiel); int wert = miniMax(kopieSpielbrett, zug, tiefe-1, false, spiel);
if(wert > maxWert) { if(wert > maxWert) {
maxWert = wert; maxWert = wert;
@ -296,35 +308,71 @@ public class Spiel {
ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), '\u25A1'); ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), '\u25A1');
} }
return maxWert; return maxWert;
// wenn Fuchs dran ist, dann vorhersagen welche Züge der Fuchs tätigen könnte
} else { } else {
int minWert = 9999; int minWert = 9999;
ArrayList<String> potenzielleZüge = getMoves(kopieSpielbrett, maxPlayer, spiel); ArrayList<String> potenzielleZüge = getMoves(kopieSpielbrett, maxPlayer, spiel);
// mit einem bestimmten Spielzug der Füchse rekursiv vorhersagen wie optimal dieser ist
for(int i = 0; i< potenzielleZüge.size(); i++) { for(int i = 0; i< potenzielleZüge.size(); i++) {
zug = potenzielleZüge.get(i); zug = potenzielleZüge.get(i);
// Änderung ist noch nicht wirklich richtig für den Fuchs --------------------------------------------------------------------- // alle speziellen Züge werden gesondert aufgeteilt und verändern das Spielbrett gesondert
ändereWertImArray(zug.charAt(0), zug.charAt(2), '\u25A1'); if(zug.length() != 7) {
ändereWertImArray(zug.charAt(4), zug.charAt(6), 'O'); int anzahlZüge = zug.length() / 4;
String zwischenzug;
// der erste Wert im Zug kann sofort verändert werden
ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), '\u25A1');
// Schleife um die Henne zu killen und um den Fuchs zu verschieben
for(int zugZähler = 2, beginnChar = 4, endeChar = 12; zugZähler <= anzahlZüge; zugZähler += 2, beginnChar += 8, endeChar += 8) {
zwischenzug = zug.substring(beginnChar, endeChar);
ändereWertImArray(Character.getNumericValue(zwischenzug.charAt(0)), Character.getNumericValue(zwischenzug.charAt(2)), '\u25A1');
ändereWertImArray(Character.getNumericValue(zwischenzug.charAt(4)), Character.getNumericValue(zwischenzug.charAt(6)), 'O');
}
// rekursiv die Tiefe der Vorhersagung ändern
int wert = miniMax(kopieSpielbrett, zug, tiefe-1, true, spiel);
if(wert > minWert) {
minWert = wert;
}
// der erste Wert im Zug wird sofort wieder rückgängig gemacht
ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), 'O');
// Schleife um die Henne quasi wiederzubeleben und um den Fuchs wieder zurück zu verändern
for(int zugZähler = 2, beginnChar = 4, endeChar = 12; zugZähler <= anzahlZüge; zugZähler += 2, beginnChar += 8, endeChar += 8) {
zwischenzug = zug.substring(beginnChar, endeChar);
ändereWertImArray(Character.getNumericValue(zwischenzug.charAt(0)), Character.getNumericValue(zwischenzug.charAt(2)), 'X');
ändereWertImArray(Character.getNumericValue(zwischenzug.charAt(4)), Character.getNumericValue(zwischenzug.charAt(6)), '\u25A1');
}
} else {
// bei einem normalen Zug ohne eine Henne zu killen, wird das Spielbrett normal verändert
ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), '\u25A1');
ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), 'O');
int wert = miniMax(kopieSpielbrett, zug, tiefe-1, true, spiel); int wert = miniMax(kopieSpielbrett, zug, tiefe-1, true, spiel);
if(wert > minWert) { if(wert > minWert) {
minWert = wert; minWert = wert;
} }
// Änderung ist noch nicht wirklich richtig für den Fuchs --------------------------------------------------------------------- ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), 'O');
ändereWertImArray(zug.charAt(0), zug.charAt(2), 'O'); ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), '\u25A1');
ändereWertImArray(zug.charAt(4), zug.charAt(6), '\u25A1'); }
} }
return minWert; return minWert;
} }
} }
public int bewerteSpielzug(String zug) { // getätigten Spielzug bewerten
int bewertung = 0; public int bewerteSpielzug(String zug, boolean maxPlayer) {
int bewertung = 5;
return bewertung; return bewertung;
} }
// Liste mit allen möglichen Zügen der Spielfigur erstellen
public ArrayList<String> getMoves(char[][] kopieSpielbrett, boolean maxPlayer, Spiel spiel) { public ArrayList<String> getMoves(char[][] kopieSpielbrett, boolean maxPlayer, Spiel spiel) {
if(maxPlayer == true) { if(maxPlayer == true) {
return alleZügeHennen(kopieSpielbrett, spiel); return alleZügeHennen(kopieSpielbrett, spiel);
@ -333,6 +381,7 @@ public class Spiel {
} }
} }
// packt alle möglichen Hennen Züge in eine ArrayList und übergibt sie getMoves
public ArrayList<String> alleZügeHennen(char[][] kopieSpielbrett, Spiel spiel) { public ArrayList<String> alleZügeHennen(char[][] kopieSpielbrett, Spiel spiel) {
ArrayList<String> alleZüge = new ArrayList<>(); ArrayList<String> alleZüge = new ArrayList<>();
ArrayList<String> spielfigurExistiert = new ArrayList<>(); ArrayList<String> spielfigurExistiert = new ArrayList<>();
@ -350,6 +399,7 @@ public class Spiel {
int altX = Character.getNumericValue(random.charAt(2)); int altX = Character.getNumericValue(random.charAt(2));
int neuY = altY; int neuY = altY;
// links und rechts von der Henne frei?
for(int x = altX - 1; x < altX + 2; x += 2) { for(int x = altX - 1; x < altX + 2; x += 2) {
if(x == 0 || x == 10) { if(x == 0 || x == 10) {
if(x == 0) { if(x == 0) {
@ -359,7 +409,7 @@ public class Spiel {
break; break;
} }
} }
if(kopieSpielbrett[altY][x] == '\u25A1') { if(getWertAusArray(altY, x) == '\u25A1') {
zug = altY + "," + altX + " " + altY + "," + x; zug = altY + "," + altX + " " + altY + "," + x;
alleZüge.add(zug); alleZüge.add(zug);
} }
@ -367,7 +417,8 @@ public class Spiel {
if(neuY - 1 == -1) { if(neuY - 1 == -1) {
// tue nichts // tue nichts
} else { } else {
if(kopieSpielbrett[neuY - 1][altX] == '\u25A1') { // über der Henne frei?
if(getWertAusArray(altY - 1, altX) == '\u25A1') {
zug = altY + "," + altX + " " + (neuY - 1) + "," + altX; zug = altY + "," + altX + " " + (neuY - 1) + "," + altX;
alleZüge.add(zug); alleZüge.add(zug);
} }
@ -377,11 +428,11 @@ public class Spiel {
return alleZüge; return alleZüge;
} }
// packt alle möglichen Fuchs Züge in eine ArrayList und übergibt sie getMoves
public ArrayList<String> alleZügeFuchs(char[][] kopieSpielbrett, Spiel spiel) { public ArrayList<String> alleZügeFuchs(char[][] kopieSpielbrett, Spiel spiel) {
ArrayList<String> alleZüge = new ArrayList<>(); ArrayList<String> alleZüge = new ArrayList<>();
ArrayList<String> spielfigurExistiert = new ArrayList<>(); ArrayList<String> spielfigurExistiert = new ArrayList<>();
Spielfigur fuchs = new Fuchs(); Spielfigur fuchs = new Fuchs();
String zug;
Random rand = new Random(); Random rand = new Random();
spielfigurExistiert = spielfigurExistiert(fuchs); spielfigurExistiert = spielfigurExistiert(fuchs);
@ -390,9 +441,24 @@ public class Spiel {
int index = rand.nextInt(spielfigurExistiert.size()); int index = rand.nextInt(spielfigurExistiert.size());
String random = spielfigurExistiert.get(index); String random = spielfigurExistiert.get(index);
int altY = Character.getNumericValue(random.charAt(0)); // rekursiver Aufruf zum überprüfen welche Züge ein bestimmter Fuchs gehen kann
int altX = Character.getNumericValue(random.charAt(2)); rekursivFuchsZug(kopieSpielbrett, random, null, alleZüge);
spielfigurExistiert.remove(index);
} while(spielfigurExistiert.size() > 0);
return alleZüge;
}
// es wird rekursiv überprüft welche Züge ein bestimmter Fuchs gehen kann
// rekursiv ist es nur damit der zurückgegebene String eine bestimmte Schreibweise hat
public void rekursivFuchsZug(char[][] kopieSpielbrett, String startKoordinate, String zgeKoordinaten, ArrayList<String> alleZüge) {
String zug = null;
String neueStartkoordinate;
int altY = Character.getNumericValue(startKoordinate.charAt(0));
int altX = Character.getNumericValue(startKoordinate.charAt(2));
// über und unter dem Fuchs überprüfen
for(int y = altY - 1; y < altY + 2; y++) { for(int y = altY - 1; y < altY + 2; y++) {
if(y == -1 || y == 9) { if(y == -1 || y == 9) {
if(y == -1) { if(y == -1) {
@ -402,9 +468,10 @@ public class Spiel {
break; break;
} }
} }
// seitlich vom Fuchs überprüfen
for(int x = altX - 1; x < altX + 2; x++) { for(int x = altX - 1; x < altX + 2; x++) {
if(kopieSpielbrett[y][x] == kopieSpielbrett[altY][altX] || x == 0 || x == 10) { if(y == altY && x == altX || x == 0 || x == 10) {
if(kopieSpielbrett[y][x] == kopieSpielbrett[altY][altX]) { if(y == altY && x == altX) {
x++; x++;
} }
if(x == 0) { if(x == 0) {
@ -414,19 +481,162 @@ public class Spiel {
break; break;
} }
} }
// wenn Feld leer, dann vermerken
// hier fehlt dem Bot noch das er Hennen erkennt bze. killen kann ------------------------------------------------------------ if(getWertAusArray(y, x) == '\u25A1') {
if(kopieSpielbrett[y][x] == '\u25A1') {
zug = altY + "," + altX + " " + y + "," + x; zug = altY + "," + altX + " " + y + "," + x;
alleZüge.add(zug); alleZüge.add(zug);
} }
// wenn eine Henne zu killen ist und sich diese auf einem validen Feld befindet, dann rekursiv vermerken
if(getWertAusArray(y, x) == 'X' && y - 1 != -1 && y + 1 != 9 && x - 1 != 0 && x + 1 != 10 && henneInSafeZone(y, x) == false) {
if(y - altY == 1 || y - altY == -1) {
if(x - altX == 1 || x - altX == -1) {
if(x - altX == 1) {
if(y - altY == 1) {
if(getWertAusArray(y + 1, x + 1) == '\u25A1') {
// wenn von der Startkoordinate aus noch keine Henne gekillt wurde, dann so vermerken
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + (y + 1) + "," + (x + 1) + " ";
alleZüge.add(zug);
}
// wenn von der Startkoordinate aus schon Hennen gekillt wurden, dann gestapelt vermerken
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + (y + 1) + "," + (x + 1) + " ";
alleZüge.add(zug);
}
// Henne killen und Fuchs verschieben simulieren
neueStartkoordinate = (y + 1) + "," + (x + 1);
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray((y + 1), (x + 1), 'O');
// rekursiv von der neuen und veränderten Position aus erneut überprüfen
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray((y + 1), (x + 1), '\u25A1');
}
} else {
if(getWertAusArray(y - 1, x - 1) == '\u25A1') {
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + (y - 1) + "," + (x + 1) + " ";
alleZüge.add(zug);
}
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + (y - 1) + "," + (x + 1) + " ";
alleZüge.add(zug);
}
neueStartkoordinate = (y - 1) + "," + (x + 1);
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray((y - 1), (x + 1), 'O');
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray((y - 1), (x + 1), '\u25A1');
}
}
} else {
if(y - altY == 1) {
if(getWertAusArray(y + 1, x + 1) == '\u25A1') {
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + (y + 1) + "," + (x - 1) + " ";
alleZüge.add(zug);
}
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + (y + 1) + "," + (x - 1) + " ";
alleZüge.add(zug);
}
neueStartkoordinate = (y + 1) + "," + (x - 1);
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray((y + 1), (x - 1), 'O');
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray((y + 1), (x - 1), '\u25A1');
}
} else {
if(getWertAusArray(y - 1, x - 1) == '\u25A1') {
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + (y - 1) + "," + (x - 1) + " ";
alleZüge.add(zug);
}
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + (y - 1) + "," + (x - 1) + " ";
alleZüge.add(zug);
}
neueStartkoordinate = (y - 1) + "," + (x - 1);
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray((y - 1), (x - 1), 'O');
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray((y - 1), (x - 1), '\u25A1');
}
}
}
} else if(y - altY == 1) {
if(getWertAusArray(y + 1, x) == '\u25A1') {
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + (y + 1) + "," + x + " ";
alleZüge.add(zug);
}
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + (y + 1) + "," + x + " ";
alleZüge.add(zug);
}
neueStartkoordinate = (y + 1) + "," + x;
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray((y + 1), x, 'O');
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray((y + 1), x, '\u25A1');
}
} else {
if(getWertAusArray(y - 1, x) == '\u25A1') {
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + (y - 1) + "," + x + " ";
alleZüge.add(zug);
}
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + (y - 1) + "," + x + " ";
alleZüge.add(zug);
}
neueStartkoordinate = (y - 1) + "," + x;
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray((y - 1), x, 'O');
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray((y - 1), x, '\u25A1');
}
}
} else if(x - altX == 1 || x - altX == -1) {
if(x - altX == 1) {
if(getWertAusArray(y, x + 1) == '\u25A1') {
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + y + "," + (x + 1) + " ";
alleZüge.add(zug);
}
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + y + "," + (x + 1) + " ";
alleZüge.add(zug);
}
neueStartkoordinate = y + "," + (x + 1);
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray(y, (x + 1), 'O');
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray(y, (x + 1), '\u25A1');
}
} else {
if(getWertAusArray(y, x - 1) == '\u25A1') {
if(zgeKoordinaten == null) {
zug = altY + "," + altX + " " + y + "," + x + " " + y + "," + (x - 1) + " ";
alleZüge.add(zug);
}
if(zgeKoordinaten != null) {
zug = zgeKoordinaten + y + "," + x + " " + y + "," + (x - 1) + " ";
alleZüge.add(zug);
}
neueStartkoordinate = y + "," + (x - 1);
ändereWertImArray(altY, altX, '\u25A1'); ändereWertImArray(y, x, '\u25A1'); ändereWertImArray(y, (x - 1), 'O');
rekursivFuchsZug(kopieSpielbrett, neueStartkoordinate, zug, alleZüge);
ändereWertImArray(altY, altX, 'O'); ändereWertImArray(y, x, 'X'); ändereWertImArray(y, (x - 1), '\u25A1');
}
}
}
}
} }
} }
spielfigurExistiert.remove(index);
} while(spielfigurExistiert.size() > 0);
return alleZüge;
} }
// quasi von der Fuchs Klasse kopiert
public boolean henneInSafeZone(int yAchse, int xAchse) {
if (yAchse <= 2 && (xAchse == 4 || xAchse == 5 || xAchse == 6)) {
return true;
}
return false;
}
// wandelt Koordinaten von Array Schreibweise in menschliche Schreibweise um
public int[] wandelUmgekehrtUm(int umwandeln1, int umwandeln2, int umwandeln3, int umwandeln4) { public int[] wandelUmgekehrtUm(int umwandeln1, int umwandeln2, int umwandeln3, int umwandeln4) {
int[] umgewandelt = new int[4]; int[] umgewandelt = new int[4];
umgewandelt[0] = (umwandeln2 - 1); umgewandelt[0] = (umwandeln2 - 1);
@ -437,6 +647,7 @@ public class Spiel {
return umgewandelt; return umgewandelt;
} }
// wandelt Koordinaten von menschlicher Schreibweise in Array Schreibweise um
public int[] wandelPassendUm(int umwandeln1, int umwandeln2) { public int[] wandelPassendUm(int umwandeln1, int umwandeln2) {
int[] umgewandelt = new int[2]; int[] umgewandelt = new int[2];
umgewandelt[0] = (8 - umwandeln2); umgewandelt[0] = (8 - umwandeln2);
@ -444,448 +655,4 @@ public class Spiel {
return umgewandelt; return umgewandelt;
} }
// public int[] wandelPassendUm(int umwandeln1, int umwandeln2) {
// // Erlaubte Koordinaten sind:
// // 3,0 / 4,0 / 5,0 - 3,1 / 4,1 / 5,1 - 3,2 / 4,2 / 5,2
// // 0,3 / 1,3 / 2,3 / 3,3 / 4,3 / 5,3 / 6,3 / 7,3 / 8,3
// // 0,4 / ...
// // 0,5 / ...
// // 3,6 / 4,6 / 5,6 - 3,7 / 4,7 / 5,7 - 3,8 / 4,8 / 5,8
// // Fälle 3,0 / 4,0 / 5,0
// if (umwandeln1 == 3 && umwandeln2 == 0) {
// umwandeln1 = 8;
// umwandeln2 = 4;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 0) {
// umwandeln1 = 8;
// umwandeln2 = 5;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 0 ) {
// umwandeln1 = 8 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// // Fälle 3,1 / 4,1 / 5,1
// if (umwandeln1 == 3 && umwandeln2 == 1 ) {
// umwandeln1 = 7 ;
// umwandeln2 = 4 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 1 ) {
// umwandeln1 = 7 ;
// umwandeln2 = 5 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 1 ) {
// umwandeln1 = 7 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// // Fälle 3,2 / 4,2 / 5,2
// if (umwandeln1 == 3 && umwandeln2 == 2 ) {
// umwandeln1 = 6 ;
// umwandeln2 = 4 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 2 ) {
// umwandeln1 = 6 ;
// umwandeln2 = 5 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 2 ) {
// umwandeln1 = 6 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// // Fälle 0,3 - 8,3
// if (umwandeln1 == 0 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 1 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 1 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 2 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 2 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 3 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 3 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 4 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 5 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 6 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 7 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 7 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 8 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 8 && umwandeln2 == 3 ) {
// umwandeln1 = 5 ;
// umwandeln2 = 9 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// // Fälle 0,4 - 8,4
// if (umwandeln1 == 0 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 1 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 1 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 2 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 2 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 3 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 3 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 4 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 5 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 6 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 7 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 7 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 8 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 8 && umwandeln2 == 4 ) {
// umwandeln1 = 4 ;
// umwandeln2 = 9 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// // Fälle 0,5 - 8,5
// if (umwandeln1 == 0 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 1 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 1 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 2 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 2 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 3 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 3 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 4 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 5 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 6 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 7 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 7 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 8 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 8 && umwandeln2 == 5 ) {
// umwandeln1 = 3 ;
// umwandeln2 = 9 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// //Fälle 3,6 - 5,6
// if (umwandeln1 == 3 && umwandeln2 == 6) {
// umwandeln1 = 2;
// umwandeln2 = 4;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 6) {
// umwandeln1 = 2;
// umwandeln2 = 5;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 6 ) {
// umwandeln1 = 2 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// //Fälle 3,7 - 5,7
// if (umwandeln1 == 3 && umwandeln2 == 7) {
// umwandeln1 = 1;
// umwandeln2 = 4;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 7) {
// umwandeln1 = 1;
// umwandeln2 = 5;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 7 ) {
// umwandeln1 = 1 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// //Fälle 3,8 - 5,8
// if (umwandeln1 == 3 && umwandeln2 == 8) {
// umwandeln1 = 0;
// umwandeln2 = 4;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 4 && umwandeln2 == 8) {
// umwandeln1 = 0;
// umwandeln2 = 5;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// if (umwandeln1 == 5 && umwandeln2 == 8 ) {
// umwandeln1 = 0 ;
// umwandeln2 = 6 ;
// int[] umgewandelt = new int[2];
// umgewandelt[0] = umwandeln1;
// umgewandelt[1] = umwandeln2;
// return umgewandelt;
// }
// //Fehlerwert ist 1000
// int[] umgewandelt = new int[2];
// umgewandelt[0] = 1000;
// umgewandelt[1] = 1000;
// return umgewandelt;
// }
} }