Java开发连6游戏:二维数组相邻块检查防崩溃问题咨询
解决Java六子棋游戏数组边界越界问题的实用方案
嘿,我太懂你这种崩溃的感受了——好不容易把胜负判断逻辑写出来,结果一碰到棋盘边缘就抛出ArrayIndexOutOfBoundsException,简直让人头大。别担心,咱们从几个核心方向入手,就能彻底解决这个问题:
方案一:先做边界检查,再访问数组元素
在检查任何方向的连续子之前,先判断当前位置加上后续需要检查的步数会不会超出数组的行/列范围。比如要检查水平方向的6个连续子,必须确保当前列col + 5小于棋盘的总列数(因为从col到col+5一共是6个元素);垂直方向要确保row +5小于总行数;对角线方向则需要同时满足行和列的边界条件。
举个水平方向检查的代码示例:
// 假设board是你的棋盘二维数组,rows是总行数,cols是总列数 char currentPlayer = board[row][col]; if (currentPlayer == 0) continue; // 跳过空位置,避免无效检查 // 先判断水平方向是否有足够的空间容纳6个连续子 if (col + 5 < cols) { boolean isWin = true; for (int i = 1; i < 6; i++) { if (board[row][col + i] != currentPlayer) { isWin = false; break; } } if (isWin) { System.out.println("玩家 " + currentPlayer + " 获胜!"); return; } }
方案二:限制检查的起始位置范围
更高效的方式是从根源上避免越界——只遍历那些有可能形成6连子的起始位置。比如:
- 水平方向:起始列只能是
0到cols - 6(包含两端),这样从起始列往后数5个位置,刚好到cols-1,不会越界 - 垂直方向:起始行只能是
0到rows -6 - 右下对角线:起始行
0到rows-6,起始列0到cols-6 - 右上对角线:起始行
5到rows-1(因为要往上数5行),起始列0到cols-6
以垂直方向的遍历为例:
// 只遍历能形成垂直6连子的起始行 for (int row = 0; row <= rows - 6; row++) { for (int col = 0; col < cols; col++) { char currentPlayer = board[row][col]; if (currentPlayer == 0) continue; boolean isWin = true; for (int i = 1; i < 6; i++) { if (board[row + i][col] != currentPlayer) { isWin = false; break; } } if (isWin) { System.out.println("玩家 " + currentPlayer + " 获胜!"); return; } } }
方案三:封装通用的边界检查工具方法
如果你的代码已经遍历了所有棋盘位置,可以把边界检查逻辑封装成一个工具方法,每次访问数组元素前先判断位置是否合法,代码会更整洁,也不容易遗漏检查:
// 工具方法:判断当前坐标是否在棋盘范围内 private boolean isPositionValid(int row, int col, int totalRows, int totalCols) { return row >= 0 && row < totalRows && col >= 0 && col < totalCols; }
然后在检查右上对角线的时候就可以这么用:
char currentPlayer = board[row][col]; if (currentPlayer == 0) continue; boolean isWin = true; for (int i = 1; i < 6; i++) { int newRow = row - i; // 向上移动 int newCol = col + i; // 向右移动 // 先判断位置是否合法,再比较玩家标记 if (!isPositionValid(newRow, newCol, rows, cols) || board[newRow][newCol] != currentPlayer) { isWin = false; break; } } if (isWin) { System.out.println("玩家 " + currentPlayer + " 获胜!"); return; }
你可以根据自己现有代码的结构选择最适合的方案:如果已经写了全棋盘遍历,加边界检查最省事;如果还在优化遍历逻辑,直接限制起始位置会更高效。
内容的提问来源于stack exchange,提问作者Emberfire
相关产品推荐
相关产品推荐

