如何将一个二维数组嵌入另一个二维数组?(自制房间迷宫项目)
解决二维数组嵌入问题(迷宫中放置房间)
你的核心需求是把房间的二维数组嵌入到迷宫的二维数组中,当前代码的问题在于:
- 共用了静态
maze变量,生成房间时会直接覆盖之前的迷宫数组 - 直接将数组转换成字符串输出,丢失了数组的原始结构,无法完成嵌入操作
下面是修改后的完整代码,实现数组嵌入功能:
import java.util.concurrent.ThreadLocalRandom; import java.util.Arrays; public class Main { // 生成房间二维数组 public static String[][] createRoom(int maxSize) { int roomSize = ThreadLocalRandom.current().nextInt(5, maxSize + 1); String[][] room = new String[roomSize][roomSize]; for (int i = 0; i < room.length; i++) { for (int j = 0; j < room[i].length; j++) { room[i][j] = "c"; room[0][j] = "\u2014"; room[room.length - 1][j] = "\u2014"; room[i][0] = "\u007c"; room[i][room.length - 1] = "\u007c"; room[0][room.length - 1] = "+"; room[room.length - 1][0] = "+"; room[0][0] = "+"; room[room.length - 1][room.length - 1] = "+"; } } return room; } // 生成迷宫二维数组 public static String[][] createMaze(int maxSize) { int mazeSize = ThreadLocalRandom.current().nextInt(40, maxSize + 1); String[][] maze = new String[mazeSize][mazeSize]; for (int i = 0; i < maze.length; i++) { for (int j = 0; j < maze[i].length; j++) { maze[i][j] = "r"; maze[0][j] = "\u2014"; maze[maze.length - 1][j] = "\u2014"; maze[i][0] = "\u007c"; maze[i][maze.length - 1] = "\u007c"; maze[0][maze.length - 1] = "+"; maze[maze.length - 1][0] = "+"; maze[0][0] = "+"; maze[maze.length - 1][maze.length - 1] = "+"; } } return maze; } // 将房间数组嵌入迷宫指定位置 public static void embedRoomIntoMaze(String[][] maze, String[][] room, int startX, int startY) { // 检查是否越界 if (startX + room.length > maze.length || startY + room[0].length > maze[0].length) { System.out.println("房间尺寸超出迷宫范围,无法嵌入"); return; } // 复制房间数组到迷宫对应位置 for (int i = 0; i < room.length; i++) { System.arraycopy(room[i], 0, maze[startX + i], startY, room[i].length); } } // 将二维数组转为可打印字符串 public static String arrayToString(String[][] arr) { StringBuilder sb = new StringBuilder(); for (String[] row : arr) { sb.append(String.join(" ", row)).append("\n"); } return sb.toString(); } public static void main(String[] args) { String[][] maze = createMaze(40); String[][] room = createRoom(10); // 计算居中嵌入的起始坐标 int startX = (maze.length - room.length) / 2; int startY = (maze[0].length - room[0].length) / 2; embedRoomIntoMaze(maze, room, startX, startY); System.out.println(arrayToString(maze)); } }
关键改动说明:
- 拆分数组生成与格式化:让房间和迷宫方法返回二维数组,保留结构以便嵌入;单独用
arrayToString处理打印格式。 - 新增嵌入逻辑:
embedRoomIntoMaze方法负责把房间数组复制到迷宫指定位置,加入越界检查避免报错。 - 移除全局静态变量:不再共用
maze变量,避免数组被覆盖。 - 自动计算嵌入位置:通过尺寸差计算居中坐标,也可以手动修改
startX和startY调整房间位置。
内容的提问来源于stack exchange,提问作者Чертков Бронислав
相关产品推荐
相关产品推荐

