[极限压缩]80行代码教你用Prim算法做一个永远有解的迷宫生成器
vb吧
全部回复
仅看楼主
level 3
以上是
镇楼
图,希望别水帖[吐舌]
2020年01月11日 13点01分 1
level 3
一.初始化部分
定义3个变量,迷宫主体,分别是迷宫方块大小(画笔大小),迷宫大小
redim是为了重新定义迷宫主体这一数组的大小
=1是令迷宫的单元格为通路,防止判断是出现错误↓
二.核心判断
下面是迷宫初始化,prim算法核心我是从以下学来的,大家可以参考以下
https://indienova.com/u/cocolate/blogread/1493
可以参照下(B站)[YangZii_]的思路过程http://www.bilibili.com/video/av49961819令第一个格子为被访问过的格子,Xm.ADD和Ym.add分别是墙的坐标然后加入墙列表
三.判断通路与否
以上像if (x-i)+(y-i)是判断格子的状态,上下左右
那么就是说(x-1,y);(x+1,y);(x,y-1);(x,y+1)。所以若(X-i)+(Y-i)=1的时候,就是在判断上下左右这一格子
四.绘图
原创作者BY:Text
PS:若有侵权的,请迅速联系我,我会第一时间做出处理
欢迎大家在评论区回复,我会在3楼发布网盘链接[呵呵]
2020年01月11日 14点01分 2
求源码
2021年05月26日 09点05分
level 3
自顶
2020年01月11日 14点01分 4
level 3
自顶[熊-HI]
2020年01月11日 14点01分 5
level 1
顶一个,求链接
2020年01月11日 15点01分 6
level 6
厉害厉害
2020年01月12日 00点01分 7
level 12
顶一个
2020年01月12日 11点01分 8
level 11
我赞一个,请求大吧小吧给加个精呀啥的
2020年01月13日 08点01分 9
level 11
里面使用的数据类型Collection是我不认识的……
请楼主指教
2020年01月13日 08点01分 10
请看11楼
2020年01月13日 13点01分
@白色的电脑无悔 谢谢解惑
2020年01月13日 13点01分
level 3
Collection其实就是一个项目集合,像Dim a As Collection 就是建立集合,然后用set a = new Collection 声明一个新的集合,你可以使用a.add(str/int/控件/double/long/...)添加成员对象,用a.item(项目的序号[Index])来调用这个对象remove(index)则是删除一个成员对象,我们可以用For Each...Next来判断每个a中的成员。还有就是a.count就是这个集合里所有的所有成员的总和(有几个成员)
以下来自MSDN FOR VB6.0 (VB帮助系统)
Collection 对象
Collection 对象是项目所组成的有序集合,可以把这个集合作为单元来引用。
说明
Collection 对象提供了简便方法,直截了当将一组相关的项目视为单一对象来引用。集合中的项目或成员被这样一个事实联系起来:它们都属于这个集合。集合的成员不一定都是同一种数据类型的。
建立集合的方法与建立其它对象的方法一样。例如:
Dim X As New Collection
一旦建立集合之后,就可以用 Add 方法添加成员,用 Remove 方法删除成员。在用 For Each...Next 语句重复整个集合时,可以用 Item 方法从集合返回特定成员。
1.ADD
Add 方法
添加一个成员到 Collection 对象。
语法
object.Add item, key, before, after
Add 方法的语法具有下列对象限定符和命名参数:
部分 描述
object 必需的。对象表达式,其值为“应用于”列表中的对象。
item 必需的。任意类型的表达式,指定要添加到集合中的成员。
key 可选的。唯一字符串表达式,指定可以使用的键字符串,代替位置索引来访问集合中的成员。
before 可选的。表达式,指定集合中的相对位置。在集合中将添加的成员放置在 before 参数识别的成员之前。如果为一数值表达式,则 before 必须是介于 1 和集合 Count 属性值之间的值。如果为一字符串表达式,则当添加一个被引用的成员到集合时,before 必须对应于指定的 key 值。可以指定 before 位置或 after 位置,但不能同时指定这两个位置。
after 可选。表达式,指定集合中的相对位置。在集合中将添加的成员放置在 After 参数识别的成员之后。如果为一数值表达式,则 after 必须是介于 1 和集合 Count 属性值之间的值;如果为一字符串表达式,则当添加一个被引用的成员到集合时,after 必须对应于指定的 key 值。可以指定 before 位置或 after 位置,但不能同时指定这两个位置。
说明
before 或 after 参数是字符串表达式或数值表达式,均须引用集合中现有成员,否则将导致错误发生。
如果指定的 key 和集合中现有成员的 key 发生重复,则也会导致错误发生。
2.item
Item 方法
利用位置或键返回 Collection 对象的指定成员。
语法
object.Item(index)
Item 方法的语法具有下列对象限定符和部分:
部分 描述
object 必要。对象表达式,其值为“应用于”列表中对象。
index 必要。为一表达式,指定集合中成员的位置。如果是数值表达式,则 index 必须是从 1 到集合 Count 属性值之间的数值。如果是字符串表达式,则当加入一被引用的成员到集合时,index 必须和 key 参数对应。
说明
如果 index 值无法与集合的任何现有成员匹配,就会导致错误发生。
Item 方法是集合的缺省方法。因此,以下两行程序代码等价:
Print MyCollection(1)Print MyCollection.Item(1)
3.remove
Remove 方法
把成员从 Collection 对象中删除。
语法
object.Remove index
Remove 方法的语法具有下列对象限定符和部分:
部分 描述
object 必需的。对象表达式,其值为“应用于”列表中的对象。
Index 必需的。表达式,指定集合成员的位置。如果是数值表达式,则 index 必须是介于 1 和集合 Count 属性值之间的数。如果是字符串表达式,则在将被引用的成员添加到集合时,index 必须和 key 参数一致。
说明
如果 index 的值与集合的现有成员不匹配,则会导致错误发生。
4.For...Each Next
For Each...Next 语句
针对一个数组或集合中的每个元素,重复执行一组语句。
语法
For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
For...Each...Next 语句的语法具有以下几个部分:
部分 描述
element 必要参数。用来遍历集合或数组中所有元素的变量。对于集合来说,element 可能是一个 Variant 变量、一个通用对象变量或任何特殊对象变量。对于数组而言,element只能是一个 Variant 变量。
group 必要参数。对象集合或数组的名称(用户定义类型的数组除外)。
statements 可选参数,针对 group 中的每一项执行的一条或多条语句。
说明
如果集合中至少有一个元素,就会进入 For...Each 块执行。一旦进入循环,便先针对 group 中第一个元素执行循环中的所有语句。如果 group 中还有其它的元素,则会针对它们执行循环中的语句,当 group 中的所有元素都执行完了,便会退出循环,然后从 Next 语句之后的语句继续执行。
在循环中可以在任何位置放置任意个 Exit For 语句,随时退出循环。Exit For经常在条件判断之后使用,例如If匱hen,并将控制权转移到紧接在 Next 之后的语句。
可以将一个 For...Each...Next 循环放在另一个之中来组成嵌套式 For...Each...Next 循环。但是每个循环的 element 必须是唯一的。
注意 如果省略 Next 语句中的 element,就像 element 存在时一样执行。如果 Next 语句在它相对应的 For 语句之前出现,则会产生错误。
不能在 For...Each...Next 语句中使用用户自定义类型数组,因为 Variant 不能包含用户自定义类型。
二.示例
Collection 对象示例
本示例建立一个命名为 MyClasses 的 Collection 对象,再建立一个对话框,让用户可从对话框中将对象建立到该集合对象中。若要观察程序如何工作,请先在“插入”菜单上选择“类模块”命令,然后在 Class1 的模块级中声明一个公用变量,命名为 InstanceName(类型为 Public InstanceName),此变量用来保存每个类实例的名称。不要更改类的缺省名称 Class1。将下列代码复制到另一个模块的“通用”节中,然后在另一个过程中用 ClassNamer 语句使它启动激活。(本示例仅使用支持类的主机应用程序。)
Sub ClassNamer() Dim MyClasses As New Collection ' 建立一个集合对象(Collection)。 Dim Num ' 计数用变量,用来对对象的个数计数。 Dim Msg As String ' 提示信息用变量。 Dim TheName, MyObject, NameList ' 对象信息用变体。 Do Dim Inst As New Class1 ' 建立 Class1 的新实例。 Num = Num + 1 ' 把计数变量 Num 加一,然后要求输入新对象个体的名称。 Msg = "Please enter a name for this object." & Chr(13) _ & "Press Cancel to see names in collection." TheName = InputBox(Msg, "Name the Collection Items") Inst.InstanceName = TheName ' 将名称送入对象实例。 ' 若用户输入了名称,将它加入集合。 If Inst.InstanceName <> "" Then ' 将命名的对象加入集合。 MyClasses.Add item := Inst, key := CStr(Num) End If ' 清除当前的引用,为对下一个对象做准备。 Set Inst = Nothing Loop Until TheName = "" For Each MyObject In MyClasses ' 建立名称列表。 NameList = NameList & MyObject.InstanceName & Chr(13) Next MyObject ' 将名称列表在消息框中显示出来。 MsgBox NameList, , "Instance Names In MyClasses Collection" For Num = 1 To MyClasses.Count ' 从集合中删除名字。 MyClasses.Remove 1 ' 因为每删除一个对象后,集合 ' 会自动重排顺序,故每次迭代时只需删除第一个 Next ' 对象即可。End Sub
2020年01月13日 13点01分 11
level 12
代码哪里有?
2020年01月15日 02点01分 13
level 3
emmmm成了万年水帖了= =[汗]
2020年02月09日 05点02分 16
有源码吗
2021年05月26日 09点05分
level 1
拉个屎
2023年07月28日 18点07分 19
1