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

如何实现含可行路径的随机1分布二维数组(Java游戏开发)

分步指导你完成这款Java迷宫游戏

嘿,作为Java初学者能写出这样的代码已经很棒了!咱们一步步来完善这个游戏,先从你现有代码的问题入手,再逐步实现完整功能~

一、先修正现有代码的核心问题

你的PathMaker类目前存在几个影响功能的问题,咱们先把这些解决:

1. 难度区分无效

现在三个难度分支都生成5x5的数组,完全没体现难度差异,咱们改成根据难度调整地图大小:

public PathMaker(int Difficulty){
    if (Difficulty == 1) arr = new int[5][5];
    if (Difficulty == 2) arr = new int[7][7]; // 难度2用更大的地图
    if (Difficulty == 3) arr = new int[9][9]; // 难度3用最大的地图
    Pathset(arr);
}

2. 地图生成逻辑错误

你的Pathset方法现在的逻辑不仅会把起点设错(你要的起点是左下角,不是左上角),还可能随机生成障碍物堵死所有路径。咱们换一种简单可靠的方法:先保证一条从起点到终点的通路,再随机填充其他障碍物。

修改后的Pathset方法:

private void Pathset(int[][] arr) {
    int rows = arr.length;
    int cols = arr[0].length;
    
    // 1. 初始化所有格子为障碍物(1)
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = 1;
        }
    }
    
    // 2. 生成从左下角(起点)到右上角(终点)的通路
    int currentRow = rows - 1; // 起点行:最后一行(左下角)
    int currentCol = 0; // 起点列:第一列
    arr[currentRow][currentCol] = 0; // 起点设为通路
    
    // 随机向上/向右走,直到到达终点
    while (currentRow != 0 || currentCol != cols - 1) {
        // 随机选择方向:0=向上,1=向右(如果能走的话)
        int direction = (int) (Math.random() * 2);
        if (direction == 0 && currentRow > 0) {
            currentRow--;
        } else if (direction == 1 && currentCol < cols - 1) {
            currentCol++;
        }
        arr[currentRow][currentCol] = 0; // 标记为通路
    }
    
    // 3. 随机填充障碍物,避开通路和起点/终点
    int totalCells = rows * cols;
    int obstacleCount = (int) (totalCells * 0.3); // 障碍物占30%,可调整
    int placed = 0;
    
    while (placed < obstacleCount) {
        int r = (int) (Math.random() * rows);
        int c = (int) (Math.random() * cols);
        // 只在不是通路的位置放障碍物
        if (arr[r][c] == 1) {
            placed++;
        }
    }
}

注:这个方法先强制生成一条通路,再随机放障碍物,绝对不会堵死起点到终点的路径,非常适合初学者理解。

二、实现游戏核心逻辑

现在需要一个Game类来处理用户输入、移动、计时和游戏状态判断:

import java.util.Scanner;

public class Game {
    private int[][] map;
    private int playerRow;
    private int playerCol;
    private long startTime;
    private final int TIME_LIMIT = 30; // 限定30秒,可调整

    public Game(int difficulty) {
        PathMaker pathMaker = new PathMaker(difficulty);
        this.map = pathMaker.getMap(); // 需要给PathMaker加getMap方法
        // 初始化玩家位置:左下角
        this.playerRow = map.length - 1;
        this.playerCol = 0;
        this.startTime = System.currentTimeMillis();
    }

    // 开始游戏
    public void start() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("欢迎来到迷宫游戏!");
        System.out.println("你需要从左下角移动到右上角,输入right/left/up/down控制方向,限时" + TIME_LIMIT + "秒!");
        
