Я делаю ИИ после этой статьи . Основная идея 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;
}
}