此代码将检查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;
}
}
}
}
您错误地确定了板的边缘。这是你的一行:
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
。
你可以类似地改变你的其他条件。你说得对,11是这里的最大值。
顺便说一句,在每种情况下,通常在if
条件的两种情况下都是break
,而else
只做break
。在if
:之外仅使用break
看起来更可读、更简洁
if (condition) {
// perform operation
}
break;