Java 连接四个左移右移索引超出范围
我正在尝试用我在网络中找到的ai实现一个connect 4,我给了它一点扭曲。我想加一个左移右移。 左移-ABCDEFG->GABCDEF 右移-ABCDEFG->BCDEFGA 我试着把这个加入到法律行动中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;}
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--];
}
}