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
相关产品推荐
相关产品推荐

