我只是一个Java初学者,我正在尝试做一个扫雷程序。它即将完成,但我想做一种方法,如果打开的方 block 是“0”,也可以打开相邻的方 block
这是代码。由于某种原因,它产生了我想要的一半结果,然后推出了 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;
}
最佳答案
这是我对错误的最佳猜测(我只是理解代码):
您的检查
zeroOpened[finalA-1+a][finalB-1+b]!=1
在再次调用 Zeros() 之前的 if 语句中,这不是它应该如何工作的。请注意,每次调用此方法时,该方法调用都会以新的 ZeroOpened 数组开始,并将其设置为全 0。
尝试将 ZeroOpened 数组移动到方法参数中或将其设为字段。如果这有点模糊,我认为你的程序是这样做的:
- 好的,用户点击了一个有 0 个相邻地雷的方 block 。
- 然后,通过递归,我将检查与该 0 相邻的 0。
- 因此,我输入了 Zeros() 方法
- 在 Zeros() 方法中,我创建一个新数组 ZeroOpened,它应该存储已显示的所有零。这是错误的,因为它没有考虑您之前可能在此方法的不同实例中打开的零。基本上,对于每个方法调用,您都有一个不同的 ZeroOpened 数组,这会导致您的问题。您应该只有一个 ZeroOpened 数组,因此请将其设为一个字段或将其作为参数放入 Zero 方法中。
再次声明,我无法完全理解发生了什么。为了更有效地调试,请确保您理解所有代码并打印一些内容以查看其是否有意义(例如您打开的 0 的索引)。
关于java - 即使我认为我已经退出循环,我的递归循环也会出现堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816358/