        while (true) {
            // 检查时间是否超时
            long elapsed = (System.currentTimeMillis() - startTime) / 1000;
            if (elapsed >= TIME_LIMIT) {
                System.out.println("时间到!游戏失败!");
                break;
            }
            
            // 检查是否到达终点
            if (playerRow == 0 && playerCol == map[0].length - 1) {
                System.out.println("恭喜你到达终点!用时:" + elapsed + "秒");
                break;
            }
            
            // 获取用户输入
            System.out.print("请输入方向(right/left/up/down):");
            String input = scanner.nextLine().trim().toLowerCase();
            
            // 处理移动
            switch (input) {
                case "up":
                    if (playerRow > 0 && map[playerRow - 1][playerCol] == 0) {
                        playerRow--;
                        System.out.println("向上移动成功!");
                    } else {
                        System.out.println("无法向上移动,碰到障碍物或边界!");
                    }
                    break;
                case "down":
                    if (playerRow < map.length - 1 && map[playerRow + 1][playerCol] == 0) {
                        playerRow++;
                        System.out.println("向下移动成功!");
                    } else {
                        System.out.println("无法向下移动,碰到障碍物或边界!");
                    }
                    break;
                case "left":
                    if (playerCol > 0 && map[playerRow][playerCol - 1] == 0) {
                        playerCol--;
                        System.out.println("向左移动成功!");
                    } else {
                        System.out.println("无法向左移动,碰到障碍物或边界!");
                    }
                    break;
                case "right":
                    if (playerCol < map[0].length - 1 && map[playerRow][playerCol + 1] == 0) {
                        playerCol++;
                        System.out.println("向右移动成功!");
                    } else {
                        System.out.println("无法向右移动,碰到障碍物或边界!");
                    }
                    break;
                default:
                    System.out.println("输入无效,请输入正确的方向指令!");
            }
        }
        scanner.close();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请选择难度(1=简单,2=中等,3=困难):");
        int difficulty = scanner.nextInt();
        scanner.nextLine(); // 清除换行符
        
        Game game = new Game(difficulty);
        game.start();
        scanner.close();
    }
}

三、完善PathMaker类的辅助方法

需要给PathMaker类加一个getMap方法,让Game类能获取生成的地图:

public class PathMaker {
    private int[][] arr;

    public PathMaker(int Difficulty) {
        if (Difficulty == 1) arr = new int[5][5];
        if (Difficulty == 2) arr = new int[7][7];
        if (Difficulty == 3) arr = new int[9][9];
        Pathset(arr);
    }

    // 新增getMap方法
    public int[][] getMap() {
        return arr;
    }

    private void Pathset(int[][] arr) {
        // 这里放咱们之前修改后的Pathset代码
        int rows = arr.length;
        int cols = arr[0].length;
        
        // 1. 初始化所有格子为障碍物(1)
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                arr[i][j] = 1;
            }
        }
        
        // 2. 生成从左下角(起点)到右上角(终点)的通路
        int currentRow = rows - 1; // 起点行:最后一行(左下角)
        int currentCol = 0; // 起点列:第一列
        arr[currentRow][currentCol] = 0; // 起点设为通路
        
        // 随机向上/向右走,直到到达终点
        while (currentRow != 0 || currentCol != cols - 1) {
            // 随机选择方向:0=向上,1=向右(如果能走的话)
            int direction = (int) (Math.random() * 2);
            if (direction == 0 && currentRow > 0) {
                currentRow--;
            } else if (direction == 1 && currentCol < cols - 1) {
                currentCol++;
            }
            arr[currentRow][currentCol] = 0; // 标记为通路
        }
        
        // 3. 随机填充障碍物,避开通路和起点/终点
        int totalCells = rows * cols;
        int obstacleCount = (int) (totalCells * 0.3); // 障碍物占30%,可调整
        int placed = 0;
        
        while (placed < obstacleCount) {
            int r = (int) (Math.random() * rows);
            int c = (int) (Math.random() * cols);
            // 只在不是通路的位置放障碍物
            if (arr[r][c] == 1) {
                placed++;
            }
        }
    }
}

四、测试和优化建议

  • 测试时可以临时加一个打印地图的方法,方便调试(比如在Game类里加一个printMap()方法,把地图和玩家位置打印出来,确认逻辑正确后再删掉)
  • 可以调整障碍物的比例,比如难度越高,障碍物比例越高(难度1是20%,难度2是30%,难度3是40%)
  • 可以给游戏加提示,比如剩余时间显示
  • 可以处理用户输入的大小写问题(咱们已经用了toLowerCase(),所以没问题)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:41