Quico Llinares Llorens Ответов: 1

Почему ошибочен мой минимаксный алгоритм для connect 4?


Всем привет, я здесь новенькая.
Я был с прошлой недели заморожен с ними, я не знаю, почему моя программа не работает. На самом деле я думаю, что знаю почему, и я думаю, что из-за минимаксной функции.Но как мне поступить? Здесь у вас есть код, связанный с минимаксом.
Я думаю, что каждая функция объяснена в коде. Если вы чего-то не понимаете, дайте мне знать.

Спасибо вам за помощь!

Что я уже пробовал:

<pre lang="java">
      
    public class Node {

        public int score;
        public int move;
        public ArrayList&lt;Node&gt; hijos;
        
        public Node () {
            score = -1;
            move = -1;
            hijos = new ArrayList&lt;&gt;();
        }
        
        public Node(int s, int m) {
            score = s;
            move = m;
        }
        
        public Node (Node n) {
            score = n.score;
            move = n.move;
        }
        
        public int getScore() {
            return score;
        }
        
        public void addHijo (Node n) {
            hijos.add(n);
        }
    }

    /**
     * The board of the game is in m_tablero
     * When function ends the move chosen will be at m_columna
     */
    public void minimax()
    {

        Node arbol = new Node();
        int v = 0;
        
        for (int i = 0; i &lt; 7; i++) {
            Tablero tablero_copia = new Tablero(m_tablero);
            //ponerFicha puts a token in a column for a player
            tablero_copia.ponerFicha(i,2);
            v = Max(tablero_copia, arbol, 1);
            arbol.addHijo(new Node(v, i)); 
        }
        
        v=0;
        for (Node item: arbol.hijos) {
            //It prints the moves and their scores
            System.out.println(&quot;Lista: Score-&gt;&quot; + item.score + &quot;, Move-&gt;&quot; + item.move);

            //Choose the best
            if (item.score &gt; v) {
                v = item.score;
                m_columna = item.move;
            }
        }
        
        
        
    }
    
    public int Max(Tablero tablero, Node n, int depth ) {
        int devuelve = -1;
        Tablero tablero_anterior = new Tablero (tablero);
        
        if (depth == NIVEL_DEFECTO) {
            //f function is the evaluation function, for getting a score given a board and a player
            return (f(tablero,2) - f(tablero,1));
          //cuatroEnRaya, returns if a player has won
        } else if (tablero.cuatroEnRaya() == 2) {
            devuelve = (Integer.MAX_VALUE) - f(tablero,1);
        } else if (tablero.tableroLleno()) {
            return 0;
        } else {
            for (int i = 0; i &lt; 7; i++) {
                tablero = tablero_anterior;
                tablero.ponerFicha(i, 1);
                devuelve = max(Min(tablero, n, depth+1), devuelve);  
                n.addHijo(new Node(devuelve, i));
            }
           
            
        }
        return devuelve;
    }
    
    public int Min(Tablero tablero, Node n, int depth) {
        int devuelve = -1;
        
        Tablero tablero_anterior = new Tablero (tablero);
        
        if (depth == NIVEL_DEFECTO) {
            return f(tablero,1) - f(tablero,2);
        } else if (tablero.cuatroEnRaya() == 1) {
            devuelve = (Integer.MAX_VALUE) - f(tablero,2 );
        } else if (tablero.tableroLleno()) {
            return 0;
        } else {
            for (int i = 0; i &lt; 7; i++) {
                tablero = tablero_anterior;
                tablero.ponerFicha(i, 2);
                devuelve = min(devuelve, Max(tablero, n, depth+1));
                n.addHijo(new Node(devuelve, i));
            }
            
        }
        return devuelve;
    }

[no name]

Научиться использовать отладчик и использовать его для отладки кода-это полезный навык для развития.

1 Ответов

Рейтинг:
2

Patrice T

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.