Как составить список всех возможных ходов в игре «Подключи четыре» - PullRequest
3 голосов
/ 17 января 2020

Я делаю ИИ после этой статьи . Основная идея c заключается в использовании битбордов для создания чрезвычайно быстрого протокола для внесения изменений в доску и перехода к возможным результатам игры.

Но статья написана на python, и у меня возникли проблемы с первоначальной настройкой платы. Я пошел в github readme , на который они ссылаются, в надежде разработать основу для моего ИИ, а затем побеспокоиться об отсечке альфа-бета и машинном обучении позже. По сути, я прошел через методы для checkWin, makeMove и undoMove и установил необходимые поля для высоты столбцов, ходов, количества ходов и массива длинных переменных, представляющих битборды для игроков.

Но в настоящее время я застрял в методе генерирования ходов, потому что он пытается инициализировать все значения в верхней части битовой доски за пределами столбцов. Но в java я не могу этого сделать: просто выдает ошибку, что литеральный тип находится вне диапазона для типа long. Дополнительно, видя как ходы это int[] Я не уверен, как использовать moves.push(col). Потому что это дает ошибку, не может вызвать push(int). Ниже вы найдете неработающий метод listMoves и мой текущий код, и я буду очень признателен, если кто-нибудь скажет мне некоторые вещи, которые я могу делать неправильно в своем коде, или как исправить метод listMoves. Ура!

   private int[] listMoves() {
        int[] moves;
        long TOP = 1000000_1000000_1000000_1000000_1000000_1000000_1000000L;
        for(int col = 0; col <= 6; col++) {
            if ((TOP & (1L << height[col])) == 0) moves.push(col);
        }
        return moves;
    }

Мой код

 public class EConnectFour {
    private int[] height = {0, 0, 0, 0, 0, 0, 0};
    private int[] moves = new int[42]; // add size 
    private int counter = 0;

    private long[] bitBoard = new long[2];



    public static void main(String[] args) {



    }

    private char[][] getGameState() {
        // add code to get current gamestate 
        return new char[0][0];
    }


    private boolean isWin(long bitBoard) {
        int[] directions = {1, 7, 6, 8};
        long bb;
        for(int direction : directions) {
            bb = bitBoard & (bitBoard >> direction);
            if ((bb & (bb >> (2 * direction))) != 0) return true;
        }
        return false;
    }

    private void makeMove(int column) {
        long move = 1L << height[column]++;
        bitBoard[counter & 1] ^= move; 
        moves[counter++] = column;  
    }

    private void undoMove() {
        int column = moves[--counter];
        long move = 1L << --height[column];
        bitBoard[counter & 1] ^= move;
    }
}
...