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

 

 

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

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

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

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

先看一下效果图

DFS

 

下面直接是代码,至于在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);
        }
    }
}

 

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

 

posted @ 2018-11-27 17:48  黄进钿  阅读(384)  评论(0编辑  收藏  举报