快速检查6x6位板中的对齐情况



我正试图找到一种快速的方法来检查6x6板5位在所有方向(对角线、水平、垂直(上的对齐情况。该板被表示为比特板,因为它们非常快。

比特板是这样的:

00 01 02 03 04 05   
06 07 08 09 10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
30 31 32 33 34 35   

对齐的一些示例:

// Vertical Alignment
0 1 0 0 0 0   
0 1 0 0 0 0   
0 1 0 0 0 0   
0 1 0 0 0 0   
0 1 0 0 0 0   
0 0 0 0 0 0 
// Diagonal Alignment
0 0 0 0 0 0   
0 0 0 0 0 1   
0 0 0 0 1 0   
0 0 0 1 0 0   
0 0 1 0 0 0   
0 1 0 0 0 0 

我已经尝试过循环浏览每一个可能的比特板获胜位置,并检查了((winningPosition & currentPosition) != 0),正如我在比特板的许多井字游戏中看到的那样。这里的问题是,与我在其他游戏(如connect four(中看到的其他解决方案相比,这种实现非常缓慢(https://spin.atomicobject.com/2017/07/08/game-playing-ai-bitboards/)

一些测试可以分组在一起。

例如,假设板被称为x,那么m = x & (x >> 1) & (x >> 2) & (x >> 3) & (x >> 4)计算一个掩码,其中每个比特指示它是否是5个水平连续设置比特的开始(包括跨不同行的范围(。如果m设置了前两列中的任何一个比特,那么这意味着该比特是获胜位置的第一个比特。这是一个廉价的测试:(m & 0b000011000011000011000011000011000011) != 0。这将在10次操作中检查12个获胜位置。

相同的方法可以用于垂直对准,但是偏移量变为6、12、18、24而不是1、2、3、4,并且掩模变为0b000000000000000000000000111111111111

同样的方法也可以用于对角线,

具有0b000011000011掩模的7、14、21、28的
  • 偏移量
  • 掩模为0b110000110000时偏移量为5、10、15、20

但只有8个对角线获胜位置,以这种方式检查它们最终需要20次操作,这不是很好。由于减少了检查的次数,即使是更多的操作,它仍然可能有所帮助,但也可能没有帮助,甚至更糟。

如果您愿意,可以通过将获胜位置位进行"或"运算并只执行一个!= 0,将检查次数减少到1。

最新更新