algorithm - 在 Connect 4 中检测早期领带

标签 algorithm

我正在寻找一种算法来检测 Connect 4 游戏中的早期平局。截至目前,我已经检查了棋盘是否已满并且未检测到任何胜利,但我想尽快知道比赛是否可以推断为平局。

例如,考虑这个游戏,玩家 B 刚刚在位置 Row-5, Column-0 玩:

    |
    v
5 | B |   |   |   |   |   |   |
4 | A | B | A | B | A | B | A |
3 | A | B | A | B | A | B | A |
2 | B | A | B | A | B | A | B |
1 | B | A | B | A | B | A | B |
0 | A | B | A | B | A | B | A |
    0   1   2   3   4   5   6

然后,游戏被视为平局,因为玩家 B 仍然有办法获胜。尽管如果玩家 A 在 Row-5, Column-1 玩:

        |
        v
5 | B | A |   |   |   |   |   |
4 | A | B | A | B | A | B | A |
3 | A | B | A | B | A | B | A |
2 | B | A | B | A | B | A | B |
1 | B | A | B | A | B | A | B |
0 | A | B | A | B | A | B | A |
    0   1   2   3   4   5   6

在这一点上,任何一位玩家都没有办法获胜:这将是平局。我希望算法立即将此通知用户。

最佳答案

检查棋盘上所有可能的 4-in-a-row 运行,水平、垂直和对角线。如果它们都包含至少一个 A 和至少一个 B,那么这将是平局。如果甚至有一个由空和 A 或空和 B 的组合组成(假设没有行 4 行 A 或 4 行 B,在这种情况下你已经赢了),那么 A 或 B 仍然有可能赢。

您可能已经有了检查获胜的代码,所以只需调整它以检查 A 的 4 行或空,或 B 的 4 行或空而不是 4 行-A 的一行,或 B 的一行 4。如果它未能检测到可能的胜利,那么平局是不可避免的。

一个问题是棋盘上有少量空白区域。在这种情况下,您需要计算出 A 和 B 的剩余移动次数,并且只允许它们在计算中有那么多的空位,例如检查 A 的 4 行和最多 2 个空的。例如,如果还剩 5 个空位,轮到 B 了,那么 A 还剩 2 步,B 剩下 3 步。

它无法处理的一种情况是,如果只剩下一个空列 - 可能有足够的空间让一个玩家连续堆叠 4 个,但他们不能,因为玩家必须交替。

关于algorithm - 在 Connect 4 中检测早期领带,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921528/

相关文章:

c - 设计一个算法来判断是否存在这样一个键等于数组中其他两个键的总和

ruby-on-rails - 在散列中找到低于前一个数字的第一个键/值的最快方法

javascript - 将对象数组合并到数组数组中,每个数组包含 3 个对象

java - BFS五字母单词链

清空所有 'bad' 列和行的算法

java - A* 总是提供最短路径吗?

python - 试图构建单位矩阵?

algorithm - 用于查找列表中两个数字的最大乘积的蛮力算法的伪代码

c - 函数的时间复杂度和空间

algorithm - 当我们提前估计时的二叉搜索树插入顺序