IsValidMove neu gemacht für mehrere Zugeingaben + kleine Änderungen +

Zug wandelt nun im isValidMove selbst um daher muss die KI den
übergebenen Zug nochmal ändern
pull/5/head
cedri 2022-12-08 11:10:09 +01:00
parent f7541db1d6
commit 674ffa0584
8 changed files with 194 additions and 149 deletions

View File

@ -44,7 +44,7 @@ public class BotEasyFuchs extends Bot {
zug = altY + "," + altX + " " + neuY + "," + neuX; zug = altY + "," + altX + " " + neuY + "," + neuX;
} while(fuchs.isValidMove(altY, altX, neuY, neuX, spiel) == false); } while(fuchs.oberIsValidMove(zug, spiel) == false);
return zug; return zug;
} }

View File

@ -40,7 +40,7 @@ public class BotEasyHenne extends Bot {
zug = altY + "," + altX + " " + neuY + "," + neuX; zug = altY + "," + altX + " " + neuY + "," + neuX;
} while(henne.isValidMove(altY, altX, neuY, neuX, spiel) == false); } while(henne.oberIsValidMove(zug, spiel) == false);
return zug; return zug;
} }

View File

@ -13,7 +13,33 @@ public class Fuchs extends Spielfigur {
spiel.ändereWertImArray(neueZielY, neueZielX, 'O'); spiel.ändereWertImArray(neueZielY, neueZielX, 'O');
} }
public boolean isValidMove(int neueStartY, int neueStartX, int neueZielY, int neueZielX, Spiel spiel) { public boolean oberIsValidMove(String zug, Spiel spiel) {
int anzahlZüge = (zug.length() - 3) / 4;
String zwischenzug;
boolean erfolgreicherZwischenzug;
System.out.println(anzahlZüge);
for(int zugZähler = 1, beginnChar = 0, endeChar = 7; zugZähler <= anzahlZüge; zugZähler++, beginnChar = beginnChar + 4, endeChar = endeChar + 4) {
zwischenzug = zug.substring(beginnChar, endeChar);
System.out.println(zwischenzug);
int[] neueKoordinaten = spiel.berechneRichtigeKoordinaten(zwischenzug);
int neueStartY = neueKoordinaten[0];
int neueStartX = neueKoordinaten[1];
int neueZielY = neueKoordinaten[2];
int neueZielX = neueKoordinaten[3];
erfolgreicherZwischenzug = isValidMove(neueStartY, neueStartX, neueZielY, neueZielX, spiel, zugZähler);
if (erfolgreicherZwischenzug == false) {
return false;
}
}
return true;
}
public boolean isValidMove(int neueStartY, int neueStartX, int neueZielY, int neueZielX, Spiel spiel, int zugZähler) {
int schritteY = Math.abs(neueStartY - neueZielY); int schritteY = Math.abs(neueStartY - neueZielY);
int schritteX = Math.abs(neueStartX - neueZielX); int schritteX = Math.abs(neueStartX - neueZielX);
@ -31,10 +57,17 @@ public class Fuchs extends Spielfigur {
return false; return false;
} }
// Fehler Spielsymbol beim Start oder Ziel falsch // Fehler Spielsymbol beim Start oder Ziel falsch (nur beim ersten Durchgang nach O testen)
if (spiel.getWertAusArray(neueStartY, neueStartX) != 'O' || spiel.getWertAusArray(neueZielY, neueZielX) != '\u25A1') { if (zugZähler == 1) {
System.out.println("Symbole an stellen falsch " + spiel.getWertAusArray(neueStartY, neueStartX) + " " + spiel.getWertAusArray(neueZielY, neueZielX)); if (spiel.getWertAusArray(neueStartY, neueStartX) != 'O' || spiel.getWertAusArray(neueZielY, neueZielX) != '\u25A1') {
return false; System.out.println("Symbole an stellen falsch " + spiel.getWertAusArray(neueStartY, neueStartX) + " " + spiel.getWertAusArray(neueZielY, neueZielX));
return false;
}
} else {
if (spiel.getWertAusArray(neueZielY, neueZielX) != '\u25A1') {
System.out.println("Symbol an der Endstelle falsch " + spiel.getWertAusArray(neueZielY, neueZielX));
return false;
}
} }
// Valider Zug einser Schritt // Valider Zug einser Schritt
@ -265,7 +298,7 @@ public class Fuchs extends Spielfigur {
public boolean henneInSafeZone(int yAchse, int xAchse) { public boolean henneInSafeZone(int yAchse, int xAchse) {
//Henne ist in der Safe Zone und darf nicht mehr gekillt werden: //Henne ist in der Safe Zone und darf nicht mehr gekillt werden:
if (yAchse <= 3 && (xAchse == 4 || xAchse == 5 || xAchse == 6)) { if (yAchse <= 2 && (xAchse == 4 || xAchse == 5 || xAchse == 6)) {
return true; return true;
} }

View File

@ -12,7 +12,12 @@ public class Hennen extends Spielfigur {
} }
// generell sehr fehleranfällig, mit Regex Filter Struktur vom String vorgeben // generell sehr fehleranfällig, mit Regex Filter Struktur vom String vorgeben
public boolean isValidMove(int neueStartY, int neueStartX, int neueZielY, int neueZielX, Spiel spiel) { public boolean oberIsValidMove(String zug, Spiel spiel) {
int[] neueKoordinaten = spiel.berechneRichtigeKoordinaten(zug);
int neueStartY = neueKoordinaten[0];
int neueStartX = neueKoordinaten[1];
int neueZielY = neueKoordinaten[2];
int neueZielX = neueKoordinaten[3];
// Zug fehleingabe // Zug fehleingabe
if (neueStartY == 1000 || neueStartX == 1000 || neueZielY == 1000 || neueZielX == 1000) { if (neueStartY == 1000 || neueStartX == 1000 || neueZielY == 1000 || neueZielX == 1000) {

View File

@ -24,119 +24,145 @@ public class Spiel {
} }
} }
public int[] berechneRichtigeKoordinaten(String zug) {
// Form vom Zug: "5,5 4,5"
public char[][] generiereSpielbrett() { // Zug wurde getätigt....
// O=Fuchs, X=Henne, \u25A1=ein Kasten // Werte als Char
spielbrettArray[0][0] = '8'; char startKoordinate1 = zug.charAt(0);
spielbrettArray[0][1] = ' '; char startKoordinate2 = zug.charAt(2);
spielbrettArray[0][2] = ' '; char zielKoordinate1 = zug.charAt(4);
spielbrettArray[0][3] = ' '; char zielKoordinate2 = zug.charAt(6);
spielbrettArray[0][4] = 'X';
spielbrettArray[0][5] = 'X';
spielbrettArray[0][6] = '\u25A1';
spielbrettArray[0][7] = ' ';
spielbrettArray[0][8] = ' ';
spielbrettArray[0][9] = ' ';
spielbrettArray[1][0] = '7'; // Werte als int
spielbrettArray[1][1] = ' '; int startKoord1 = Character.getNumericValue(startKoordinate1);
spielbrettArray[1][2] = ' '; int startKoord2 = Character.getNumericValue(startKoordinate2);
spielbrettArray[1][3] = ' '; int zielKoord1 = Character.getNumericValue(zielKoordinate1);
spielbrettArray[1][4] = 'O'; int zielKoord2 = Character.getNumericValue(zielKoordinate2);
spielbrettArray[1][5] = 'X';
spielbrettArray[1][6] = 'O';
spielbrettArray[1][7] = ' ';
spielbrettArray[1][8] = ' ';
spielbrettArray[1][9] = ' ';
spielbrettArray[2][0] = '6'; int[] neueStartKoords = wandelPassendUm(startKoord1, startKoord2);
spielbrettArray[2][1] = ' '; int[] neueZielKoords = wandelPassendUm(zielKoord1, zielKoord2);
spielbrettArray[2][2] = ' ';
spielbrettArray[2][3] = ' ';
spielbrettArray[2][4] = '\u25A1';
spielbrettArray[2][5] = 'X';
spielbrettArray[2][6] = '\u25A1';
spielbrettArray[2][7] = ' ';
spielbrettArray[2][8] = ' ';
spielbrettArray[2][9] = ' ';
spielbrettArray[3][0] = '5'; // Werte angepasst auf unser Board, die Form des Zuges hat sich geändert von X,Y
spielbrettArray[3][1] = '\u25A1'; // auf Y,X
spielbrettArray[3][2] = '\u25A1'; int[] neueKoordinaten = { neueStartKoords[0], neueStartKoords[1], neueZielKoords[0], neueZielKoords[1] };
spielbrettArray[3][3] = '\u25A1';
spielbrettArray[3][4] = '\u25A1';
spielbrettArray[3][5] = '\u25A1';
spielbrettArray[3][6] = '\u25A1';
spielbrettArray[3][7] = '\u25A1';
spielbrettArray[3][8] = '\u25A1';
spielbrettArray[3][9] = '\u25A1';
spielbrettArray[4][0] = '4'; return neueKoordinaten;
spielbrettArray[4][1] = 'X'; }
spielbrettArray[4][2] = 'X';
spielbrettArray[4][3] = 'X';
spielbrettArray[4][4] = 'X';
spielbrettArray[4][5] = 'X';
spielbrettArray[4][6] = 'X';
spielbrettArray[4][7] = 'X';
spielbrettArray[4][8] = 'X';
spielbrettArray[4][9] = 'X';
spielbrettArray[5][0] = '3'; public char[][] generiereSpielbrett() {
spielbrettArray[5][1] = 'X'; // O=Fuchs, X=Henne, \u25A1=ein Kasten
spielbrettArray[5][2] = 'X';
spielbrettArray[5][3] = 'X';
spielbrettArray[5][4] = 'X';
spielbrettArray[5][5] = 'X';
spielbrettArray[5][6] = 'X';
spielbrettArray[5][7] = 'X';
spielbrettArray[5][8] = 'X';
spielbrettArray[5][9] = 'X';
spielbrettArray[6][0] = '2'; spielbrettArray[0][0] = '8';
spielbrettArray[6][1] = ' '; spielbrettArray[0][1] = ' ';
spielbrettArray[6][2] = ' '; spielbrettArray[0][2] = ' ';
spielbrettArray[6][3] = ' '; spielbrettArray[0][3] = ' ';
spielbrettArray[6][4] = 'X'; spielbrettArray[0][4] = 'X';
spielbrettArray[6][5] = 'X'; spielbrettArray[0][5] = 'X';
spielbrettArray[6][6] = 'X'; spielbrettArray[0][6] = '\u25A1';
spielbrettArray[6][7] = ' '; spielbrettArray[0][7] = ' ';
spielbrettArray[6][8] = ' '; spielbrettArray[0][8] = ' ';
spielbrettArray[6][9] = ' '; spielbrettArray[0][9] = ' ';
spielbrettArray[7][0] = '1'; spielbrettArray[1][0] = '7';
spielbrettArray[7][1] = ' '; spielbrettArray[1][1] = ' ';
spielbrettArray[7][2] = ' '; spielbrettArray[1][2] = ' ';
spielbrettArray[7][3] = ' '; spielbrettArray[1][3] = ' ';
spielbrettArray[7][4] = 'X'; spielbrettArray[1][4] = '\u25A1';
spielbrettArray[7][5] = 'X'; spielbrettArray[1][5] = 'X';
spielbrettArray[7][6] = 'X'; spielbrettArray[1][6] = 'O';
spielbrettArray[7][7] = ' '; spielbrettArray[1][7] = ' ';
spielbrettArray[7][8] = ' '; spielbrettArray[1][8] = ' ';
spielbrettArray[7][9] = ' '; spielbrettArray[1][9] = ' ';
spielbrettArray[8][0] = '0'; spielbrettArray[2][0] = '6';
spielbrettArray[8][1] = ' '; spielbrettArray[2][1] = ' ';
spielbrettArray[8][2] = ' '; spielbrettArray[2][2] = ' ';
spielbrettArray[8][3] = ' '; spielbrettArray[2][3] = ' ';
spielbrettArray[8][4] = 'X'; spielbrettArray[2][4] = 'O';
spielbrettArray[8][5] = 'X'; spielbrettArray[2][5] = '\u25A1';
spielbrettArray[8][6] = 'X'; spielbrettArray[2][6] = '\u25A1';
spielbrettArray[8][7] = ' '; spielbrettArray[2][7] = ' ';
spielbrettArray[8][8] = ' '; spielbrettArray[2][8] = ' ';
spielbrettArray[8][9] = ' '; spielbrettArray[2][9] = ' ';
spielbrettArray[9][0] = ' '; spielbrettArray[3][0] = '5';
spielbrettArray[9][1] = '0'; spielbrettArray[3][1] = '\u25A1';
spielbrettArray[9][2] = '1'; spielbrettArray[3][2] = '\u25A1';
spielbrettArray[9][3] = '2'; spielbrettArray[3][3] = '\u25A1';
spielbrettArray[9][4] = '3'; spielbrettArray[3][4] = '\u25A1';
spielbrettArray[9][5] = '4'; spielbrettArray[3][5] = 'X';
spielbrettArray[9][6] = '5'; spielbrettArray[3][6] = '\u25A1';
spielbrettArray[9][7] = '6'; spielbrettArray[3][7] = '\u25A1';
spielbrettArray[9][8] = '7'; spielbrettArray[3][8] = '\u25A1';
spielbrettArray[9][9] = '8'; spielbrettArray[3][9] = '\u25A1';
spielbrettArray[4][0] = '4';
spielbrettArray[4][1] = 'X';
spielbrettArray[4][2] = 'X';
spielbrettArray[4][3] = 'X';
spielbrettArray[4][4] = 'X';
spielbrettArray[4][5] = 'X';
spielbrettArray[4][6] = '\u25A1';
spielbrettArray[4][7] = 'X';
spielbrettArray[4][8] = 'X';
spielbrettArray[4][9] = 'X';
spielbrettArray[5][0] = '3';
spielbrettArray[5][1] = 'X';
spielbrettArray[5][2] = 'X';
spielbrettArray[5][3] = 'X';
spielbrettArray[5][4] = 'X';
spielbrettArray[5][5] = 'X';
spielbrettArray[5][6] = 'X';
spielbrettArray[5][7] = 'X';
spielbrettArray[5][8] = 'X';
spielbrettArray[5][9] = 'X';
spielbrettArray[6][0] = '2';
spielbrettArray[6][1] = ' ';
spielbrettArray[6][2] = ' ';
spielbrettArray[6][3] = ' ';
spielbrettArray[6][4] = 'X';
spielbrettArray[6][5] = 'X';
spielbrettArray[6][6] = '\u25A1';
spielbrettArray[6][7] = ' ';
spielbrettArray[6][8] = ' ';
spielbrettArray[6][9] = ' ';
spielbrettArray[7][0] = '1';
spielbrettArray[7][1] = ' ';
spielbrettArray[7][2] = ' ';
spielbrettArray[7][3] = ' ';
spielbrettArray[7][4] = 'X';
spielbrettArray[7][5] = 'X';
spielbrettArray[7][6] = 'X';
spielbrettArray[7][7] = ' ';
spielbrettArray[7][8] = ' ';
spielbrettArray[7][9] = ' ';
spielbrettArray[8][0] = '0';
spielbrettArray[8][1] = ' ';
spielbrettArray[8][2] = ' ';
spielbrettArray[8][3] = ' ';
spielbrettArray[8][4] = 'X';
spielbrettArray[8][5] = 'X';
spielbrettArray[8][6] = 'X';
spielbrettArray[8][7] = ' ';
spielbrettArray[8][8] = ' ';
spielbrettArray[8][9] = ' ';
spielbrettArray[9][0] = ' ';
spielbrettArray[9][1] = '0';
spielbrettArray[9][2] = '1';
spielbrettArray[9][3] = '2';
spielbrettArray[9][4] = '3';
spielbrettArray[9][5] = '4';
spielbrettArray[9][6] = '5';
spielbrettArray[9][7] = '6';
spielbrettArray[9][8] = '7';
spielbrettArray[9][9] = '8';
return spielbrettArray; return spielbrettArray;
} }

View File

@ -2,7 +2,7 @@ package domain;
public abstract class Spielfigur { public abstract class Spielfigur {
public abstract boolean isValidMove(int neueStartY, int neueStartX, int neueZielY, int neueZielX, Spiel spiel); public abstract boolean oberIsValidMove(String zug, Spiel spiel);
// public static boolean isValidMove(String zug) { // public static boolean isValidMove(String zug) {
// return false; // return false;
// } // }

View File

@ -190,45 +190,13 @@ public class Spielsystem {
} }
public boolean isValidMove(String zug) { public boolean isValidMove(String zug) {
int[] neueKoordinaten = berechneRichtigeKoordinaten(zug);
int neueStartY = neueKoordinaten[0];
int neueStartX = neueKoordinaten[1];
int neueZielY = neueKoordinaten[2];
int neueZielX = neueKoordinaten[3];
if (aktiverSpieler == true) { if (aktiverSpieler == true) {
return spieler.isValidMove(neueStartY, neueStartX, neueZielY, neueZielX, spiel); return spieler.oberIsValidMove(zug, spiel);
} else { } else {
return computer.isValidMove(neueStartY, neueStartX, neueZielY, neueZielX, spiel); return computer.oberIsValidMove(zug, spiel);
} }
} }
public int[] berechneRichtigeKoordinaten(String zug) {
// Form vom Zug: "5,5 4,5"
// Zug wurde getätigt....
// Werte als Char
char startKoordinate1 = zug.charAt(0);
char startKoordinate2 = zug.charAt(2);
char zielKoordinate1 = zug.charAt(4);
char zielKoordinate2 = zug.charAt(6);
// Werte als int
int startKoord1 = Character.getNumericValue(startKoordinate1);
int startKoord2 = Character.getNumericValue(startKoordinate2);
int zielKoord1 = Character.getNumericValue(zielKoordinate1);
int zielKoord2 = Character.getNumericValue(zielKoordinate2);
int[] neueStartKoords = spiel.wandelPassendUm(startKoord1, startKoord2);
int[] neueZielKoords = spiel.wandelPassendUm(zielKoord1, zielKoord2);
// Werte angepasst auf unser Board, die Form des Zuges hat sich geändert von X,Y
// auf Y,X
int[] neueKoordinaten = { neueStartKoords[0], neueStartKoords[1], neueZielKoords[0], neueZielKoords[1] };
return neueKoordinaten;
}
// Noch falsche Ausgabe vom Zug (Array statt wie bei Eingabe vom Spieler) // Noch falsche Ausgabe vom Zug (Array statt wie bei Eingabe vom Spieler)
// <--------------------------------------------------------------------- // <---------------------------------------------------------------------
@ -251,7 +219,10 @@ public class Spielsystem {
int counterMittlereReihe = 0; int counterMittlereReihe = 0;
int counterUntereReihe = 0; int counterUntereReihe = 0;
int[] neueKoordinaten = berechneRichtigeKoordinaten(zug); String moveZug = moveZugBestimmen(zug);
System.out.println(moveZug);
int[] neueKoordinaten = spiel.berechneRichtigeKoordinaten(moveZug);
int neueStartY = neueKoordinaten[0]; int neueStartY = neueKoordinaten[0];
int neueStartX = neueKoordinaten[1]; int neueStartX = neueKoordinaten[1];
int neueZielY = neueKoordinaten[2]; int neueZielY = neueKoordinaten[2];
@ -284,6 +255,12 @@ public class Spielsystem {
} }
} }
public String moveZugBestimmen(String zug) {
int zugLänge = zug.length();
return "" + zug.charAt(0) + zug.charAt(1) + zug.charAt(2) + " " + zug.charAt(zugLänge - 3) + zug.charAt(zugLänge - 2) + zug.charAt(zugLänge - 1);
}
public void start(boolean werBeginnt, int kiLevel) { public void start(boolean werBeginnt, int kiLevel) {
if (kiLevel == 0 && computer instanceof Hennen) { if (kiLevel == 0 && computer instanceof Hennen) {
@ -361,7 +338,7 @@ public class Spielsystem {
public boolean pushHenne(String zugPushHenne) { public boolean pushHenne(String zugPushHenne) {
char[][] spielbrett = spiel.getSpielbrettArray(); char[][] spielbrett = spiel.getSpielbrettArray();
int[] neueKoordinaten = berechneRichtigeKoordinaten(zugPushHenne); int[] neueKoordinaten = spiel.berechneRichtigeKoordinaten(zugPushHenne);
int neueStartY = neueKoordinaten[0]; int neueStartY = neueKoordinaten[0];
int neueStartX = neueKoordinaten[1]; int neueStartX = neueKoordinaten[1];
int neueZielY = neueKoordinaten[2]; int neueZielY = neueKoordinaten[2];

View File

@ -322,6 +322,10 @@ public class UI {
zugHenne = true; zugHenne = true;
zugFuchs = false; zugFuchs = false;
if (spielsystem.fuchsUmzingelt() == true) {
spielsystem.killFuchs();
}
} }
// nach jedem Zug das Spielbrett ausgeben // nach jedem Zug das Spielbrett ausgeben