我试图制作一个简单的TicTacToe游戏。
以下是协调的代码:
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
buttons[i][j] = new XOButton();
// if((i + j) % 2 != 0){
buttons[i][j].setText(i + "," +j);
// }
p.add(buttons[i][j]);
}
}
目前,协调是从最底层开始的,如下所示:
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
但是,我希望它像这样从下到上:
2,0 2,1 2,2
1,0 1,1 1,2
0,0 0,1 0,2
我尝试通过改变循环中i和j的值来修复它:
for(int i=3;i>0;i--){
for(int j=3;j>0;j--){
buttons[i][j] = new XOButton();
// if((i + j) % 2 != 0){
buttons[i][j].setText(i + "," +j);
// }
p.add(buttons[i][j]);
}
}
然而,它没有用。它说
Exception in thread 'main' java.lang.ArrayIndexOutOfBoundsException:
我试着想出这个问题的原因,是因为我必须在数组[3] [3]之前将数据添加到数组中吗?例如,array [0] [0] ~dray [2] [3]都必须首先用数据填充?
任何帮助都将不胜感激。
答案 0 :(得分:2)
您正在使用数组的boud之外的索引。 java中的数组索引从零到数组的长度减去一。
为了避免这种类型的问题你可以循环数组的大小 buttons.length-1 和 buttons [i] .length-1
for(int i=buttons.length-1;i>=0;i--){
for(int j=buttons[i].length;j>=0;j--){
buttons[i][j] = new XOButton();
// if((i + j) % 2 != 0){
buttons[i][j].setText(i + "," +j);
// }
p.add(buttons[i][j]);
}
}
答案 1 :(得分:1)
for(int i=7;i>=0;i--){
for(int j=0;j<8;j++){
buttons[i][j] = new XOButton();
// if((i + j) % 2 != 0){
buttons[i][j].setText(i + "," +j);
// }
p.add(buttons[i][j]);
}
}
答案 2 :(得分:1)
显而易见的答案似乎是你从i = 8而不是i = 2开始。这意味着在循环的第一次传递时,i = 8和j = 8,而按钮[8] [8]显然是超出界限。
另外,你的休息条件应该是i> = 0,否则我永远不会等于0(并且你的数组的索引是从0到2)。
答案 3 :(得分:0)
你可能最好离开你的迭代器i
和j
,并在设置坐标文本时做一些数学运算。数组在Java中的工作方式,你可以做很多事情来实际重构它们的存储方式,但你当然可以构建你的存储方式的心理形象。
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
buttons[i][j] = new XOButton();
// if((i + j) % 2 != 0){
buttons[i][j].setText((buttons.length - i) + "," + (buttons[i].length - j));
// }
p.add(buttons[i][j]);
}
}
这应该让您的阵列设置好,这样他们就可以按照您描述的方式布置文本。请注意,我使用(buttons.length - i)
和(buttons[i].length - j)
来“切换”坐标以倒计时。这只是避免在代码中使用未定义常量的技巧,但从技术上来说,您可以用3
替换它们。