c++随机生成迷宫_三种迷宫算法在Grasshopper中的实现(二)

ed7429098b859780072be1a0efa48c5f.png

(二)随机Prim算法

可以先看看这篇博客的介绍:https://blog.csdn.net/juzihongle1/article/details/73135920

作者是这样描述的:

1.让迷宫全是墙.
2.选一个单元格作为迷宫的通路,然后把它的邻墙放入列表
3.当列表里还有墙时

--1.从列表里随机选一个墙,如果这面墙分隔的两个单元格只有一个单元格被访问过
--------1.那就从列表里移除这面墙,即把墙打通,让未访问的单元格成为迷宫的通路
--------2.把这个格子的墙加入列表
--2.如果墙两面的单元格都已经被访问过,那就从列表里移除这面墙
对比随机prim算法,深度优先算法每次循环时参与打通的墙只有末端附近的墙,而随机prim算法每次参与循环时会不断增加可选择的墙的列表。所以深度优先算法生成的迷宫有一条明显的主路,而随机prim算法生成的迷宫随机性更强,更自然

8d816292278aa035d6151510a7fadde3.gif

下面是大致的思路:
需要这些值参与循环:


“陆地”列表 - RestPoints
未被选择的墙列表 - BlueRest
参与随机选择的墙的列表 - RandomSel
路径序号 - RoadPaths
墙序号 - WallPaths

4237df74b5bff313acf729b505b186c8.png

循环判断依据:1.判断随机选择的墙两侧的“陆地”是否共同存在于“陆地”列表:


如果True,则把这堵墙打通,
如果False,则保留这堵墙。

38fc690f930d791b6fa0c62feeef1ae7.png

2.因为每次循环都需要把新选择“陆地”附近的墙加入参与随机选择的墙的列表,有可能出现周围没有墙的情况,所以需要判断附近未被选择的墙的数量是否为0


如果True,则直接进入下一此循环;
如果False,则把附近的墙加入参与随机选择的墙的列表进入下一此循环;

8723af50a4cce1642f68ea0d8a8b4994.png

终止判断依据:
如果“陆地”列表没有点了,则终止循环。


最后join一下offset一下loft一下Union一下extrude一下

4ac5afba1c15edcb988da1b588e8f0f5.png

bdf5a7ee23010a38d44be99a18b1203a.png

迷宫电池图:

b4423f2b8ec21b92f6b934f03a763b8d.png

百度网盘地址:

链接:https://pan.baidu.com/s/1hg2TDEi9R1sr53iQUnpkMw

提取码:fhb6

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值