我想知道在连接四领域检查获胜者的最佳方法是什么。
我对你们的想法感兴趣,是否对这类问题有一些“众所周知的”算法?
解决方案:
我用Python实现了Ardavan的哈希表解决方案。
我让算法在每个字段上运行一次。我的实现的最佳检查时间是0.047毫秒,最差的0.154毫秒和我的英特尔(R)酷睿2双核CPU T9600 @ 2.80GHz上的平均0.114毫秒。这足以满足我的需求,算法看起来很整洁。
答案 0 :(得分:26)
来自John Tromp的Fhourstones Benchmark的源代码使用了一种迷人的算法来测试连接四游戏以获得胜利。该算法使用以下bitboard表示游戏:
. . . . . . . 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;
}
您必须为执行最后一步的玩家的位板调用该功能。 我尝试在我的answer to the question "How to determine game end, in tic-tac-toe?"中解释算法。
答案 1 :(得分:7)
每个单元格最多只能归类为12个获胜组合。 (4水平,4垂直和4对角线)。每个组合将有4个单元,包括正在考虑的单元。对于靠近两侧的细胞来说,这些数字会更低。因此,预编译这些组合并存储相关单元格的哈希散列是有意义的,这可以使单个游戏成为赢家。这样,在每个单元格为玩家之后,您只需拉出相关的组合/单元格以检查它是否是赢家。
答案 2 :(得分:1)
这与此问题有关:How to find the winner of a tic-tac-toe game of any size?
扭曲是7x6板,连续4个获胜,而不是连续N赢得的NxN板。但是,使解决方案适应NxN tic tac toe以连接4是微不足道的。
编辑:实际上,让其他解决方案适应这个问题并不是一件容易的事。但是你可以通过一些额外的工作来实现目标。为每个玩家存储每个玩家的计数,每行,列,对角线和反对角线可以连续4件。当任一玩家的计数达到4或更多时,检查该行/列/对角线/反对角线是否连续有四个部分。如果是的话,该玩家获胜!