如何实现含可行路径的随机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
相关产品推荐
相关产品推荐

