我正在制作Java扫雷作为一个简单的项目,但程序永远不能计算正确的炸弹数量。这是我写的函数numFunction(),它找到触摸x和y线的所有可能组合,并在所有这些组合上进行迭代。注意,我在这里使用了try/catch来消除任何索引错误:
public static int numTouching(int x, int y){
int n=0;
//define every possible coordinate touching the bomb
//iterate through the lists of coordinates to count the number of touching bombs
int[]xCords = {x-1, x, x+1};
int[]yCords = {y-1, y, y+1};
if(board[x][y] != "B"){
try{
for(int i=0; i<xCords.length; i++){
for(int j=0; j<yCords.length; j++){
int xPos = xCords[i];
int yPos= yCords[j];
if(board[xPos][yPos]=="B" && board[xPos][yPos]!=board[x][y]){
n++;
board[x][y]=n;
}
}
}
}
catch(Exception e){}
}
return n;
}
下面是这个程序的输出示例(我想让所有接触B的元素都被设置为1):
Column count = 3
0 0 0
0 B 0
0 1 1
Num touching (0,1): 0
Num touching (1,0): 0
0 0 0
0 B 0
0 1 1
奇怪的是,它根据xcord和ycord中元素的顺序而变化(似乎每个数组只有前两个值重要)。例如,如果xcord = {x, x-1, x+1},并且ycord = {y, y-1, y+1},则示例输出如下:
Column count = 3
0 0 0
0 B 1
0 1 0
Num touching (0,1): 0
Num touching (1,0): 0
0 0 0
0 B 1
0 1 0
提前感谢。
您的问题是由于java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds
,您无法看到,因为您没有在catch
语句中打印异常。请在您的catch
语句中添加e.printStackTrace();
以查看此操作。
所有你需要做的就是检查你的索引是否有效,下面的代码放在你的=="B"
检查对我来说是有效的(也正如Holger所说,你应该使用.equals("B")
而不是=="B"
)
if (xPos < 0 || yPos < 0 || xPos >= board.length || yPos >= board[0].length) {
continue;
}