我正在尝试用位板制作一个宝石迷阵级联模拟器。到目前为止,我已经能够检测并移除火柴,但现在我需要让珠宝掉下来。我的状态由一系列位板表示,每个位板对应一种宝石。我有一张所有被移除的珠宝的面具。
是否可以使用一些按位魔法来做到这一点?
两个初始位板的示例(我们假设只有两种类型的宝石,并且它是 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 https://chessprogramming.wikispaces.com/General+Setwise+Operations
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)