连接四个位

Connect Four Bitboard

本文关键字:四个 连接      更新时间:2023-10-16

在这篇文章中,有一个非常有趣的建议,用于测试使用Bitboard的四个胜利。

董事会具有这样的结构:

6 14 22 30 38 46 54
5 13 21 29 37 45 53
4 12 20 28 36 44 52
3 11 19 27 35 43 51
2 10 18 26 34 42 50
1  9 17 25 33 41 49
0  8 16 24 32 40 48

他们还建议使用以下算法,仅使用8个班次进行胜利测试:

bool haswon(int64_t board)
{
    int64_t y = board & (board >> 7);
    if (y & (y >> 2 * 7)) // check  diagonal
        return true;
    y = board & (board >> 8);
    if (y & (y >> 2 * 8)) // check horizontal -
        return true;
    y = board & (board >> 9);
    if (y & (y >> 2 * 9)) // check / diagonal
        return true;
    y = board & (board >> 1);
    if (y & (y >> 2))     // check vertical |
        return true;
    return false;
}

我想在我编写的类似程序中实现此算法。但是,要应用我的启发式功能,我需要能够说出给定的行中有多少件。我真的一直在试图将头缠绕在该算法上,但是我不知道如何连续只有1、2或3片。

现在,我只是在每行迭代,并计算位,但是我敢肯定,使用Shifts必须有更好的方法。

对于第0行,您可以这样做:

int64_t row0 = board & 0x01010101010101LL;
row0 += row0 >> 32;
row0 += row0 >> 16;
row0 += row0 >> 8;
return row0 & 0xff;

对于其他行类似(首先按行号移动)。实际上,您可能会一次执行两行,因为计数总是适合3位。

int64_t x = board & 0x11111111111111LL;
x += x >> 32;
x += x >> 16;
x += x >> 8;
int row0 = x & 0xf;
int row4 = (x >> 4) & 0xf;