我正在尝试制作一个宝石串级模拟器与比特板。到目前为止,我已经能够探测到并移除火柴,但现在我需要让珠宝掉落我的状态由一个比特板列表表示,每种类型的宝石一个。我有一个摘下所有珠宝的面具。
有没有可能用一些按位的魔法来做这个?
两个初始位板的示例(假设只有两种类型的宝石,并且是4x4板而不是8x8)第一位是左下角,第四位是左上角,最后一位是右上角。

0 0 1 1    1 1 0 0
1 0 0 0    0 1 1 1
1 1 1 1    0 0 0 0
0 0 1 0    1 1 0 1

删除匹配项后:
0 0 1 1    1 1 0 0
1 0 0 0    0 0 0 0
0 0 0 0    0 0 0 0
0 0 1 0    1 1 0 1

使用的掩码是:
0 0 0 0
0 1 1 1
1 1 1 1
0 0 0 0

在重力作用下,它应该看起来像:
0 0 0 0    0 0 0 0
0 0 0 0    1 0 0 0
1 0 1 1    0 1 0 0
0 0 1 0    1 1 0 1

这是用整数实现的,步骤如下:
[43814, 21721]       # Initial state
[35076, 4249], 26210 # State after matches have been removed, mask used to remove matches
[8962, 4149]         # State after gravity has been applied

最佳答案

为了降低你需要移动你的面具一排位移使用掩码从上面的行中选择位,并使用位移位和ORing将所选位向下复制一行。简单的算法是将掩码循环到最上面,然后逐行向下移动。但是,优化可以是使用位移扩展掩码,使用self进行oring操作,然后使用一次操作将所有以上的位下移。
象棋wiki是位板操作的好来源:https://chessprogramming.wikispaces.com/General+Setwise+Operations

08-27 17:58