FloodFill - 扫雷,需要说明

时间:2012-12-28 21:33:35

标签: java algorithm flood-fill

我正在尝试用Java制作类似扫雷的游戏,我已经完成了大部分工作,但我需要帮助的是FloodFill - http://en.wikipedia.org/wiki/Flood_fill。没有真正帮助......但有人可以解释它是如何工作的吗?我看过网上但我并不真正理解这个解释,所以我在这里问一下会更容易。

在我的扫雷中,我有:

JButton[] btn = new JButton[100]//buttons being clicked and displaying the values/bombs
int[] mines = new int[100];//int array holding the values for each button.

网格是10x10网格,所以说你点击的按钮是btn [14],

btn[4]  // north of btn[14](14-10)
btn[24] // south of btn[14](14+10)
btn[13] //  west of btn[14](14-1)
btn[15] //  east of btn[14](14+1)

回到这个问题,有人可以向我解释一下吗?

修改 我将我的代码更改为2D,而不是上面的代码现在是

btn[1][4]//row one, column 4

单击该按钮时,我希望它检查名为mines [] []的变量,该变量具有值,如果该值等于0(在初始单击的周围),则更改BG

btn[x][y].setBackground(Color.GRAY);

2 个答案:

答案 0 :(得分:6)

它是一种递归算法。您从2D网格[x,y]中的某个起始位置开始,然后向所有方向查看并填写它们,如果可以的话。如果(x,y)无法填充,请返回。

void floodFill( int x, int y ) {
   if ( btn( x, y ) isFillable ) {
       fillBtn(x,y);
       floodFill( x+1, y );
       floodFill( x-1, y );
       floodFill( x, y-1 );
       floodFill( x, y+1 );
   } else {
       return;
   }
}

(无限制检查网格边界)

答案 1 :(得分:1)

我想你主要是询问有关填埋的问题。 实际上它是一种简单而常见的递归算法。它可以解决您的数据结构是1D还是2D的问题。 对于2D版本,@ RMille给出了答案。 对于之前的1D声明,它也是这样的:

void floodFill( int pos ) {
   if ( btn( pos ) isFillable ) {
       fillBtn(pos);
       floodFill( pos+1 );
       floodFill( pos-1 );
       floodFill( pos+10 );
       floodFill( pos-10 );
   } else {
       return;
   }
}

你应该记住的一件事是,floodfill和几乎所有的递归算法都需要检查边界。否则你可能会陷入无限循环或得到错误的结果。 在上面的例子(1D版本)中,你应该检查是否: pos> = 1&& pos< = 100 与要检查的2D版本类似: x> = 1&& x< = 10&& y> = 1&& y< = 10

希望这有帮助。