4 Gewinnt KI macht nicht, was sie soll..

MrXeth

Aktives Mitglied
Moin, ich versuche gerade eine 4 Gewinnt KI mittels Alpha-Beta Suchalogiruthmus zu erstellen, diese funktioniert aber nicht wirklich...

Hier der Code:
Java:
public class Field {

    /**
     * main method
     *
     * @param args - arguments for executing the class
     */
    public static void main(String[] args) {
        Field f = new Field(4, 4);
        f.test();
    }

    private int[][] fields;

    /**
     * constructor
     *
     * @param rows - number of rows
     * @param columns - number of columns
     */
    public Field(int rows, int columns) {
        this.fields = new int[rows][columns];
    }

    /**
     * method, which returns the more dimensional array illustrating the fields
     *
     * @return - more dimensional array of fields
     */
    public int[][] getFields() {
        return fields;
    }

    /**
     * method, which evaluates, if four chips are in a row
     *
     * @param row - row at the field
     * @param column - column at the field
     * @param rowMove - distance between chips in a row, value 0, if the argument is not needed
     * @param columnMove - distance between chips in a column, value 0, if the argument is not needed
     * @return if four chips are in a row
     */
    public int row(int row, int rowMove, int columnMove) {
        int column = fields[row].length;
        try {
            for(int i = column; i > 0; i--) {
                if(fields[row][i] == 0 ) {
                    fields[row][i+1] = 0;
                    column = i;
                }
            }
        } catch(Exception e) {
            column = 0;
        }
        int kind = fields[row][column];
        int count = 0;
        for (int i = 0; i < 4; i++) {
            try {
                if (fields[row + i * rowMove][column + i * columnMove] == kind) {
                    if (i > 0 && fields[row + i * rowMove - rowMove][column + i * columnMove - columnMove] != kind)
                        break;
                    count++;
                }
                if (i > 0 && fields[row - i * rowMove][column - i * columnMove] == kind) {
                    if (fields[row + i * rowMove + rowMove][column + i * columnMove + columnMove] != kind)
                        break;
                    count++;
                }

            } catch (Exception e) {

            }
        }
        return count;
    }

    /**
     * method, which lets a player set
     *
     * @param kind - kind of chips
     * @param row - row where to set
     */
    public void set(int kind, int row) {
        int column = 0;
        if(!isFilled(row)) {
            for (int i = column; i < fields[row].length; i++) {
                if (fields[row][i] == 0) {
                    fields[row][i] = kind;
                    column = i;
                    break;
                }
            }
            System.out.println("ROW 1 " + fields[row][0]);
            System.out.println(win(0));
        }
    }

    /**
     * method for tests
     */
    public void test() {
        set(1, 0);
        set(1, 0);
        set(1, 0);
        set(1, 0);
    }

    /**
     * method, which returns, if a kind won
     *
     * @param row - row, where the source chip is
     * @param column - column, where the source chip is
     * @return if a kind won the game
     */
    private boolean win(int row) {
        if (row(row, 1, 0) >= 4 || row(row,0, 1) >= 4 || row(row, 1, 1) >= 4)
            return true;
        return false;
    }
  
    public void cancel(int row) {
            for(int i = 0; i < fields[row].length-1; i++) {
                if(fields[row][i] != 1 || fields[row][i] != 2 ) {
                    fields[row][i+1] = 0;
                }
            }
    }
  
    public boolean isFilled(int row) {
        return fields[row][fields[row].length-1] != 0;
    }
}

Und für die KI:

Problem ist bislang, dass die for schleife nach der 0 mehr weitermacht
Code:
import java.util.Arrays;

public class Artificial_Intelligence {

    private Field field;
    private int kind;
    private Difficulty difficulty;
    private int currentActionRow;
  
    public enum Difficulty {
        HARD(42), MEDIUM(21), EASY(5);
      
        private final int deep;
      
        private Difficulty(int deep) {
            this.deep = deep;
        }
      
        public int getDeep() {
            return this.deep;
        }
    }
  
    public Artificial_Intelligence(int kind, Field field, Difficulty difficulty) {
        this.kind = kind;
        this.field = field;
        this.difficulty = difficulty;
    }

    public static void main(String[] args) {
        Artificial_Intelligence t = new Artificial_Intelligence(1, new Field(7,6), Artificial_Intelligence.Difficulty.HARD );
        t.test();

    }
  
    public void test() {
        field.set(2, 1);
        field.set(2, 1);
        field.set(2, 1);
        field.set(2, 1);
        field.set(2, 1);
        field.set(2, 1);
        field.set(2, 1);
        field.set(2, 1);
        field.set(2, 1);
        System.out.println("A");
        intelligent();
    }
  
    public void intelligent() {
        alphaBeta(difficulty.getDeep(), 2147483647, -2147483647, 1 );
        System.out.println("RealSet");
        field.set(kind, currentActionRow);
    }
  
    private int alphaBeta(int depth, int alpha, int beta, int row) {
        if(field.isFilled(row) || depth == 0)
            return evaluate(row);
        int[] actions = generateActions();
        for(int i = 0; i < actions.length; i++) {
            System.out.println("I "+i);
            System.out.println("depth "+depth);
            field.set(kind, actions[i]);
            int value = -alphaBeta(depth-1, -beta, -alpha, i);
            field.cancel(actions[i]);
            if(value >= beta)
                return beta;
            if(value > alpha)
                alpha = value;
        }
        return alpha;
      
    }
  
    private int[] generateActions() {
        int[] temp = new int[field.getFields().length];
        int count = 0;
        for(int i = 0; i < temp.length-1; i++) {
            if(!field.isFilled(i)) {
                temp[count] = i;
            }
            count++;
        }
        temp = Arrays.copyOf(temp, count);
        return temp;
    }
  
