我正在开发井字游戏,我需要算法来检查游戏何时结束(以及谁赢了)。在3x3游戏中,我会检查每种可能的获胜情况(有8种能力)。但在7x7中(需要4个星座在一排或一列,或对角线)是许多可能的获胜模式。
发布于 2011-08-13 02:55:43
虽然一种非常基本的方法是查看每个单元格在所有方向上的运行,但这里有一种方法,它只检查一条“线”中的单元格一次。"line“是指可能获胜的行、列或对角线,就像在拉斯维加斯的老虎机中那样:)
对于每个“wins.”,移动到“”开始,并将计数器设置为0。
- If the cell is P1 and counter is negative, set counter to 0
- If the cell is P2 and counter is <= 0, subtract one from counter
- If counter = -4 then P2 wins
- If the cell is P2 and counter is positive, set counter to 0
重要信息编辑:如果单元格既不包含P1也不包含P2,请将计数器重置为0 (doh!)。我省略了这个琐碎但必需的步骤。否则"11-11“将被算作胜利。
给定起始点和每次迭代的行/列偏移量(例如,从NW到SE的最长对角线的起点(0,0)和前进(1,1) ),可以遍历“线”。当然,长度小于4的对角线可以避免被完全检查。
祝你编码愉快。
发布于 2011-08-13 05:15:44
如果您为每个玩家使用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
如果玩家占据了游戏板中的一个位置,则相关联的位将为1
否则为0
(请注意,位7,15,23,...是0
)。要检查玩家是否有获胜的棋盘,您可以使用以下函数:
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;
}
借助一个例子,我将尝试解释:下面的一个玩家的位板包括在第一行的垂直和对角获胜旁边的获胜组合。
0101010
1110111
0111011
1101110
0001000
1010101
0011110 ... four occupied positions --> winning board
水平检查的步骤如下:
y = board & (board >> 8)
0101010 0010101 0000000 1110111 0111011 0110011 0111011 0011101 0011001 1101110 & 0110111 = 0100110 0001000 0000100 0000000 1010101 0101010 0000000 0011110 0001111 000111110
y & (y >> 2 * 8)
0000000 0000000 0000000 0110011 0001100 0000000 0011001 0000110 0000000 0100110 & 0001001 = 0000000 0000000 0000000 00000 0000000 0001110 0000011 0000010
水平检查的结果是一块设置了一位的板,这意味着板包括一个win,并且函数返回true
。
我已经使用similar function检查了一个connect four游戏是否获胜。我在John Tromp的The Fhourstones Benchmark源代码中看到了这个有趣的功能。
发布于 2011-08-13 02:32:30
循环遍历所有位置。对于每个位置,检查向下、对角线、向下、向右和向右四个字段(始终包括字段本身)。进行适当的检查,以避免在检查不存在的字段时炸毁应用程序。
https://stackoverflow.com/questions/7044670
复制相似问题