如何让 Samegame/Candy Crush 游戏中的下落元素按序填补空位

在 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、解决方案

为了解决这个问题,我们需要对下落元素的顺序进行调整。具体做法如下:

  1. 首先,找到所有需要下落的元素。
  2. 然后,根据需要下落的元素的顺序,依次将这些元素移动到下方第一个空位。
  3. 重复步骤 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

现在,所有下落的元素都按照正确的顺序填补了空位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值