4 Gewinnt MinMax Algorhytmus

Phänox

Aktives Mitglied
Hallo,

Ich habe ein 4 Gewinnt programmiert. Was nicht läuft ist der Computer ich bekomme ne endlosschleife und weiß nicht warum.
Algorhytmus:
Java:
private int computerzug(Color[][] board, int depth, Color spielerFarbe) 
    {
        if(getGameLogic().hasWon(board, spielerFarbe))
        {
            return -10 -depth;
        }
        if(getGameLogic().hasDraw(board))
        {
            return 0;
        }
        int max = Integer.MIN_VALUE;
        int index = 0;
        for(int i =0;i<board[0].length;i++)
        {
            if(board[0][i].equals(Color.WHITE))
            {
                Color[][] board1 = new Color[board.length][board[0].length];
                board1 = copy(board);// methode um das board zu kopieren es ensteht eine endlosschleife warum auch immer
                // falls ich hier clone() oder sytsem.copy nehme dann geht er nur 42 mal in die mehtode heißt er macht wieder 
                // ne verknüpfung
                board1[getRow(board, i)][i] = spielerFarbe;
                int moval = -computerzug(board1, depth+1, (spielerFarbe.equals(Color.BLUE)?Color.RED:Color.BLUE));
                if(moval> max)
                {
                    max = moval;
                    index = i;
                }
            }
        }
        if(depth==0)
        {
            col = index;
            row = getRow(this.board, index);
            System.out.println(test);
        }
        return max;
    }
Board kopier Methode
Java:
private Color[][] copy(Color[][] board)
    {
        Color[][] copyBoard = new Color[board.length][board[0].length];
       
        for(int i = 0;i<board.length;i++)
        {
            for(int j = 0;j<board[0].length;j++)
            {
                copyBoard[i][j] = new Color(board[i][j].getRed(), board[i][j].getGreen(), board[i][j].getBlue());
            }
        }
       
        return copyBoard;
    }
wenn ich das board per .copy kopiere klappt es auch nicht. jemand ne Idee ? gerne auch generelle verbesserungsvorschläge :)
 

Flown

Administrator
Mitarbeiter
Nachdem Color eine immutable Klasse kannst du das Kopieren vereinfachen:
Java:
private Color[][] copy(Color[][] colors) {
  Color[][] copy = colors.clone();
  for (int i = 0; i < colors.length; i++) {
    copy[i] = colors[i].clone();
  }
  return copy;
}
Oder mit Streams:
Java:
private Color[][] copy(Color[][] colors) {
  return Stream.of(colors).map(Color[]::clone).toArray(Color[][]::new);
}
Wie wird denn deine computerzug Methode aufgerufen?
Poste doch mal die genaue Fehlermeldung!
 
Zuletzt bearbeitet:

Phänox

Aktives Mitglied
Ich bekomm keinen Fehler :/ sondern er ist in einer endlosschleife drin und ich sehe da aber keine :( der tip mit Streams ist sehr hilfreich einfach weil es viel schönder aussieht danke dafür schon mal :)
Methode die aufgerufen wird wenn der Computer dran ist
Java:
/**
     * die methode wird ausgeführt sobald der computer am zug ist
     */
    @Override
    public Point move(GameToken[][] board, int depth, Color spielerFarbe)
    {
        // erstelle neues board
        this.board = new Color[board.length][board[0].length];
        // erstelle neues board
        Color[][] playboard = new Color[board.length][board[0].length];
        // befüffle beide
        for(int i = 0;i<board.length;i++)
        {
            for (int j = 0;j<board[i].length;j++)
            {
                playboard[i][j] = board[i][j].getColor();
            }
        }
        for(int i = 0;i<board.length;i++)
        {
            for (int j = 0;j<board[i].length;j++)
            {
                this.board[i][j] = board[i][j].getColor();
            }
        }
     
        // minmax wird "gestartet"
        computerzug(playboard,depth, spielerFarbe);
     
        return new Point(row, col);
    }
da ich kommentare drin habe ersetze ich dort mal noch nicht den code durch Streams ähm meine idee ist das nachdem der MinMax fertig ist ein Punkt zurück gegeben wird und der punkt dann row und col des 4 gewinnts enthält aber wie gesagt er ist in einer endlosschleife in der computerzug methode. Genauer gesagt er geht einfach unendlich oft in die computerzug methode,obwohl er auch in die unentschieden und sieg ifs reingeht und ich weiß einfach nicht warum
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben