unity 使用深度优先搜索生成迷宫之二

Wesley13
• 阅读 532

unity 使用深度优先搜索生成迷宫之二

之前写过一篇使用深度优先搜索生成随机迷宫的文章

https://www.cnblogs.com/JinT-Hwang/p/9599913.html

今天做了一下优化,使用unity的TileMap来做,并且代码减少到100行以内。

先看一下效果图

unity 使用深度优先搜索生成迷宫之二

下面直接是代码,至于在unity中怎么创建tilemap资源这里就不讲了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;

public class TileMapTestBehaviour : MonoBehaviour
{
    public TileBase baseTile;
    public Tilemap tilemap;

    public int mapWidth;
    public int mapHeight;

    public float tileSize = 0.16f;

    private Stack<Vector3Int> tileMapPosStack;
    private List<Vector3Int> tileSaveList;
    private Queue<Vector3Int> recordQueue;

    private static readonly List<Vector3Int> tilesOffset = new List<Vector3Int>()
    {
        Vector3Int.down,Vector3Int.right,Vector3Int.up,Vector3Int.left
    };

    // Use this for initialization
    void Start()
    {
        tileMapPosStack = new Stack<Vector3Int>();
        tileSaveList = new List<Vector3Int>();
        recordQueue = new Queue<Vector3Int>();

        tileMapPosStack.Push(Vector3Int.zero);
        tileSaveList.Add(Vector3Int.zero);

        CreateMap_DFS();
    }

    private void CreateMap_DFS()
    {
        Vector3Int currentTile;
        Vector3Int nextTile;

        List<Vector3Int> aroundTileList = new List<Vector3Int>();

        while (tileMapPosStack.Count > 0)
        {
            currentTile = tileMapPosStack.Pop();

            for (int i = 0; i < 4; i++)
            {
                nextTile = currentTile + tilesOffset[i];

                if (!tileSaveList.Contains(nextTile))
                {
                    aroundTileList.Add(nextTile);
                }
            }

            if (aroundTileList.Count >= 3)
            {
                while (aroundTileList.Count > 0)
                {
                    Vector3Int tilePos = aroundTileList[Random.Range(0, aroundTileList.Count)];
                    aroundTileList.Remove(tilePos);

                    if (IsTileInRange(tilePos))
                    {
                        tileMapPosStack.Push(tilePos);
                    }
                }

                if (!tileSaveList.Contains(currentTile))
                    tileSaveList.Add(currentTile);

                recordQueue.Enqueue(currentTile);
            }

            aroundTileList.Clear();
        }

        StartCoroutine("Display");
    }

    private bool IsTileInRange(Vector3Int tilePos)
    {
        return tilePos.x >= 0 && tilePos.x < mapWidth && tilePos.y >= 0 && tilePos.y < mapHeight;
    }

    private IEnumerator Display()
    {
        while (recordQueue.Count > 0)
        {
            yield return new WaitForSecondsRealtime(0.1f);

            tilemap.SetTile(recordQueue.Dequeue(), baseTile);
        }
    }
}

欢迎交流,转载注明出处。:)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Stella981 Stella981
2年前
Shodan的http.favicon.hash语法详解与使用技巧
  在Shodan搜索中有一个关于网站icon图标的搜索语法,http.favicon.hash,我们可以使用这个语法来搜索出使用了同一icon图标的网站,不知道怎么用的朋友请参考我上一篇(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fmia
Stella981 Stella981
2年前
Leetcode之深度优先搜索(DFS)专题
Leetcode之深度优先搜索(DFS)专题200.岛屿数量(NumberofIslands)深度优先搜索的解题详细介绍,点击(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fqinyuguan%2Fp%2F11330303.html)
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这