如何修复井字棋方法中Index 9 out of bounds for length 9错误
问题原因及修复方案
1. 核心错误(数组越界)
你遇到越界报错的根本原因是棋盘行偏移量计算错误:
- 你定义
boardSpace为棋盘总格子数(33棋盘时值为9),每行的格子数应为size = (int) Math.sqrt(boardSpace)(33棋盘时值为3) - 原代码中第i行的起始下标错误写为
i * boardSpace,按这个逻辑计算第2行(i=1)的起始下标就是1*9=9,直接超出了长度为9的数组的最大下标(8),正好匹配你遇到的报错。
2. 其他逻辑缺陷
除了越界错误外,你的代码还有多处逻辑问题需要修正:
matchingX没有在每行遍历结束后重置,会出现跨行累加的错误- 胜负判断阈值错误:横向连成size个就算赢,阈值应为
size-1而非boardSpace-1,3*3棋盘只要连续2次匹配就说明3个格子相同 - 返回值逻辑颠倒:匹配成功时应该返回true而非false
- 没有提前终止逻辑:已经检测到某行满足胜负条件时不需要继续遍历剩余行
3. 修复后代码
boolean checkHorz(int boardSpace) { int size = (int) Math.sqrt(boardSpace); for (int i = 0; i < size; i++) { int matchingX = 0; // 每行开始前重置匹配计数 for (int j = 0; j < size - 1; j++) { // 行偏移修正为 i * size int curIdx = i * size + j; int nextIdx = curIdx + 1; if (data[curIdx].equals(data[nextIdx]) && !data[curIdx].equals("_")) { matchingX++; // 匹配数达到阈值直接返回胜利 if (matchingX == size - 1) { return true; } } else { matchingX = 0; } } } // 所有行都不满足条件返回失败 return false; }
内容的提问来源于stack exchange,提问作者DarnellG1999
相关产品推荐
相关产品推荐

