此代码将检查12x12网格中的每个单元格,以查看它们的值是否可以传播或移动。 x是标准地砖,P是玩家,我是感染者。感染可以复制到任何相邻的瓷砖,而玩家显然从瓷砖移动到瓷砖。出于某种原因,每当我达到一定的转弯数时,我都会收到java.lang.ArrayIndexOutOfBoundsException:-1错误。
有什么想法吗? (请在问题解决之后保存调整代码,谢谢。)。)
public static void tileMovement(char t, int i, int j) {
Random rand = new Random();
int dir = rand.nextInt(3);
//System.out.println(t);
if(t == 'x') {
}
else if(t == 'I') {
double chance = Math.random();
//System.out.println(chance);
if(chance < 0.35) {
myGrid[i][j] = t;
switch(dir) {
case 0:
if(myGrid[i-1][j] == 'x'||i != 1){
myGrid[i-1][j] = t;
break;
}
else {
break;
}
case 1:
if(myGrid[i+1][j] == 'x'||i != 11){
myGrid[i+1][j] = t;
break;
}
else {
break;
}
case 2:
if(myGrid[i][j-1] == 'x'||j != 1){
myGrid[i][j-1] = t;
break;
}
else {
break;
}
case 3:
if(myGrid[i][j+1] == 'x'||j != 11){
myGrid[i][j+1] = t;
break;
}
else {
break;
}
}
}
}
else if(t == 'P'){
myGrid[i][j] = 'x'; // j = sideways, i = vertical
switch(dir) {
case 0:
if(myGrid[i-1][j] == 'x'||myGrid[i-1][j] == 'I'||i != 1){
myGrid[i-1][j] = t;
break;
}
else {
break;
}
case 1:
if(myGrid[i+1][j] == 'x'||myGrid[i+1][j] == 'I'||i != 11){
myGrid[i+1][j] = t;
break;
}
else {
break;
}
case 2:
if(myGrid[i][j-1] == 'x'||myGrid[i][j-1] == 'I'||j != 1){
myGrid[i][j-1] = t;
break;
}
else {
break;
}
case 3:
if(myGrid[i][j+1] == 'x'||myGrid[i][j+1] == 'I'||j != 11){
myGrid[i][j+1] = t;
break;
}
else {
break;
}
}
}
}
答案 0 :(得分:1)
您错误地确定了电路板的边缘。这是你的一句话:
if(myGrid[i-1][j] == 'x'||i != 1){
首先,索引从0开始。其次,在尝试访问阵列之前,先检查您是否位于左边缘。通过利用“短路”评估来做到这一点:
if (i != 0 && myGrid[i - 1][j] == 'x') {
此处,如果i
为0
,则条件为false
且永远不会评估myGrid[i - 1][j] == 'x'
,并且它没有机会抛出ArrayIndexOutOfBoundsException
1}}。
您可以类似地更改其他条件。你说这是最大的11是正确的。
顺便提一下,在每种情况下,在break
条件的两种情况下,您通常会if
,else
除了break
之外什么都不做。它在break
:
if
看起来更具可读性和简洁性
if (condition) {
// perform operation
}
break;