繁体   English   中英

FloodFill-扫雷车,需要解释

[英]FloodFill - Minesweeper, Explanation needed

我正在尝试用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);

它是一种递归算法。 您可以从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;
   }
}

(省略了对网格边界的检查)

我想您主要是在询问洪水。 实际上,这是一种简单且通用的递归算法。 它可以解决您的数据结构是1D还是2D的问题。 对于2D版本,@ RMoeller给出了答案。 对于您以前的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;
   }
}

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM