五子棋游戏胜利条件失效:二维数组遍历问题排查
五子棋胜利检测逻辑的核心问题分析
1. 玩家编号不匹配导致检测函数完全不执行
主函数中currentPlayer初始值为0,进入循环后先执行currentPlayer++:
- 玩家1落子时,
currentPlayer的值是1 - 玩家2落子时,
currentPlayer的值是2
但你在isHorizontalWin和isVerticalWin函数里只判断了currentPlayer == 0或currentPlayer == 1,玩家2操作时currentPlayer=2,直接跳过所有检测分支,自然不会有任何输出,也无法触发胜利检测。
修正方向:
要么调整主函数中currentPlayer的取值逻辑(比如初始设为1,玩家1用1、玩家2用2,对应函数内的判断条件),要么将胜利检测函数中玩家2的判断改为currentPlayer == 2。
2. 计数器重置逻辑缺失
以isHorizontalWin为例:
- 未在每一行开始时重置计数器,导致跨行列累加计数,完全不符合“连续五子”的逻辑
- 遇到非目标棋子时没有重置计数器,中间出现空棋子或敌方棋子时,计数器应清零而非继续累加
- 胜利判断时机错误:仅在遇到非目标棋子时检查
count == 5,若一行末尾刚好是连续五子,根本不会触发判断
修正示例:
public static boolean isHorizontalWin(char[][] board, int currentPlayer) { char target = (currentPlayer == 1) ? '●' : '○'; boolean hWin = false; for (int r = 0; r < board.length; r++) { int count = 0; // 每一行开始时重置计数器 for (int c = 0; c < board[r].length; c++) { if (board[r][c] == target) { count++; System.out.println(count); if (count == 5) { // 每次计数后立即检查胜利条件 hWin = true; return hWin; // 找到胜利直接返回,无需继续遍历 } } else { count = 0; // 遇到非目标棋子,重置计数器 } } } return hWin; }
3. 垂直胜利的遍历逻辑错误
isVerticalWin中使用board[c][r]的访问方式,但外层循环遍历行r、内层遍历列c,导致遍历顺序混乱,完全不符合“按列检查连续五子”的逻辑。
修正示例:
public static boolean isVerticalWin(char[][] board, int currentPlayer) { char target = (currentPlayer == 1) ? '●' : '○'; boolean vWin = false; for (int c = 0; c < board[0].length; c++) { // 外层遍历列 int count = 0; // 每一列开始时重置计数器 for (int r = 0; r < board.length; r++) { // 内层遍历该列的每一行 if (board[r][c] == target) { count++; System.out.println(count); if (count == 5) { vWin = true; return vWin; } } else { count = 0; } } } return vWin; }
4. 主函数中冗余的胜利检测调用
你在玩家落子后直接调用了isVerticalWin和isHorizontalWin,但这些函数的返回值未被利用,真正控制循环结束的是while条件中的hasPlayerWon。建议去掉主函数里的冗余调用,仅保留while条件的判断,或者在落子后直接调用hasPlayerWon并判断是否结束游戏。
内容的提问来源于stack exchange,提问作者Steamly
相关产品推荐
相关产品推荐

