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

Java开发连6游戏:二维数组相邻块检查防崩溃问题咨询

解决Java六子棋游戏数组边界越界问题的实用方案

嘿,我太懂你这种崩溃的感受了——好不容易把胜负判断逻辑写出来,结果一碰到棋盘边缘就抛出ArrayIndexOutOfBoundsException,简直让人头大。别担心,咱们从几个核心方向入手,就能彻底解决这个问题:

方案一:先做边界检查,再访问数组元素

在检查任何方向的连续子之前,先判断当前位置加上后续需要检查的步数会不会超出数组的行/列范围。比如要检查水平方向的6个连续子,必须确保当前列col + 5小于棋盘的总列数(因为从col到col+5一共是6个元素);垂直方向要确保row +5小于总行数;对角线方向则需要同时满足行和列的边界条件。

举个水平方向检查的代码示例:

// 假设board是你的棋盘二维数组,rows是总行数,cols是总列数
char currentPlayer = board[row][col];
if (currentPlayer == 0) continue; // 跳过空位置,避免无效检查

// 先判断水平方向是否有足够的空间容纳6个连续子
if (col + 5 < cols) {
    boolean isWin = true;
    for (int i = 1; i < 6; i++) {
        if (board[row][col + i] != currentPlayer) {
            isWin = false;
            break;
        }
    }
    if (isWin) {
        System.out.println("玩家 " + currentPlayer + " 获胜!");
        return;
    }
}

方案二:限制检查的起始位置范围

更高效的方式是从根源上避免越界——只遍历那些有可能形成6连子的起始位置。比如:

  • 水平方向:起始列只能是0到cols - 6(包含两端),这样从起始列往后数5个位置,刚好到cols-1,不会越界
  • 垂直方向:起始行只能是0到rows -6
  • 右下对角线:起始行0到rows-6,起始列0到cols-6
  • 右上对角线:起始行5到rows-1(因为要往上数5行),起始列0到cols-6

以垂直方向的遍历为例:

// 只遍历能形成垂直6连子的起始行
for (int row = 0; row <= rows - 6; row++) {
    for (int col = 0; col < cols; col++) {
        char currentPlayer = board[row][col];
        if (currentPlayer == 0) continue;
        
        boolean isWin = true;
        for (int i = 1; i < 6; i++) {
            if (board[row + i][col] != currentPlayer) {
                isWin = false;
                break;
            }
        }
        if (isWin) {
            System.out.println("玩家 " + currentPlayer + " 获胜!");
            return;
        }
    }
}

方案三:封装通用的边界检查工具方法

如果你的代码已经遍历了所有棋盘位置,可以把边界检查逻辑封装成一个工具方法,每次访问数组元素前先判断位置是否合法,代码会更整洁,也不容易遗漏检查:

// 工具方法:判断当前坐标是否在棋盘范围内
private boolean isPositionValid(int row, int col, int totalRows, int totalCols) {
    return row >= 0 && row < totalRows && col >= 0 && col < totalCols;
}

然后在检查右上对角线的时候就可以这么用:

char currentPlayer = board[row][col];
if (currentPlayer == 0) continue;

boolean isWin = true;
for (int i = 1; i < 6; i++) {
    int newRow = row - i; // 向上移动
    int newCol = col + i; // 向右移动
    // 先判断位置是否合法,再比较玩家标记
    if (!isPositionValid(newRow, newCol, rows, cols) || board[newRow][newCol] != currentPlayer) {
        isWin = false;
        break;
    }
}
if (isWin) {
    System.out.println("玩家 " + currentPlayer + " 获胜!");
    return;
}

你可以根据自己现有代码的结构选择最适合的方案:如果已经写了全棋盘遍历,加边界检查最省事;如果还在优化遍历逻辑,直接限制起始位置会更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:16:04