首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定游戏结束,在井字游戏中?

如何确定游戏结束,在井字游戏中?
EN

Stack Overflow用户
提问于 2011-08-13 02:29:17
回答 4查看 7.7K关注 0票数 4

我正在开发井字游戏,我需要算法来检查游戏何时结束(以及谁赢了)。在3x3游戏中,我会检查每种可能的获胜情况(有8种能力)。但在7x7中(需要4个星座在一排或一列,或对角线)是许多可能的获胜模式。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-13 02:55:43

虽然一种非常基本的方法是查看每个单元格在所有方向上的运行,但这里有一种方法,它只检查一条“线”中的单元格一次。"line“是指可能获胜的行、列或对角线,就像在拉斯维加斯的老虎机中那样:)

对于每个“wins.”,移动到“”开始,并将计数器设置为0。

  1. 对于" line“中的每个单元格(按顺序遍历行):
    • 如果单元格为P1且计数器为>= 0,则向计数器中添加1如果计数器=4,则P1行

代码语言:javascript
运行
复制
- 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

代码语言:javascript
运行
复制
- 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的对角线可以避免被完全检查。

祝你编码愉快。

票数 4
EN

Stack Overflow用户

发布于 2011-08-13 05:15:44

如果您为每个玩家使用bitboard,则可以使用位移位操作来测试棋盘是否获胜。

位板将具有以下结构:

代码语言:javascript
运行
复制
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)。要检查玩家是否有获胜的棋盘,您可以使用以下函数:

代码语言:javascript
运行
复制
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;
}

借助一个例子,我将尝试解释:下面的一个玩家的位板包括在第一行的垂直和对角获胜旁边的获胜组合。

代码语言:javascript
运行
复制
0101010
1110111
0111011
1101110
0001000
1010101
0011110 ... four occupied positions --> winning board

水平检查的步骤如下:

  1. 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

  1. 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源代码中看到了这个有趣的功能。

票数 38
EN

Stack Overflow用户

发布于 2011-08-13 02:32:30

循环遍历所有位置。对于每个位置,检查向下、对角线、向下、向右和向右四个字段(始终包括字段本身)。进行适当的检查,以避免在检查不存在的字段时炸毁应用程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7044670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档