Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gomoku AI:如何找出是否使用位板阻止了连接?_Java_Artificial Intelligence - Fatal编程技术网

Java Gomoku AI:如何找出是否使用位板阻止了连接?

Java Gomoku AI:如何找出是否使用位板阻止了连接?,java,artificial-intelligence,Java,Artificial Intelligence,我正在用阵列位板实现一个Gomoku AI。我有8个阵列板(行、列、对角线/、对角线\),4个用于人,4个用于计算机。每个数组都保存整数,每个整数表示行、列或对角线,我可以对其执行位运算 public int[] humanRows = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 每当人类玩家或计算机选择移动时,属于该玩家的所有四个棋盘都会更新。这样,我就可以很容易地连续检查5次,这很好 for(int row: humanDiagona

我正在用阵列位板实现一个Gomoku AI。我有8个阵列板(行、列、对角线/、对角线\),4个用于人,4个用于计算机。每个数组都保存整数,每个整数表示行、列或对角线,我可以对其执行位运算

public int[] humanRows = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
每当人类玩家或计算机选择移动时,属于该玩家的所有四个棋盘都会更新。这样,我就可以很容易地连续检查5次,这很好

for(int row: humanDiagonals){
        if ((row & (row>>1) & (row>>2) & (row>>3) & (row>>4)) != 0){
            return humanPiece;
        }
    } 
但现在问题来了。我希望能够找到所有模式(开放式4、4-one-end-blocked等)以输入我的评估函数。但我无法检查connect-4是否已被阻止,因为我无法使用位板表示正方形的所有3种状态(空、X填充、O填充)。如果我使用&运算符合并位板,所有填充的方块将仅表示为1,我将无法区分它们。 我有一个类似于下面的方法,但正如您所看到的,它没有考虑阻塞的端点

 public int comboCount(String combo, int[] board) {
    int count = 0;
    int len = combo.length();
    for (int row : board) {
        if (row != 0) { // if the row is not empty
            int shiftedRow = row;
            for (int i = 0; i < len; i++) {
                int temp = row >> i;
                shiftedRow &= temp;
            }
            String rowString = Integer.toBinaryString(shiftedRow);
            for (int k = 0; k < rowString.length(); k++) {
                if (rowString.charAt(k) == '1') {
                    count += 1;
                }
            }
        }
    }
    return count;
}
public int-comboCount(字符串组合,int[]板){
整数计数=0;
int len=combo.length();
用于(int行:板){
如果(行!=0){//如果行不是空的
int shiftedRow=行;
对于(int i=0;i>i;
移位行&=温度;
}
String rowString=Integer.toBinaryString(shiftedRow);
对于(int k=0;k

有人能帮我找到解决办法吗。我有一种感觉,这个问题有一个简单的解决方案,但我无法集中注意力。这是我第一次修补bits,如果可能的话,请简化解决方案

您只需先检查单面是否有四合一排(但不是更长),然后检查合并板是否有更长的排

使用这些方便的功能

private static boolean hasFourInRow(int row){
    return (row & (row >> 1) & (row >> 2) & (row >> 3)) != 0;
}

private static boolean hasFiveInRow(int row){
    return (row & (row >> 1) & (row >> 2) & (row >> 3) & (row >> 4)) != 0;
}

private static boolean hasSixInRow(int row){
    return (row & (row >> 1) & (row >> 2) & (row >> 3) & 
            (row >> 4) & (row >> 5)) != 0;
}
这是您可以轻松检测您提到的案例的方法:

public static void main(String[] args) {
    int humanRow = 0b00011110;
    int computerRow = 0b00100001;

    if (hasFourInRow(humanRow) && !hasFiveInRow(humanRow)){
        int combinedRow = humanRow | computerRow;

        if (!hasFiveInRow(combinedRow)){
            System.out.println("Open 4!");
        } else if (!hasSixInRow(combinedRow)){
            System.out.println("4-one-end-blocked!");
        } else {
            System.out.println("4-both-ends-blocked!");
        }
    }       
}

谢谢你的回答,但这并不能真正回答我的问题。我在寻找一块板上所有4个单端人为阻塞的总计数。如果每一行只出现一个这样的模式,那么您的解决方案可以很好地工作,但是对于像Oxxx-OOOOXXXXO-这样的情况,它不起作用,在这种情况下,过多的碎片使得在不添加一些已经计数的模式的情况下很难计算合并板。我明白您的意思。那么,对于这样的行,预期的输出是什么呢?对于上面的情况,我希望得到一个4-one-end-blocked、0-4-in-a-row和1-4-tware-end-blocked的输出