Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 连接四个左移右移索引超出范围_Java_Arrays - Fatal编程技术网

Java 连接四个左移右移索引超出范围

Java 连接四个左移右移索引超出范围,java,arrays,Java,Arrays,我正在尝试用我在网络中找到的ai实现一个connect 4,我给了它一点扭曲。我想加一个左移右移。 左移-ABCDEFG->GABCDEF 右移-ABCDEFG->BCDEFGA 我试着把这个加入到法律行动中 public boolean placeMove(int column, int player){ //if(!isLegalMove(column)) {System.out.println("Illegal move!"); return false;}

我正在尝试用我在网络中找到的ai实现一个connect 4,我给了它一点扭曲。我想加一个左移右移。 左移-ABCDEFG->GABCDEF 右移-ABCDEFG->BCDEFGA 我试着把这个加入到法律行动中

public boolean placeMove(int column, int player){         
    //if(!isLegalMove(column)) {System.out.println("Illegal move!"); return false;}
    if (column == 8){
        for (int x = 0; x < 6; x++) {
            for (int y = 0; y < 7; y--) {
                if(y == 0){
                    board[x][0] = board[x][6];
                }
                else board[x][y] = board[x][y--];
            }
        }
    }
    else if (column == 9){
        for (int x = 0; x < 6; x++) {
            for (int y = 0; y < 7; y++) {
                if(y == 5){
                    board[x][5] = board[x][0];
                }
                else board[x][y] = board[x][y++];
            }
        }
    }
    else {
        for(int i=5;i>=0;--i){
            if(board[i][column] == 0) {
                board[i][column] = (byte)player;
                return true;
            }
        }
    }
    return false;
}
for(int x=0;x<6;x++){
对于(int y=0;y<7;y--){
如果(y==0){
董事会[x][0]=董事会[x][6];
}
else board[x][y]=board[x][y--];
}
}
在第二个for循环中,y=0,然后递减y并尝试在“else board[x][y]=board[x][y--]”中访问它,在这里再次递减。在第一次迭代之后,y将是-1。这不是有效的索引。我会再次检查这个逻辑,如果必须的话,写出每个迭代,写出什么值是什么


在整个过程中,您将对y值进行双倍递增/递减

在问答网站上,阅读足够多的问题以了解人们对他们的期望是一个好主意。例如,一次又一次地,这里的人们被告知将错误信息复制并粘贴到问题中。Java错误告诉您发生错误的模块、方法和行号,没有理由猜测所有这些,也没有理由从(可能不完整的)源代码中找出它但没有stacktrace,这只是一个猜测。“左移-ABCDEFG->GABCDEF”不,
ABCDEFG
->
GABCDEF
是一个带环绕的右移。要在适当的位置执行这种右移,您需要获取最后一个值(
G
)并将其临时存储在hold变量中,然后将倒数第二个复制到倒数第二个,倒数第三个复制到倒数第二个。。。第一个到第二个,最后将保持值放入第一个位置。在您的代码中,没有任何地方会将值存储在临时保留中,因此即使代码没有引发异常,也肯定不会使用换行,因为某些值肯定会被覆盖。这
for(int y=0;y<7;y--)
将快速放置
y=-1
,当您尝试
board[x][y]=board[x][y--]时,这肯定会导致数组索引超出范围。
。除此之外,可能还有其他地方的代码不起作用。您好,谢谢您的快速回复。我也注意到了它,并将它替换为for(int y=5;y>=0;y--){if(y==0){board[x][0]=board[x][6];}else board[x][y]=board[x][y--];}它删除了错误,但它仍然不会改变值。您仍然将y递减两次,第一次是在else语句中,第二次是在每次迭代之后。这是故意的吗?你会跳过萨尔索!y—使用该值后递减。所以board[x][y]=board[x][y--]没有替换任何内容,因为在操作后y将取y-1的值。相反,请尝试board[x][y]=board[x][y-1]holy。我忘了减量和-1不一样。非常感谢。我还用y+1替换了右移,但是它返回了一个索引越界异常。我将在纸上模拟它,在if(列==9)中,直到y==7。您在那里有一个if(y==5)的检查,但是如果y==6,它将尝试设置board[x][y]=board[x][y+1],其中y+1是7并且超出范围
byte[][] board = new byte[6][7];

public Board1(){
    board = new byte[][]{
        {0,0,0,0,0,0,0,},
        {0,0,0,0,0,0,0,},
        {0,0,0,0,0,0,0,},
        {0,0,0,0,0,0,0,},
        {0,0,0,0,0,0,0,},
        {0,0,0,0,0,0,0,},    
    };
} 
    for (int x = 0; x < 6; x++) {
        for (int y = 0; y < 7; y--) {
            if(y == 0){
                board[x][0] = board[x][6];
            }
            else board[x][y] = board[x][y--];
        }
    }