From b13e58d0d393d4107eebad58fcadd7140bd160ea Mon Sep 17 00:00:00 2001 From: 2211320 <2211320@stud.hs-mannheim.de> Date: Sun, 11 Dec 2022 23:58:42 +0100 Subject: [PATCH] =?UTF-8?q?BotHardHenne=20und=20BotHardFuchs=20angefangen.?= =?UTF-8?q?=20miniMax=20Konstrukt=20steht=20und=20Spiel=20mit=20einigen=20?= =?UTF-8?q?zum=20Bot=20passenden=20Methoden=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domain/BotHardFuchs.java | 21 ++++- src/domain/BotHardHenne.java | 21 ++++- src/domain/Spiel.java | 155 +++++++++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+), 2 deletions(-) diff --git a/src/domain/BotHardFuchs.java b/src/domain/BotHardFuchs.java index bf80003..2e0a0f2 100644 --- a/src/domain/BotHardFuchs.java +++ b/src/domain/BotHardFuchs.java @@ -1,5 +1,8 @@ package domain; +import java.util.ArrayList; +import java.util.Arrays; + public class BotHardFuchs extends Bot { public BotHardFuchs() { @@ -7,7 +10,23 @@ public class BotHardFuchs extends Bot { } @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 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"; } diff --git a/src/domain/BotHardHenne.java b/src/domain/BotHardHenne.java index 814def8..dbddbbd 100644 --- a/src/domain/BotHardHenne.java +++ b/src/domain/BotHardHenne.java @@ -1,5 +1,8 @@ package domain; +import java.util.ArrayList; +import java.util.Arrays; + public class BotHardHenne extends Bot { public BotHardHenne() { @@ -7,7 +10,23 @@ public class BotHardHenne extends Bot { } @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 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"; } diff --git a/src/domain/Spiel.java b/src/domain/Spiel.java index 7b9e949..0752e3d 100644 --- a/src/domain/Spiel.java +++ b/src/domain/Spiel.java @@ -1,6 +1,7 @@ package domain; import java.util.ArrayList; +import java.util.Random; public class Spiel { private String spielname; @@ -272,6 +273,160 @@ public class Spiel { 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 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 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 getMoves(char[][] kopieSpielbrett, boolean maxPlayer, Spiel spiel) { + if(maxPlayer == true) { + return alleZügeHennen(kopieSpielbrett, spiel); + } else { + return alleZügeFuchs(kopieSpielbrett, spiel); + } + } + + public ArrayList alleZügeHennen(char[][] kopieSpielbrett, Spiel spiel) { + ArrayList alleZüge = new ArrayList<>(); + ArrayList 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 alleZügeFuchs(char[][] kopieSpielbrett, Spiel spiel) { + ArrayList alleZüge = new ArrayList<>(); + ArrayList 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) { int[] umgewandelt = new int[4]; umgewandelt[0] = (umwandeln2 - 1);