我正在尝试制作一个带有位板的 gem 迷阵级联模拟器。到目前为止,我已经能够检测并移除火柴,但现在我需要让珠宝掉下来。我的状态由一个位板列表表示,每个位板对应一种 gem 。我有一个所有被移除的珠宝的面具。
是否可以使用一些按位魔术来做到这一点?
两个初始位板的示例(假设只有两种类型的珠宝,并且它是 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
最佳答案
要降低位数,您需要使用位移位将掩码向上移动一行。使用掩码从上面的行中选择位,并使用位移和或运算将所选位向下复制一行。简单的算法会将掩码循环到顶部并逐行向下移动。但优化可能是通过位移位和自身或运算来扩展掩码,然后通过单个操作将所有以上位向下移动。
棋盘操作的良好来源是国际象棋维基:https://chessprogramming.wikispaces.com/General+Setwise+Operations
关于python - 应用重力的镶嵌钻头板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524678/