我只是一个Java初学者,我正在尝试做一个扫雷程序。它已接近完成,但我想做一个方法,如果打开的方格是“0”,也打开相邻的方块
这是代码。由于某种原因,它产生了我想要的一半结果,然后推出了StackOverflowError。
变量:
finalA = buttons row
finalB = buttons column
buttons = button containing mine etc.
value = value showing mines adjacent to the square
rows = total rows
columns = total columns
以下是代码:
public static JButton[][] zeros(int finalA, int finalB, JButton[][] buttons, int[][] value, int rows, int columns){
int a,b;
//I found a reason for one Stack Overflow already. It was because when there was 2 zeros adjacent the code started to "jump inbetween them". I don't know why this didn't fix the whole problem.
int[][] zeroOpened = new int[rows][columns];
for (a = 0 ; a < rows ; a++){
for (b = 0 ; b < columns ; b++){
zeroOpened[a][b] = 0;
}
}
for(a=0 ; a<3 ; a++){
for(b = 0 ; b<3 ; b++){
if(value[finalA-1+a][finalB-1+b] == 0 ){
buttons[finalA][finalB].setText("0");
zeroOpened[finalA][finalB] = 1;
//this produces the error. The first part blocks Out of bounds exception, at least I think so. Second part doesn't work. It works for a while and then produces StackOverflow.
if(finalA-1+a < rows && finalA-1+a > 0 && finalB-1+b < columns && finalA-1+b > 0 && zeroOpened[finalA-1+a][finalB-1+b]!=1)
{
zeros(finalA-1+a,finalB-1+b,buttons,value,rows,columns);
}
}else{
if(finalA-1+a < rows && finalA-1+a > 0 && finalB-1+b < columns && finalA-1+b > 0)
{
buttons[finalA-1+a][finalB-1+b].setText("" + value[finalA-1+a][finalB-1+b]);
}
}
}
}
return buttons;
}
答案 0 :(得分:1)
这是我对错误的最佳猜测(我只是理解代码):
您的检查
zeroOpened[finalA-1+a][finalB-1+b]!=1
再次调用zeros()之前的if语句中的不是它应该如何工作的。请注意,每次调用此方法时,该方法调用都以新的zeroOpened数组开始,并且设置为全0。
尝试将zeroOpened数组移动到方法参数中或将其设为字段。如果这有点模糊,我认为这是你的程序:
同样,免责声明,我无法完全理解发生了什么。为了更有效地进行调试,请确保您了解所有代码并打印一些内容以查看它是否有意义(例如您打开的0的标记)。
答案 1 :(得分:0)
由于在下面的代码中进行了递归调用,堆栈溢出即将到来。
if(finalA-1+a < rows && finalA-1+a > 0 && finalB-1+b < columns && finalA-1+b > 0 && zeroOpened[finalA-1+a][finalB-1+b]!=1)
{
zeros(finalA-1+a,finalB-1+b,buttons,value,rows,columns);
}
您正在递归调用函数zeros()。优化代码或增加VM参数中的堆栈大小