    private int evaluate(int row) {
        int[] temp = new int[3];
        temp[0] = field.row(row, 1, 0);
        temp[1] = field.row(row, 0, 1);
        temp[2] = field.row(row, 1, 1);

        temp = quickSort(temp);
        System.out.println("t "+temp[2]);
        return temp[2];
    }

    private static int[] quickSort(int[] values) {
        // Prüfen, ob das Array leer ist oder eine oder weniger Stellen hat
        if(values != null | values.length > 1)
        {
            quicksort(values,0, values.length-1);
        }
        return values;
    }
  
    private static void quicksort(int[] Array,int links, int rechts) {
        int l = links, r = rechts;
        int temp;
        // mittleres Element bekommen
        int pivot = Array[links + (rechts-links)/2];
        // in Liste links und rechts von Pivotelement unterteilen
        while (l <= r)
        {
            // nach Elementen suchen, die kleiner/größer sind, als das pivotelement
            while (Array[l] < pivot)
            {
                l++;
            }
            while (Array[r] > pivot) {
                r--;
            }
            // Wenn in der linken Liste einen Wert gefunden wurde, der größer ist als
            // das Pivot-Element und wenn ein Wert in der rechten Liste gefunden wurde
            // welcher kleiner ist als das Pivot-Element, dann werden die
            // Werte getauscht
            // dann wird l hochgezählt und r runtergezählt
            if (l <= r)
            {
                temp = Array[l];
                Array[l] = Array[r];
                Array[r] = temp;
                l++;
                r--;
            }
        }
        // damit bei unterschiedl. großen Seiten keine Nullpointer / Array out of Bounds auftreten
        if (links < r)
        {
            quicksort(Array, links, r);
        }
        if (l < rechts)
        {
            quicksort(Array, l, rechts);
        }
    }
}

Selbstverständlich ist das ganze noch nicht so super programmiert.

Danke für eure Hilfe^^
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P 4 Gewinnt MinMax Algorhytmus Allgemeine Java-Themen 3
F Vier gewinnt Diagonal überprüfen Allgemeine Java-Themen 2
V 2D-Grafik Vier gewinnt Problem Allgemeine Java-Themen 5
M Vier gewinnt: Auswertung Allgemeine Java-Themen 4
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
N Division macht Probleme Allgemeine Java-Themen 14
berserkerdq2 IJVM, ich tue auf meinen Stack 100 und 120 rein, danach subtrahiere ich, macht die Maschine 100-120 oder 120-100? Allgemeine Java-Themen 8
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
O OOP Wie macht man das am besten OO? Allgemeine Java-Themen 8
Thallius Macht das Sinn? Allgemeine Java-Themen 30
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
X Was macht folgender Code!? Allgemeine Java-Themen 6
J Doppelte Buchstaben löschen - letztes Wort macht er nicht Allgemeine Java-Themen 2
J if else Anweisung macht nicht was es soll. Wieso? Allgemeine Java-Themen 10
M Google App Engine macht Probleme Allgemeine Java-Themen 4
GilbertGrape Warum macht man "if(true)" Allgemeine Java-Themen 18
C Klassen Was macht diese Java-Mathe-Klasse? Allgemeine Java-Themen 2
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
S Javadoc 3d einbinden macht probleme Allgemeine Java-Themen 10
B Unix-Timestamp > Date macht Probleme. Allgemeine Java-Themen 3
T Ausdruck mit pdfBox macht Probleme Allgemeine Java-Themen 2
B jar File macht probleme wegen einer Methode! Allgemeine Java-Themen 5
alderwaran jaxb xsd schema, min/maxoccurs macht was? Allgemeine Java-Themen 7
S AWT StringBuffer macht nicht, was ich erwarte Allgemeine Java-Themen 2
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
N Vokabelprogramm - Wer macht mit? Allgemeine Java-Themen 58
S Anschauen was der Compiler macht..? Allgemeine Java-Themen 5
bj99 ImageIO.write() macht Probleme Allgemeine Java-Themen 7
I Was macht static { ... } ? Allgemeine Java-Themen 8
N Für welche Art von Berechnungen macht JCUDA Sinn? Allgemeine Java-Themen 12
P JMF macht mich verrückt Allgemeine Java-Themen 3
R PDF Formular mit JPod ausfüllen macht Probleme Allgemeine Java-Themen 4
G Wie kriegt Klasse2 die Info, was Klassse1 gerade "macht Allgemeine Java-Themen 7
Escorter was macht createHorizontalGlue() Allgemeine Java-Themen 2
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
J Was macht dieser Code? Allgemeine Java-Themen 13
S Was macht der Java-Verifier? Allgemeine Java-Themen 4
T Problem, warum macht der das so(finde kein titel.) Allgemeine Java-Themen 3
I Irre Website-Wie macht man sowas? Allgemeine Java-Themen 6
U if Abfrage macht etwas falsch Allgemeine Java-Themen 2
G javadoc macht probleme Allgemeine Java-Themen 2
A equals() macht nicht, was es soll Allgemeine Java-Themen 4
B Vergleichen von arrays macht Probleme Allgemeine Java-Themen 2
M JBoss macht Probleme Allgemeine Java-Themen 6
P Wie macht Sun Gewinn mit Java? Allgemeine Java-Themen 3
Maximum '.' in String ersetzen macht Schwierigkeiten Allgemeine Java-Themen 2
T Klassen samt Methoden aus Jar-Archiv laden macht Problem Allgemeine Java-Themen 9
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben