二维数组随机生成地图迷宫_三套简单的迷宫地图生成方案

概述

文章基于一种基础的地图,来讨论三套不同的地图生成方案。

文章不会出现跟代码相关的内容,会以较为通俗的语句和不少简单的示意图来表示迷宫的生成方案。其中不少方法来自于游戏界前辈,我根据自己的基础地图做了不少修正(毕竟迷宫和地图的形式多种多样,适合自己游戏的才是最好的)。

根据方案生成地图之后,还可以加上一些静态分布来丰富地图表现,大家就自行发挥啦!

地图基础

地图的形式很多,这里我使用的地图是以tile块为单位分割的地图,地图上的tile块形式很多,但主要分成三种:A:陆地,可以在上面分布一些角色啦物件啦

B:过渡,根据物理框可以在上面移动,不过一般不会分布物件

C:水域,不可移动的区域,可以理解成为迷宫的“墙”

在后文的迷宫生成方案里,会以水域作为分割,主要围绕陆地的分布来设计迷宫,过渡的地块根据游戏实际需要再去生成。如果你不希望地图用水域来分割,那只需要把水域改成传统的墙壁即可。

本文用来展示的地图,面积都比较小,方便表达迷宫的生成规则。在实际游戏制作时,按需求去铺量就行。

方案一:主路扭曲型

1、首先,按照下图的间隔规则来生成基础的大地图,1为陆地,0为水域。

2、然后,选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成迷宫的一种常见算法是基于深度优先遍历的随机迷宫生成算法。该算法的基本思路是从一个起始点出发,随机选择一个相邻的未被访问过的点,将其标记为已访问,并将两点之间的墙壁打通。然后以新访问的点为起点继续随机选择未访问过的点,直到所有的点都被访问过。 在Java中,可以使用二维数组表示迷宫地图数组中的每个元素表示一个格子,可以包含四面墙壁状态的信息(例如用0表示墙壁存在,用1表示墙壁不存在),以及是否被访问过的信息(例如用0表示未被访问过,用1表示已被访问过)。以下是一个基于深度优先遍历的随机迷宫生成算法示例代码: ``` java import java.util.Random; public class MazeGenerator { private int width; // 迷宫宽度 private int height; // 迷宫高度 private int[][] maze; // 迷宫地图 private Random random; // 随机生成器 // 构造函数 public MazeGenerator(int width, int height) { this.width = width; this.height = height; maze = new int[height][width]; random = new Random(); generateMaze(0, 0); // 从左上角的格子开始生成迷宫 } // 生成迷宫 private void generateMaze(int row, int col) { maze[row][col] = 1; // 标记当前格子已访问过 // 随机顺序访问邻居格子 int[] directions = {0, 1, 2, 3}; // 上、右、下、左 shuffle(directions); // 随机打乱顺序 for (int direction : directions) { int newRow = row; int newCol = col; switch (direction) { case 0: // 上 newRow--; break; case 1: // 右 newCol++; break; case 2: // 下 newRow++; break; case 3: // 左 newCol--; break; } // 判断新格子是否在迷宫范围内且未被访问过 if (newRow >= 0 && newRow < height && newCol >= 0 && newCol < width && maze[newRow][newCol] == 0) { // 打通两格之间的墙壁 if (direction == 0) { // 上 maze[row][col] &= ~1; // 当前格子的上墙壁打通 maze[newRow][newCol] &= ~4; // 新格子的下墙壁打通 } else if (direction == 1) { // 右 maze[row][col] &= ~2; // 当前格子的右墙壁打通 maze[newRow][newCol] &= ~8; // 新格子的左墙壁打通 } else if (direction == 2) { // 下 maze[row][col] &= ~4; // 当前格子的下墙壁打通 maze[newRow][newCol] &= ~1; // 新格子的上墙壁打通 } else if (direction == 3) { // 左 maze[row][col] &= ~8; // 当前格子的左墙壁打通 maze[newRow][newCol] &= ~2; // 新格子的右墙壁打通 } generateMaze(newRow, newCol); // 递归访问新格子 } } } // 随机打乱数组元素的顺序 private void shuffle(int[] array) { for (int i = array.length - 1; i > 0; i--) { int j = random.nextInt(i + 1); int temp = array[i]; array[i] = array[j]; array[j] = temp; } } // 打印迷宫地图 public void printMaze() { for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { System.out.print(maze[i][j] + " "); } System.out.println(); } } // 测试代码 public static void main(String[] args) { MazeGenerator generator = new MazeGenerator(10, 10); generator.printMaze(); } } ``` 运行上述代码,可以生成一个10x10的迷宫地图,并打印出来。你可以根据自己的需要修改迷宫大小,或者将迷宫地图保存为图片等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值