You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    }
}
代码说明
  1. 边界安全:checkDirection方法里先判断当前行/列是否在0-9的范围内,彻底避免数组越界异常。
  2. 效率优化:一旦在某个方向上凑够5个连续标记,立刻返回结果,不用继续检查其他方向或格子。
  3. 扩展性强:把棋盘大小和连子数定义为常量,后续如果要改成8×8棋盘或连4子,直接修改常量即可,不用动核心逻辑。

如果你需要单独实现「检测数组中某一值是否连续重复5次」的通用功能,也可以基于这个思路改造——比如针对一维数组只检查水平方向,针对二维数组复用上面的四个方向逻辑就行。

内容的提问来源于stack exchange,提问作者iprit1915

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:59:05