检查 6x6 位板对齐的快速方法

Fast way of checking for alignment of in a 6x6 bitboard

我正在尝试找到一种快速检查 5 位 6x6 板 中各个方向对齐的方法(对角线、水平、垂直)。该板表示为位板,因为它们非常快。

位板是这样的:

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) 正如我在许多位板的井字游戏实现中看到的那样。这里的问题是,与我在其他游戏中看到的其他解决方案相比,此实现非常慢,例如连接四 (https://spin.atomicobject.com/2017/07/08/game-playing-ai-bitboards/)

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

例如,假设棋盘名为 x,则 m = x & (x >> 1) & (x >> 2) & (x >> 3) & (x >> 4) 计算一个掩码,其中每一位表示它是否是 5 horizontally-consecutive 组位(包括范围)的开始环绕不同的行)。如果 m 设置了前两列中的任何一位,则表示该位是获胜位置的第一位。这是一个廉价的测试:(m & 0b000011000011000011000011000011000011) != 0。一起负责检查 10 个操作中的 12 个获胜位置。

同样的方法可以用于垂直对齐,但是偏移量变成了 6, 12, 18, 24 而不是 1, 2, 3, 4 并且掩码变成了 0b000000000000000000000000111111111111.

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

  • 偏移量 7、14、21、28,掩码 0b000011000011
  • 偏移量为 5、10、15、20,掩码为 0b110000110000

但是只有8个对角线获胜位置,最终要花费20次操作来检查它们,这不是很好。由于减少了 检查 的数量,它可能仍然有帮助,即使它是更多的操作,但它也可能无济于事,或者更糟。

如果您愿意,可以将检查次数减少到 1,方法是将 winning-position 位组合在一起并只执行一个 != 0.