Java实现10×10 m,n,k游戏:检测玩家5连珠获胜及数组连续值
嘿,我之前做过类似的连子游戏,这个获胜检测的问题其实拆解开来就很清晰了!核心就是在你的10×10matrix数组里,检查特定玩家的标记是否在水平、垂直、两条对角线中的任意一个方向上连续出现5次。下面我给你梳理思路并附上可直接复用的Java代码:
核心思路
我们不需要遍历棋盘上的每一个可能的5子序列,而是对每个位置(或者只检查有玩家落子的位置,不过遍历全棋盘实现更简单),向四个方向分别验证是否存在连续的5个相同玩家标记。这里要重点注意数组边界判断,避免出现越界异常。
四个关键方向可以用偏移量来统一表示:
- 水平方向:(0, 1) → 同一行,列依次递增
- 垂直方向:(1, 0) → 同一列,行依次递增
- 主对角线(左上→右下):(1, 1) → 行和列同时递增
- 副对角线(右上→左下):(1, -1) → 行递增、列递减
Java实现代码
下面是一个完整的可运行示例,包含获胜检测方法和辅助检查逻辑:
public class FiveInARowGame { // 定义棋盘大小和获胜所需的连子数 private static final int BOARD_SIZE = 10; private static final int WIN_STREAK = 5; // 对外暴露的方法:检查指定玩家是否获胜 public static boolean isPlayerWin(int[][] matrix, int player) { // 遍历棋盘的每一个格子 for (int row = 0; row < BOARD_SIZE; row++) { for (int col = 0; col < BOARD_SIZE; col++) { // 当前格子不是该玩家的标记,直接跳过 if (matrix[row][col] != player) { continue; } // 只要四个方向中有一个满足连5子,就返回获胜 if (checkDirection(matrix, row, col, 0, 1, player) || // 水平向右 checkDirection(matrix, row, col, 1, 0, player) || // 垂直向下 checkDirection(matrix, row, col, 1, 1, player) || // 主对角线 checkDirection(matrix, row, col, 1, -1, player)) { // 副对角线 return true; } } } return false; } // 辅助方法:检查指定方向上是否有连续WIN_STREAK个相同标记 private static boolean checkDirection(int[][] matrix, int startRow, int startCol, int rowOffset, int colOffset, int player) { int streakCount = 1; // 当前格子已经算1个 int currentRow = startRow + rowOffset; int currentCol = startCol + colOffset; // 沿着方向延伸,直到超出棋盘或遇到不同标记 while (currentRow >= 0 && currentRow < BOARD_SIZE && currentCol >= 0 && currentCol < BOARD_SIZE && matrix[currentRow][currentCol] == player) { streakCount++; currentRow += rowOffset; currentCol += colOffset; // 提前终止:只要达到连子数就返回true if (streakCount == WIN_STREAK) { return true; } } return streakCount >= WIN_STREAK; } // 测试用例:模拟水平连5子的场景 public static void main(String[] args) { int[][] testBoard = new int[10][10]; for (int i = 0; i < WIN_STREAK; i++) { testBoard[4][i] = 1; // 玩家1在第5行(索引4)连放5个标记 } System.out.println("玩家1是否获胜:" + isPlayerWin(testBoard, 1)); // 输出true } }
代码说明
- 边界安全:
checkDirection方法里先判断当前行/列是否在0-9的范围内,彻底避免数组越界异常。 - 效率优化:一旦在某个方向上凑够5个连续标记,立刻返回结果,不用继续检查其他方向或格子。
- 扩展性强:把棋盘大小和连子数定义为常量,后续如果要改成8×8棋盘或连4子,直接修改常量即可,不用动核心逻辑。
如果你需要单独实现「检测数组中某一值是否连续重复5次」的通用功能,也可以基于这个思路改造——比如针对一维数组只检查水平方向,针对二维数组复用上面的四个方向逻辑就行。
内容的提问来源于stack exchange,提问作者iprit1915
相关产品推荐
相关产品推荐

