java深度优先迷宫生成_基于深度优先的迷宫生成算法

原标题:基于深度优先的迷宫生成算法

思路:

深度优先的深宫生成算法,通常使用堆栈实现,这种方法是使用计算机生成迷宫的最简单的方法之一。我们将迷宫看作一个大的棋盘,用一个二维数组表示。随机选择一个单元格为迷宫的起点,对这个单元格的四面墙。随机选择一面墙,如果与此墙相邻的单元格也是墙,则将这面墙及对面的单元格打成通路,并将其添加到栈中,以便于回溯。而后,以此单元格为基点,重复该过程。

直到遇到死路,即四面墙均无法形成通路。此时,通过回溯,直到有可形成通路的单元格。继续生成路径。直到回溯到起点。则已经访问每个可能性单元格。

如上所述,如该算法使用递归,可能在一些计算机体系结构上引起堆栈溢出问题。通过将回溯信息存储在栈中,可以将算法重新排列成循环。这也提供了一种显示解决方案的快速方法,通过在任何给定点开始并回溯到开始。

特性:

一般来说,使用深度优先搜索生成的迷宫较其它算法而言可能分支效少,但每条分支长度较长。因为算法在回溯之前沿着每个分支尽可能地探查。为了给深度优先搜索生成的迷宫添加困难和有趣的因素,你可以影响你应该访问哪个方向的可能性,而不是完全随机。通过使它更可能访问你的所指定的单元格,这样可以使你有一个更有趣的迷宫。在某些地方尝试定向通道“偏置”可能导致创建有趣的设计,例如棋盘图案,X等。

算法步骤:

使初始单元格成为当前单元格并将其标记为已访问;

虽然有未访问的单元格;

如果当前小区具有没有被访问的任何邻居;

随机选择一个未访问的邻居;

将当前单元推送到栈;

移除当前单元格和所选单元格之间的墙;

使所选单元格成为当前单元格,并将其标记为已访问;

否则如果栈不为空;

从堆栈中弹出单元格;

使其成为当前单元格;

如果栈为空结束循环;

UnityC# 代码:

usingUnityEngine;

usingSystem.Collections;

usingSystem.Collections.Generic;

publicclassMaze :MonoBehaviour{// Use this for initialization

voidStart () {

ShowMap (CreateMaze (55,29));

}

int[,] CreateMaze(intx,inty) {

Stack path =newStack ();

int[,] map =newint[x, y];

for(inti =0; i < y; i++) {

for(intj =0; j < x; j++) {

map[j,i] =1;

}

}

Vector2startPoint =newVector2(1,1);

map [(int)startPoint.x, (int)startPoint.y] =0;

Vector2currentPoint = startPoint;

path.Push (currentPoint);

while(true) {

intindex =Random.Range (0,100);

for(inti =0; i <4; i++) {

Vector2currentDir = Loop4Dir(index+i);

Vector2checkWall = currentPoint+currentDir;

Vector2checkPoint = currentPoint+currentDir+currentDir;

if(checkPoint.x<0||checkPoint.y<0||checkPoint.x > x-1||checkPoint.y > y-1)

{

continue;

}

if(map[(int)checkPoint.x,(int)checkPoint.y]==1) {

map[(int)checkWall.x,(int)checkWall.y] =0;

map[(int)checkPoint.x,(int)checkPoint.y] =0;

currentPoint = checkPoint;

path.Push (currentPoint);

i =0;

index =Random.Range(0,100);

}

}

if(currentPoint==startPoint)break;

currentPoint = path.Pop();

}

returnmap;

}

voidShowMap(int[,] map){

for(inti =0; i < map.GetLength(1); i++) {

for(intj =0; j < map.GetLength(0); j++) {

switch(map[j,i]) {

case1:{

GameObjecttempGO =GameObject.CreatePrimitive(PrimitiveType.Cube);

tempGO.transform.position =newVector3(j,0,i);

}

break;

default:break;

}

}

}

}

Vector2Loop4Dir(intindex){

index %=4;

switch(index) {

case0:returnVector2.up;

case1:returnVector2.right;

case2:return-Vector2.up;

default:return-Vector2.right;

}

}

}

最终生成的参考图:

责任编辑:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值