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

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

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

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

先看一下效果图

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

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

原文地址:https://www.cnblogs.com/JinT-Hwang/p/10027922.html

时间: 2024-10-11 05:25:19

unity 使用深度优先搜索生成迷宫之二的相关文章

迷宫生成及深度优先搜索遍历迷宫(OpenGL)

其实以前就写过一个迷宫的程序和DFS遍历,不过弄丢了,前几天闲就重写了一下.欢迎交流和拍砖.有很多不足的地方也希望大家多指正. 迷宫生成的算法来自<计算机图形学>,也就是这本书: 生成迷宫的算法描述如下: 由于表示墙使用了up_wall和left_wall两个矩阵,所以格子的数量要比能显示出来的多一行一列,否则屏幕最下边和最右边是没有墙的.虽然可以后面画上,不过我选择这样. 对于迷宫的遍历使用DFS,另外由于使用了一个visited矩阵表示每个格子是否已经访问过,所以即使迷宫里存在环也没有任何

深度优先搜索(迷宫救人最短路径)

1 import java.util.Scanner; 2 3 public class One { 4 //n,m为迷宫的行列范围,p,q是某人迷路所在地点,min用于记录走到终点最小路径的步数 5 public static int n,m,p,q,min=9999; 6 //数组a是迷宫,1代表有障碍物,数组d用于移动方向(右.下.左.上),数组book用于标记当前位置是否在路径中 7 public static int a[][]=new int[51][51],book[][]=new

ybt 1252 广度优先搜索 走迷宫(二维、最小步数)

1252:走迷宫 时间限制: 1000 ms         内存限制: 65536 KB提交数: 7272     通过数: 3241 [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不能斜着走. [输入] 第一行是两个整数,R和C,代表迷宫的长和宽.( 1≤ R,C ≤ 40) 接下来是R行,每行C个字符,代表整个迷宫. 空地格子用‘.’表示,

深度优先算法生成迷宫——Python实现

import random #warning: x and y confusing sx = 10 sy = 10 dfs = [[0 for col in range(sx)] for row in range(sy)] maze = [[' ' for col in range(2*sx+1)] for row in range(2*sy+1)] #1:up 2:down 3:left 4:right operation = {1:(0,-1),2:(0,1),3:(-1,0),4:(1,0

基于深度及广度优先搜索的迷宫问题的演示

1 时间复杂度分析 由于该图采用邻接矩阵存储,整个算法遍历的过程所花费的时间复杂度为该矩阵的N(row*col).而由于其需要分别访问已经定位,需要进行分别2次操作,如下: visited = new bool[col*row];//访问标记 for (i=0; i<row; i++) for (j=0; j<col; j++) visited[i*col+j] = false;//初始为未访问状态 position = new POSITION[col*row]; for (i=0; i&l

深度优先搜索[奥数等式、迷宫找人]

上一节我们用暴力枚举解决奥数等式,虽然简单,但是很蛋疼. http://blog.csdn.net/wtyvhreal/article/details/43267867 这一节讲用深搜的方式解决,高大上. 深度优先搜索(Depth First Search,DFS),理解深搜的关键在于解决"当下该如何做".至于"下一步如何做"则与"当下该如何做"是一样的.通常的方法就是把每一种可能都是尝试一遍.当前这一步解决后便进入下一步.下一步的解决方法和当前

迷宫问题 - 堆栈与深度优先搜索

堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素. 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走

初涉深度优先搜索--Java学习笔记(二)

版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这周初步探索了一下深度优先搜索.对于文科生的我来说,这个名词听起来有点可怕.于是我通过leetcode上的一个难度为medium的题目来逐渐认识这个概念的.这道题目是Validate Binary Search Tree(题号为98).下面我将通过这道题作为引子,整理一下上周学习到的东西. 一.树.

迷宫寻址中深度优先搜索的递归和非递归算法比较

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 本文只探究迷宫寻址中深度优先搜索的递归和非递归算法比较,其他相关代码详见<迷宫问题(巧若拙)>http://blog.csdn.net/qiaoruozhuo/article/details/41020745 深度优先搜索的递归算法是很容易实现的,只需设置一个驱动函数,然后递归调用子函数就可以了. 代码如下: int DeepSearchWay()//寻找路径:深度搜索 { CopyMiGong