在 Samegame/Candy Crush 等消除类游戏中,当玩家消除多个相邻元素时,上方未消除的元素会按照消除元素的顺序下落填补空位。但是,如果下落的元素下方仍然存在空缺,则需要进一步下落来填补这些空位。
以一个游戏场景为例,如下图所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-----------------------------------------------
1 |@ @ # & @ @ @ @ @ & & @ # @ & |1
2 |@ # & @ & @ @ & @ # & & & @ & |2
3 |@ & # @ & & @ @ & # & & # # & |3
4 | @ # & & # & # @ # @ @ @ & |4
5 | & @ & # # # @ & @ @ & |5
6 |& & & # & @ # @ # & @ |6
7 |@ @ & & & & @ @ & # & & |7
8 |@ & @ & & & & @ @ # @ @ |8
9 |@ @ @ & @ @ # # @ # # # |9
10|# @ @ & & & # & # # & @ & # # |10
-----------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
在这个场景中,当消除第四行中的所有元素后,上方未消除的元素会按照如下方式下落:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-----------------------------------------------
1 | @ @ @ & & @ # @ & |1
2 | & @ & @ # & & & @ & |2
3 |@ @ @ @ & # & & # # & |3
4 |@ # @ # & # @ # @ @ @ & |4
5 |@ & # @ @ & # # # @ & @ @ & |5
6 |& @ # @ & @ & # & @ # @ # & @ |6
7 |@ # @ & & & & & & @ @ & # & & |7
8 |@ & & & & & & & & & @ @ # @ @ |8
9 |@ @ @ @ @ & & @ @ # # @ # # # |9
10|# @ @ & & & # & # # & @ & # # |10
-----------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2、解决方案
为了解决这个问题,我们需要对下落元素的顺序进行调整。具体做法如下:
- 首先,找到所有需要下落的元素。
- 然后,根据需要下落的元素的顺序,依次将这些元素移动到下方第一个空位。
- 重复步骤 2,直到所有需要下落的元素都移动到适当的位置。
以下代码实现了上述解决方案:
def collapse_board():
for i in range(1, 15):
empty = 9
full = empty
while empty >= 0 and full >= 0:
while empty >= 0 and game[empty][i] != ' ':
empty -= 1
if empty >= 0:
full = empty - 1
while full >= 0 and game[full][i] == ' ':
full -= 1
if full >= 0:
game[empty][i] = game[full][i]
game[full][i] = ' '
在这个代码中,外层循环遍历了所有列,内层循环遍历了每一列中的所有元素。当内层循环找到一个空位时,它会向上搜索第一个非空元素,并将该元素移动到空位处。这个过程一直持续到所有空位都被填满。
运行这个代码后,游戏场景会变成如下样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-----------------------------------------------
1 | @ @ @ & & @ # @ & |1
2 | & @ & @ # & & & @ & |2
3 |@ @ @ @ & # & & # # & |3
4 |@ # @ # & # @ # @ @ @ & |4
5 |@ & # @ @ & # # # @ & @ @ & |5
6 |& @ # @ & @ & # & @ # @ # & @ |6
7 |@ # @ & & & & & & @ @ & # & & |7
8 |@ & & & & & & & & & @ @ # @ @ |8
9 |@ @ @ @ @ & & @ @ # # @ # # # |9
10|# @ @ & & & # & # # & @ & # # |10
-----------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
现在,所有下落的元素都按照正确的顺序填补了空位。