提问人:Marcell 提问时间:11/3/2023 更新时间:11/3/2023 访问量:48
使用位板和位操作推送磁贴
Pushing tiles using bitboards and bit operations
问:
Am目前正在编写一个有点像国际象棋的游戏,其中包括一个“推动”机制。为此获得有效的算法似乎难以捉摸。
以下是详细信息。我代表一个NxM环形板(是的,这个游戏可以在不同大小的板上玩,所以我需要泛化)的图块有9个位板(3个用于图块类型,2个用于拥有这些图块的两个玩家,4个用于他们的方向)。请注意,三种类型的磁贴中,有一种没有所有者或旋转。这可能无关紧要,但只是表明位板不会完全喜欢,可以这么说。
在游戏中,您可以拿起一块瓷砖并将其推向四个方向之一。如果你推它的地方没有瓷砖,那就太好了,它喜欢那里。但是,如果那里有一块瓷砖,那么它也会被推动,依此类推,直到有一个空白区域,或者我们已经完全绕到开头(请记住,棋盘从左到右和从上到下包裹。
我正在寻找一种高效的解决方案,基本上只使用查找和位操作。
我看到了一些部分(尽管如果有人有更优雅的解决方案,请告诉。
- 计算起始推送位置和第一个空图块之间的距离(如果我们一直绕行,则最大)。这实际上应该是一个查找表,因为这非常慢。无论哪种方式,这都会返回一个长度为“111”的掩码。这将一起使用前 3 个位板(带 |),以确保所有图块都可以推送所有图块。其余部分将作用于每个单独的位板。
- 对于所有 9 个位板,请提取此掩码。(遮罩和位板)
- 对于所有提取的“图块”,保存最后一个图块(这是为了防止我们已经绕行),然后从提取的图块集中删除。(面膜_last和提取物)
- 我不知道该怎么做的部分:旋转剩余的瓷砖。由于环形板,这很难,我不知道该怎么做。
- 放置保存的“最后一个图块”并将其放入第一个图块的原始位置。(已保存 | shifted_mask)
- 返回并从所有 9 个位板中删除此旋转的图块。(位板 & ~掩码)
- 添加新旋转的磁贴:(rotated | bitboard_with_deletions)
如何执行第 4 步?还是我忽略了另一种更优雅的方式?
答: 暂无答案
评论