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

实现带AI的Connect Four时添加左右移位功能遇数组越界异常求助

排查Connect Four左/右移操作的数组越界问题

首先,咱们从最常见的几个核心原因入手,结合你说的左移(ABCDEFG→GABCDEF)、右移(ABCDEFG→BCDEFGA)逻辑来分析:

1. 数组索引的边界计数错误

Connect Four的棋盘是7列对应A-G,大概率你的棋盘数组是0索引(比如board[row][0]对应A列,board[row][6]对应G列)。如果代码里把列数当成1开始计数,就会直接触发越界。

举个典型错误例子:

// 错误:把列数当成1索引,访问了不存在的索引7
for (int row = 0; row < ROWS; row++) {
    int temp = board[row][7]; // 7列数组的最大索引是6,这里直接越界
    for (int col = 6; col > 0; col--) {
        board[row][col] = board[row][col-1];
    }
    board[row][0] = temp;
}

2. 移动循环的范围写错

以右移逻辑(ABCDEFG→BCDEFGA)为例,正确逻辑是把A列移到G列,其余列左移一位。如果循环条件写错,就会访问超出范围的索引:

// 错误:循环条件用了<= COLS,导致col到7时访问col+1=8
for (int row = 0; row < ROWS; row++) {
    int temp = board[row][0];
    for (int col = 0; col <= COLS; col++) { 
        board[row][col] = board[row][col+1];
    }
    board[row][6] = temp;
}

3. 临时数组的长度不匹配

如果用临时数组存储移动后的行数据,长度和原行不一致的话,后续操作必然越界:

// 错误:临时数组长度设为8,比实际列数7多1
for (int row = 0; row < ROWS; row++) {
    int[] tempRow = new int[8]; 
    tempRow[0] = board[row][6];
    for (int col = 0; col < 6; col++) {
        tempRow[col+1] = board[row][col];
    }
    board[row] = tempRow; // 后续访问board[row][7]就会报错
}

4. 合法走法判断的索引错误

你已经把左/右移加入合法走法,也要检查这里的逻辑:比如判断左移是否合法时,有没有错误引用不存在的列索引?

快速排查小步骤

  • 先打印棋盘的列数,确认COLS值是7,数组有效索引范围是0 <= index < COLS;
  • 在移动代码里加打印语句,输出当前操作的行、列索引,定位哪个索引超出了范围;
  • 检查所有循环的起始、结束条件,确保所有数组访问都在有效索引内。

正确实现参考(基于0索引7列)

左移逻辑:

public void shiftLeft() {
    int COLS = board[0].length;
    for (int row = 0; row < board.length; row++) {
        // 保存G列(最后一列)的值
        int lastColVal = board[row][COLS - 1];
        // 从倒数第二列开始,依次右移一位
        for (int col = COLS - 1; col > 0; col--) {
            board[row][col] = board[row][col - 1];
        }
        // 把G列的值放到A列(第一列)
        board[row][0] = lastColVal;
    }
}

右移逻辑:

public void shiftRight() {
    int COLS = board[0].length;
    for (int row = 0; row < board.length; row++) {
        // 保存A列(第一列)的值
        int firstColVal = board[row][0];
        // 从第二列开始,依次左移一位
        for (int col = 0; col < COLS - 1; col++) {
            board[row][col] = board[row][col + 1];
        }
        // 把A列的值放到G列(最后一列)
        board[row][COLS - 1] = firstColVal;
    }
}

你可以对比自己的代码,看看是不是在索引处理、循环范围上出了问题。如果有具体的代码片段,还能更精准地定位问题。

内容的提问来源于stack exchange,提问作者Paul Steven Fantonalgo Nadera

相关产品推荐
方舟 Agent Plan

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

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