Java gomoku minimax

1.4k Views Asked by At

I'm trying to create a strategy that will play against human or another strategy for the game Gomoku. I already have some kind of minimax function, although i don't quite understand how does it work and i also have a getscore function, which should send back the best score to minimax ? But the problem is that my getScore function does not recognize if there are 4 or 5 circles in a row/col/diagonally.

Here is my code:

public class JarmoStrategyV1 implements ComputerStrategy {

    public static int Lrow = 0;
    public static int Lcol = 0;
    public static int Drow = 0;
    public static int Dcol = 0;
    public static final int E = 0;
    public static final int X = 1; // black
    public static final int O = -1; // white
    public static final int WINSCORE = 100;
    private static final int WINCOUNT = 5;


    public Location getMove(SimpleBoard board, int player) {
        // let's operate on 2-d array
        int[][] b = board.getBoard();
        System.out.println(getScore(b, player));
        for (int row = 0; row < b.length; row++) {
            for (int col = 0; col < b[0].length; col++) {
                if (b[row][col] == SimpleBoard.EMPTY) {
                    // first empty location
                    return new Location(row, col);
                }
            }
        }
        return null;
    }


    @Override
    public String getName() {
        return "Student name";
    }
    public static int minimax(int[][] board, int player, int depth) {

        if (getScore(board, player) == WINSCORE) {
            //
            return WINSCORE;
        }

        if (depth == 2) {
            return getScore(board, player);
        }

        int max = Integer.MIN_VALUE;
        if (player == -1){
            max = Integer.MAX_VALUE;
        }

        System.out.println(max);

        List<Location> possibleMoves = getPossibleMoves(board);
        for (Location loc : possibleMoves) { 
            board[loc.getRow()][loc.getColumn()] = player;
            int newplayer = 0 - player;
            if(newplayer == 1){
                int value = minimax(board, newplayer,depth + 1);
                if(value < max) {
                    max = value;
                }
            }
            if (newplayer == -1){
                int value = minimax(board, newplayer, depth + 1);
                if (value > max) {
                    max = value;
                }
            }

            board[loc.getRow()][loc.getColumn()] = E;
        }

        return max;
    }
    public static int getScore(int[][] board, int muutuja) {

        //int yks = 0;

        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                if (board[row][col] == muutuja) {
                    if (row <= (board.length - 5)) {
                        if (col <= board.length && getCount(board, row, col, 0, 1, muutuja, WINCOUNT) >= (WINCOUNT - 1) && getCount(board, row, (col + 4), 0, 1, E, 1 ) >= 1) return 1; // - 4 in a row
                        if (row >= 1 && getCount(board, row, col, 1, 0, muutuja, WINCOUNT) >= (WINCOUNT -1) && getCount(board, (row - 1), col, 1, 0, E, 1) == 1) return 1;


                        if (getCount(board, row, col, 1, 0, muutuja, WINCOUNT) >= WINCOUNT) return 100; // | 5 in a row
                        if (col <= WINCOUNT && getCount(board, row, col, 1, 1, muutuja, WINCOUNT) >= WINCOUNT) return 100; // \
                        if (col >= WINCOUNT && getCount(board, row, col, 1, -1, muutuja, WINCOUNT) >= WINCOUNT) return 100; // /                        
                    }
                    if (col <= WINCOUNT && getCount(board, row, col, 0, 1, muutuja, WINCOUNT) >= WINCOUNT) return 100; // - 
                }
            }
        }
        return 0;
    }

    public static int getCount(int[][] board, int row, int col, int rowd, int cold, int player, int test) {

        int count = 0;
        for (int i = 0; i < test; i++) {
            if (board[row + i * rowd][col + i * cold] == player) count++;
            else break;
        }
        return count;
    }

    public static ArrayList<Location> getPossibleMoves(int[][] board) {
        ArrayList<Location> availableMoves = new ArrayList<Location>();
        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                if (board[row][col] == E) {
                    availableMoves.add(new Location(row, col));
                }
            }
        }
        return availableMoves;
    }


}

There seems to be some kind of a problem with getScore, when i run this code then i can only play for a while until my Gomoku app crashes.

If you want to try this out yourself then you can open this via Eclipse. Download the project file: http://www68.zippyshare.com/v/feWl2QwC/file.html Import it to eclipse projects/workspace. And you also have to build path to those 2 jar files in lib folder. NOTE: I can only edit files in gomoku.strategies package.

1

There are 1 best solutions below

0
On

the stacktrace shows an exception. add debug print or run with debugger

java.lang.IllegalArgumentException: It's computer's turn, pass the player to makeMove()
        at gomoku.Game.makeMove(Game.java:476)