Java编写Battleship战舰游戏AI出现超猜测次数、重复命中问题求助
Java战舰游戏AI错误排查及修复方案
核心问题根源
- 命中逻辑分支无容错处理:当棋盘存在未击沉的命中点
X,但该X四个方向均无有效可猜测格子时,代码中的方向循环会直接break,此时row和col仍保留初始值0,直接返回对应位置A1,哪怕该位置已经被命中过 - 无全局有效性校验:所有分支生成的猜测坐标没有经过最终的有效性校验,未确认该位置是否为未猜测的
.就直接返回,导致大量无效猜测提交,累计超过100次触发报错 - 棋盘类型判断逻辑缺陷:
squareType方法仅判断中间4个格子的状态,当这4个格子全部被占用后,squareValue会固定为0,奇偶筛选规则isCorrectSquare会筛掉一半的格子,游戏后期仅剩不符合奇偶规则的格子时,随机猜测的do-while循环会永久阻塞,无法返回有效坐标
修复方案
1. 命中分支增加容错
在命中逻辑的方向循环结束后,判断生成的坐标是否有效,无效则降级到随机猜测逻辑:
else if (hits(guesses)) { // 原有查找X坐标的逻辑保持不变 // 原有方向随机循环逻辑保持不变 // 新增有效性判断,无效则走随机生成逻辑 if (guesses[row][col] != '.') { do { row = ((int)(Math.random() * 10)); col = ((int)(Math.random() * 10)); } while (guesses[row][col] != '.'); } }
2. 增加全局有效性校验
在返回猜测结果前统一校验坐标有效性,覆盖所有分支的无效输出场景:
// 原有所有坐标生成逻辑结束后新增校验 if (guesses[row][col] != '.') { do { row = ((int)(Math.random() * 10)); col = ((int)(Math.random() * 10)); } while (guesses[row][col] != '.'); } char a = (char)((int)'A' + row); String guess = a + Integer.toString(col+1); return guess;
3. 修复奇偶筛选逻辑
调整isCorrectSquare规则,当剩余可猜测格子数小于20时关闭奇偶校验,避免后期无可用格子:
// 新增remaining参数为剩余未猜测格子数:100 - guessNumber(guesses) public static boolean isCorrectSquare(int x, int y, int z, int remaining) { if (remaining < 20) return true; return !((z == 0 && (x + y) % 2 != 0) || (z == 1 && (x + y) % 2 == 0)); }
内容的提问来源于stack exchange,提问作者Billy101
相关产品推荐
相关产品推荐

