BotHardHenne und BotHardFuchs angefangen. miniMax Konstrukt steht und Spiel mit einigen zum Bot passenden Methoden ergänzt

main
Nico Piehl 2022-12-11 23:58:42 +01:00
parent f91dced51d
commit b13e58d0d3
3 changed files with 195 additions and 2 deletions

View File

@ -1,5 +1,8 @@
package domain; package domain;
import java.util.ArrayList;
import java.util.Arrays;
public class BotHardFuchs extends Bot { public class BotHardFuchs extends Bot {
public BotHardFuchs() { public BotHardFuchs() {
@ -7,7 +10,23 @@ public class BotHardFuchs extends Bot {
} }
@Override @Override
public String zugBestimmen(Spiel spiel, Spielfigur spielfigur) { public String zugBestimmen(Spiel spiel, Spielfigur fuchs) {
char[][] spielbrettArray = spiel.getSpielbrettArray();
char[][] kopieSpielbrett = Arrays.stream(spielbrettArray).map(char[]::clone).toArray(char[][]::new);
ArrayList<String> alleZüge = new ArrayList<>();
alleZüge = spiel.alleZügeFuchs(kopieSpielbrett, spiel);
for (String züge : alleZüge) {
System.out.println(züge);
}
int bewertung = spiel.miniMax(kopieSpielbrett, null, 1, false, spiel);
System.out.println();
System.out.println("HIER IST ENDE FÜR BOTHARDFUCHS! -----------------------------------------------------------------");
System.out.println();
return "Ich bins der Harte Fuchs Bot"; return "Ich bins der Harte Fuchs Bot";
} }

View File

@ -1,5 +1,8 @@
package domain; package domain;
import java.util.ArrayList;
import java.util.Arrays;
public class BotHardHenne extends Bot { public class BotHardHenne extends Bot {
public BotHardHenne() { public BotHardHenne() {
@ -7,7 +10,23 @@ public class BotHardHenne extends Bot {
} }
@Override @Override
public String zugBestimmen(Spiel spiel, Spielfigur spielfigur) { public String zugBestimmen(Spiel spiel, Spielfigur henne) {
char[][] spielbrettArray = spiel.getSpielbrettArray();
char[][] kopieSpielbrett = Arrays.stream(spielbrettArray).map(char[]::clone).toArray(char[][]::new);
ArrayList<String> alleZüge = new ArrayList<>();
alleZüge = spiel.alleZügeHennen(kopieSpielbrett, spiel);
for (String züge : alleZüge) {
System.out.println(züge);
}
int bewertung = spiel.miniMax(kopieSpielbrett, null, 1, true, spiel);
System.out.println();
System.out.println("HIER IST ENDE FÜR BOTHARDHENNE! -----------------------------------------------------------------");
System.out.println();
return "Ich bins der Harte Hennen Bot"; return "Ich bins der Harte Hennen Bot";
} }

View File

@ -1,6 +1,7 @@
package domain; package domain;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random;
public class Spiel { public class Spiel {
private String spielname; private String spielname;
@ -272,6 +273,160 @@ public class Spiel {
return null; return null;
} }
public int miniMax(char[][] kopieSpielbrett, String zug, int tiefe, boolean maxPlayer, Spiel spiel) {
if(tiefe == 0) {
int bewertung = bewerteSpielzug(zug);
return bewertung;
}
if(maxPlayer == true) {
int maxWert = (-9999);
ArrayList<String> potenzielleZüge = getMoves(kopieSpielbrett, maxPlayer, spiel);
for(int i = 0; i< potenzielleZüge.size(); i++) {
zug = potenzielleZüge.get(i);
ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), '\u25A1');
ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), 'X');
int wert = miniMax(kopieSpielbrett, zug, tiefe-1, false, spiel);
if(wert > maxWert) {
maxWert = wert;
}
ändereWertImArray(Character.getNumericValue(zug.charAt(0)), Character.getNumericValue(zug.charAt(2)), 'X');
ändereWertImArray(Character.getNumericValue(zug.charAt(4)), Character.getNumericValue(zug.charAt(6)), '\u25A1');
}
return maxWert;
} else {
int minWert = 9999;
ArrayList<String> potenzielleZüge = getMoves(kopieSpielbrett, maxPlayer, spiel);
for(int i = 0; i< potenzielleZüge.size(); i++) {
zug = potenzielleZüge.get(i);
// Änderung ist noch nicht wirklich richtig für den Fuchs ---------------------------------------------------------------------
ändereWertImArray(zug.charAt(0), zug.charAt(2), '\u25A1');
ändereWertImArray(zug.charAt(4), zug.charAt(6), 'O');
int wert = miniMax(kopieSpielbrett, zug, tiefe-1, true, spiel);
if(wert > minWert) {
minWert = wert;
}
// Änderung ist noch nicht wirklich richtig für den Fuchs ---------------------------------------------------------------------
ändereWertImArray(zug.charAt(0), zug.charAt(2), 'O');
ändereWertImArray(zug.charAt(4), zug.charAt(6), '\u25A1');
}
return minWert;
}
}
public int bewerteSpielzug(String zug) {
int bewertung = 0;
return bewertung;
}
public ArrayList<String> getMoves(char[][] kopieSpielbrett, boolean maxPlayer, Spiel spiel) {
if(maxPlayer == true) {
return alleZügeHennen(kopieSpielbrett, spiel);
} else {
return alleZügeFuchs(kopieSpielbrett, spiel);
}
}
public ArrayList<String> alleZügeHennen(char[][] kopieSpielbrett, Spiel spiel) {
ArrayList<String> alleZüge = new ArrayList<>();
ArrayList<String> spielfigurExistiert = new ArrayList<>();
Spielfigur henne = new Hennen();
String zug;
Random rand = new Random();
spielfigurExistiert = spielfigurExistiert(henne);
do {
int index = rand.nextInt(spielfigurExistiert.size());
String random = spielfigurExistiert.get(index);
int altY = Character.getNumericValue(random.charAt(0));
int altX = Character.getNumericValue(random.charAt(2));
int neuY = altY;
for(int x = altX - 1; x < altX + 2; x += 2) {
if(x == 0 || x == 10) {
if(x == 0) {
x += 2;
}
if(x == 10) {
break;
}
}
if(kopieSpielbrett[altY][x] == '\u25A1') {
zug = altY + "," + altX + " " + altY + "," + x;
alleZüge.add(zug);
}
}
if(neuY - 1 == -1) {
// tue nichts
} else {
if(kopieSpielbrett[neuY - 1][altX] == '\u25A1') {
zug = altY + "," + altX + " " + (neuY - 1) + "," + altX;
alleZüge.add(zug);
}
}
spielfigurExistiert.remove(index);
} while(spielfigurExistiert.size() > 0);
return alleZüge;
}
public ArrayList<String> alleZügeFuchs(char[][] kopieSpielbrett, Spiel spiel) {
ArrayList<String> alleZüge = new ArrayList<>();
ArrayList<String> spielfigurExistiert = new ArrayList<>();
Spielfigur fuchs = new Fuchs();
String zug;
Random rand = new Random();
spielfigurExistiert = spielfigurExistiert(fuchs);
do {
int index = rand.nextInt(spielfigurExistiert.size());
String random = spielfigurExistiert.get(index);
int altY = Character.getNumericValue(random.charAt(0));
int altX = Character.getNumericValue(random.charAt(2));
for(int y = altY - 1; y < altY + 2; y++) {
if(y == -1 || y == 9) {
if(y == -1) {
y++;
}
if(y == 9) {
break;
}
}
for(int x = altX - 1; x < altX + 2; x++) {
if(kopieSpielbrett[y][x] == kopieSpielbrett[altY][altX] || x == 0 || x == 10) {
if(kopieSpielbrett[y][x] == kopieSpielbrett[altY][altX]) {
x++;
}
if(x == 0) {
x++;
}
if(x == 10) {
break;
}
}
// hier fehlt dem Bot noch das er Hennen erkennt bze. killen kann ------------------------------------------------------------
if(kopieSpielbrett[y][x] == '\u25A1') {
zug = altY + "," + altX + " " + y + "," + x;
alleZüge.add(zug);
}
}
}
spielfigurExistiert.remove(index);
} while(spielfigurExistiert.size() > 0);
return alleZüge;
}
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);