2013-10-28 35 views
3

我设计一个扫雷游戏,但我无法找到如何登上算法“打开”。如果你曾经玩过扫雷,第一次点击就会显示很多的扫雷。它背后的算法是什么?扫雷板“开放”

+0

这只是好醇”递归。用户点击平方(x,y)? 'show(x,y)'。在函数内部,它示出了正方形,和,*如果正方形是空白*,调用'显示(X-1,Y)','显示(X + 1,Y)','显示(X,Y-1 )'和'show(x,y + 1)'。 (也许对角线也是,我现在不记得了。) –

+0

小心永久循环。 – ChronoTrigger

回答

3

类似的东西,以flood-fill,但仅限于细胞而不任何相邻炸弹(将显示一个“0”或无值),和它们的周围细胞。

一些伪代码:

floodFill(cell) 
    if !cell.isOpen 
    cell.open() 
    if cell.hasNeighbouringBombs 
     for each neighbour n of cell 
     floodFill(n) 

注意这是怎么从“正常”洪水填充算法不同:

floodFill(cell) 
    if cell.hasNeighbouringBombs && !cell.isOpen 
    cell.open() 
    for each neighbour n of cell 
     floodFill(n) 

的原因的差别可以用一个例子可以看出。鉴于:

1 1 2 
2 0 3 
1 2 3 

正常的人会只0填写,但我们想填补所有上述情况,因此我们只需要检查hasNeighbouringBombs我们打开当前单元格后。

请注意,如果您开始关闭具有非零值的单元格,则不会打开其他单元格(至少在大多数版本的游戏中) - 这将由上述算法处理。

+0

如果你开始点击一个矿,该矿被移动到其他位置,这样你就不会在你的第一次点击死亡。 – Teepeemm

+0

@Teepeemm视游戏而定 - 有些人很高兴让你点击一个地雷开始。但基于第一次点击生成游戏似乎是一个更好的主意(但显然更复杂)。 – Dukeling

+0

@Dukeling我不太明白'!open'的意思。请你能详细说明你的伪代码中'open'的不同用法吗? – LazySloth13