You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Connect4游戏对角线胜利判定如何高效遍历目标索引?

对角线遍历优化方案

你给出的左下到右上方向的所有同对角线坐标,存在统一数学规律:同一对角线上的所有坐标都满足 2 * 行号 + 列号 = 固定值。
验证你给出的示例:

  • 第一组(3,1)、(2,3)、(1,5)、(0,7):2*3+1=7、2*2+3=7、2*1+5=7、2*0+7=7,所有结果均为7
  • 第二组(4,1)、(3,3)等坐标计算后统一为9,后续组的固定值分别为11、13、15、17,完全匹配你列出的6组坐标

单方向遍历实现(仅需1个两层循环)

你只需要遍历所有固定值k,再通过公式反算合法坐标即可,无需单独写6个循环:

// 定义棋盘边界参数,根据你的实际情况调整
static final int ROW_MAX = 5;
static final int COL_MAX = 13;
static final int WIN_LENGTH = 4;

// 校验左下到右上方向是否有4连
public boolean checkAntiDiagonal(String[][] board) {
    // 该方向所有对角线对应的固定k值,也可以动态计算范围
    int[] kValues = {7,9,11,13,15,17};
    for (int k : kValues) {
        int consecutive = 0;
        String lastPiece = "_";
        // 从最底行往上遍历,即从左下往右上走
        for (int row = ROW_MAX; row >= 0; row--) {
            int col = k - 2 * row;
            // 跳过不合法的列号
            if (col < 0 || col > COL_MAX) continue;
            String curr = board[row][col];
            if (curr.equals(lastPiece) && !curr.equals("_")) {
                consecutive++;
                if (consecutive >= WIN_LENGTH) return true;
            } else {
                consecutive = 1;
                lastPiece = curr;
            }
        }
    }
    return false;
}

另一个方向遍历

右下到左上方向的同对角线坐标满足 2 * 行号 - 列号 = 固定值,套用上面的逻辑修改公式即可,同样仅需1个两层循环完成所有校验。

更高效率的落子后校验方案

如果你不需要全棋盘扫描,仅在每次玩家落子后判定胜利,可以用更高效的方案,不需要遍历所有对角线:

  1. 拿到当前落子坐标(r,c)
  2. 沿着两个对角线的四个方向(左下、右上、右下、左上)分别计数连续的同色棋子
  3. 同一对角线两个方向的计数相加后减1(当前落子被重复计数)如果≥4,直接判定胜利
    该方案每次校验最多访问8个格子,性能远高于全对角线扫描。

内容的提问来源于stack exchange,提问作者gone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:51:01