unity的迷宫生成算法

思路:

定义一个二维数组,二维数组中奇数行列视为围墙,偶数为路径。 从起始点开始,随机从上下左右四个位置寻找周围没有被找到过的位置,找到后此点标记为1,并把此点与前一点之间的位置设置为1。 如果全部位置已经找到过,则退回到上一个点重复次逻辑,直到所有点都记录到或 退回到起始点且没有可用点。


文章最后我会附上完整代码。


下面我们来实现一下

 新建一个迷宫生成类:MazeCreate

定一个二维列表,用来存储我们的数据,因为迷宫的尺寸需要是可配置的,所有我们用list来进行存储:

public List<List<int>> mapList = new List<List<int>>();
为了区分每个点代表的不同内容,我们定义一个枚举:

    public enum PointType{
        wall = 0,//墙
        way = 1,//路
        startpoint = 2,//起始点
        endpoint = 3,//结束点
        nullpoint = 4,//空位置,不进行任何操作
    }

在构造函数中对迷宫的尺寸进行设置:

private MazeCeator(int row, int col){
        this.row = row;
        this.col = col;
}
然后定义Start方法开始迷宫数据的生成
初始化数组,按照行数和列数对数据进行初始化:

for (int i = 0; i < row; i++)
        {
            mapList.Add(new List<int>());
            for (int j = 0; j < col; j++)
            {
                mapList[i].Add((int)PointType.wall);
            }
        }
然后随机找一个点作为起始点,因为我们前面说过,奇数行为墙,偶数行为路线,所以要对随机的结果进行判断,避免起始点在墙上,像这样:

        int _row = Random.Range(1, row - 1);
        int _col = Random.Range(1, col - 1);
        if (_row % 2 == 0) {  _row += 1; }
        if (_col % 2 == 0) { _col += 1; }
然后给起始点的数据赋值:
mapList[_row][_col] = (int)PointType.startpoint;


开始生成迷宫

首先实现一下寻找周围可用点的方法:

    void FindNearPoint(List<int> nearpoint,int index){
        nearpoint.Clear();
        int _row = index / col;
        int _col = index % col;
        //up
        if (_row >= 2)
        {
            AddNearPoint(nearpoint, (_row - 2) * col + _col);
        }
        //down
        if (_row < row - 2)
        {
            AddNearPoint(nearpoint, (_row + 2) * col + _col);
        }
        //left
        if (_col >= 2)
        {
            AddNearPoint(nearpoint, _row * col + _col - 2);
  
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值