我想知道在四子棋场上检查赢家的最佳方法是什么。
我很感兴趣你们的想法,是否有一些“众所周知”的算法可以解决这类问题呢?
解决方案:
我用Python实现了Ardavan的哈希表解决方案。
我让算法在每个场地上运行一次。我的实现中最快的检查时间是0.047毫秒,最差的是0.154毫秒,平均为0.114毫秒,在我的Intel(R) Core(TM)2 Duo CPU T9600 @ 2.80GHz上运行。这对我的需求来说已经足够快了,而且这个算法对我来说看起来很整洁。
我想知道在四子棋场上检查赢家的最佳方法是什么。
我很感兴趣你们的想法,是否有一些“众所周知”的算法可以解决这类问题呢?
解决方案:
我用Python实现了Ardavan的哈希表解决方案。
我让算法在每个场地上运行一次。我的实现中最快的检查时间是0.047毫秒,最差的是0.154毫秒,平均为0.114毫秒,在我的Intel(R) Core(TM)2 Duo CPU T9600 @ 2.80GHz上运行。这对我的需求来说已经足够快了,而且这个算法对我来说看起来很整洁。
从John Tromp的Fhourstones基准测试中获取的源代码使用了一种迷人的算法来测试连接四游戏是否胜利。该算法使用以下比特棋盘表示游戏:
. . . . . . . TOP
5 12 19 26 33 40 47
4 11 18 25 32 39 46
3 10 17 24 31 38 45
2 9 16 23 30 37 44
1 8 15 22 29 36 43
0 7 14 21 28 35 42 BOTTOM
红色玩家和黄色玩家各有一个位棋盘。 0
表示空单元格,1
表示已填充的单元格。该位棋盘存储在一个无符号 64 位整数变量中。第 6、13、20、27、34、41、≥48 位必须为0
。
算法如下:
// return whether 'board' includes a win
bool haswon(unsigned __int64 board)
{
unsigned __int64 y = board & (board >> 6);
if (y & (y >> 2 * 6)) // check \ diagonal
return true;
y = board & (board >> 7);
if (y & (y >> 2 * 7)) // check horizontal
return true;
y = board & (board >> 8);
if (y & (y >> 2 * 8)) // check / diagonal
return true;
y = board & (board >> 1);
if (y & (y >> 2)) // check vertical
return true;
return false;
}
你需要调用上一个玩家的位棋盘函数。
我在回答"如何确定井字游戏结束?"这个问题时尝试解释了算法。
>>,*,&
在Python中具有相同的含义。当然,Python没有内置的64位整数数据类型,但具有无限精度的long
类型应该可以使用。 - Christian Ammer这与以下问题相关:如何找到任意大小的井字棋游戏的赢家?
不同之处在于7x6的棋盘中需要连成4个,而不是NxN棋盘中需要连成N个。但是轻松适应解决方案来连接4个。
编辑:实际上,将其他解决方案调整为此解决方案并不是那么容易。但是您可以进行一些额外的工作来完成它。
对于每行、每列、每条对角线和反对角线,存储每个玩家的计数,它们可以连成4个棋子。当其中一个玩家的计数达到4或更多时,请检查该行/列/对角线/反对角线是否有四个棋子相连。如果是,该玩家获胜!