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

Java Swing开发Connect4游戏遇数组越界异常求助

解决Connect4游戏中ArrayIndexOutOfBoundsException异常的问题

首先,你的异常根源非常明确:数组维度的访问顺序完全搞反了。

先看你的DrawBoard类里的数组定义:

int[][] board = new int[ROWS][COL]; // ROWS=6,COL=7,也就是6行7列的二维数组

在Java的二维数组里,int[行][列]是固定结构,所以这个数组的行索引范围是0-5,列索引范围是0-6。但你在paintComponent方法的循环里,错误地用列索引i去访问数组的行维度,行索引j去访问列维度:

if(board[i][j] == 0){ ... }

当i循环到6(因为COL=7,循环条件i < COL会让i取到0-6),此时访问board[6][j]就会超出数组行维度的最大索引5,直接抛出ArrayIndexOutOfBoundsException:6。

具体修复步骤

1. 修正数组访问顺序

把所有board[i][j]的调用改成board[j][i],因为j是行索引(0-5),i是列索引(0-6),这样才匹配数组[行][列]的结构。

2. 修正父类绘制方法的调用

你当前写的是super.paintComponents(g);,正确的写法是super.paintComponent(g);(多了一个s,这会导致绘制逻辑异常)。

3. 修复玩家棋子的绘制逻辑

当前代码中玩家1(值为1)的绘制用了fillRect,这会覆盖之前的蓝色棋盘格子,应该改成fillOval,和玩家2的绘制逻辑一致,符合Connect4圆形棋子的样式。

修正后的完整paintComponent方法代码

public void paintComponent(Graphics g){
    super.paintComponent(g); // 修正父类方法调用

    for(int i = 0; i < COL; i++){
        for(int j = 0; j < ROWS; j++){
            // 绘制蓝色棋盘格子
            g.setColor(Color.BLUE);
            g.fillRect(i*SQUARE_SIZE, j*SQUARE_SIZE + SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE);

            // 根据board值绘制对应颜色的棋子
            if(board[j][i] == 0){ // 修正数组访问顺序:board[行][列]
                g.setColor(Color.BLACK);
                g.fillOval(i*SQUARE_SIZE, j*SQUARE_SIZE + SQUARE_SIZE, CIRCLE_WIDTH_HEIGHT, CIRCLE_WIDTH_HEIGHT);
            }else if(board[j][i] == 1){
                g.setColor(Color.RED);
                g.fillOval(i*SQUARE_SIZE, j*SQUARE_SIZE + SQUARE_SIZE, CIRCLE_WIDTH_HEIGHT, CIRCLE_WIDTH_HEIGHT); // 改成fillOval
            }else if(board[j][i] == 2){
                g.setColor(Color.YELLOW);
                g.fillOval(i*SQUARE_SIZE, j*SQUARE_SIZE + SQUARE_SIZE, CIRCLE_WIDTH_HEIGHT, CIRCLE_WIDTH_HEIGHT);
            }
        }
    }
}

额外优化建议

  • 你现在的GameLoop类里同时存在matrix和DrawBoard里的board两个二维数组,这会导致游戏状态数据不一致,建议统一使用一个数组维护状态,比如把board提升为GameLoop的成员变量,或者让DrawBoard持有GameLoop的matrix引用。
  • 后续添加鼠标点击落子逻辑时,要注意从点击的列索引找到该列最底部的空位置(即行索引最大的0值位置),修改对应数组值后调用repaint()刷新界面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:21:50