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

