如何让程序自己走迷宫是一个挺深奥的问题,涉及到生成迷宫的prim算法、深度优先算法,走迷宫的广度优先算法、深度优先算法等。不过那些都有一定难度,我们还是先从最简单的一种算法开始吧,这种自动走迷宫的算法其实是把自己当成盲人走迷宫。这就是“左手法则”,这种法则只针对有墙壁且出口在墙壁上的迷宫(如果出口在大厅中心的情况就不适用了),只要顺着墙壁走,都能走出去。
因为出口和入口的墙壁都是闭合曲线,所以这种“法则”在这类迷宫中是通用。不过“左手法则”的效率太低,只适用于小范围的固定迷宫,而大范围的迷宫用这种算法会耗费大量的时间。未来我也会和大家分享“深度优先”等算法和如何自动生成随机迷宫。
最经典的“左(右)手法则”算法:在一张连通的迷宫图中我们用左右任意一只手一直摸着墙就一定可以走出这个迷宫,也称为绕墙走算法(或摸墙算法),是一种迷宫搜索的初级算法。左手法则的关键点:
1.走到墙边
2.监测左边是否有墙壁
3.监测前面是否有墙壁
4.左右转向。
下面我们把左手摸墙的走法用流程图表示出来,更加方便让大家理解。
代码分析:
程序以网上找到的一个简单迷宫为背景,迷宫墙壁为黑色。圆球角色Ball走迷宫,Bell铃铛为迷宫出口。
我们需要自定义三个函数模块积木,对应左手法则的三个判断(走到墙边,判断左边是否有墙,判断前边是否有墙)。
1.走到墙边
这个功能就是让角色一直沿着既定的方向前进,直到碰到墙壁。这里可以使用侦测中的“碰到颜色”积木来实现。
2.判断左边是否有墙
根据流程图结合代码,要求角色行每行动一步就要判断一次左边是否存在墙壁。在这个自定义函数中,我们还要定义一个“左边是否有墙”的变量,如果左边存在墙壁,就将这个变量设为1 ,否则这个变量值就是0(一直重复判断直到角色最终走出迷宫)。如何判断左边是否存在墙壁呢?我们可以让角色往左边移动一步,然后再侦测一下是否碰到了墙壁(在本例中,墙壁颜色是黑色的,可以使用“碰到颜色黑”作为检测条件)就可以了。当左移一步碰到墙壁,则说明左侧存在墙壁,如果没有碰到墙壁,则说明左边没有墙壁。
因为左移动作只是为了做侦测,并不能真的移过去,所以在检测完毕后还要将角色进行复位。把移动的步数退回来,转过的角度也要转回来。
3.判断前方是否有墙
这个功能和判断左边是否有墙的方法一致,也需要添加“前边是否有墙”变量,用“碰到颜色黑”为条件。当前进一步碰到墙壁,则说明前方存在墙壁,变量值为1,如果没有碰到墙壁,则说明左边没有墙壁,变量值为0。并退回到原处。
接下来看分析主程序的代码部分,设置变量初始值为0,恢复角色初始位置,设置角色大小方向。走到墙边,然后开始进行角色移动过程的两种判断,重复执行直到角色到达终点也就是碰到Bell,结束循环。在循环的过程中先判断左边是否有墙壁,当左边没墙时向左转,且角色前进一步。
这个前进移动非常重要,如果忘记写前进代码的话,会造成角色原地打转的Bug。当左边有墙时,才可以进行前方是否有墙壁的判断。如果前方存在墙壁,因为这时左边前面都有墙壁,我们只能右转,注意只是右转并没有前进。如果判断前方没有墙壁,那么此时就可以放心的前进一步。最终角色会一直自己左边的墙壁运动直到终点,走出迷宫。
今天用最简单的左手法则算法完成了自动走迷宫的目标,对算法有了一点最基础的了解,在未来的时间里,我也会和大家分享深度优先算法和递归的算法,更快得走出迷宫。并学会自动生成随机迷宫地图。
《Scratch3.9青少年编程高分宝典》
重磅编程教材上市预售,原价78元,优惠价58.5元
编程创造未来,人工智能从青少年抓起,
专为编程等级考试和蓝桥杯考试量身定做的详实真题库
电脑报|数橙科学|联合出品
这是一本是以麻省理工大学开发的图形化编程工具Scratch3.0为基础,创作、编写的青少年编程指导工具书,由电脑报数橙科学根据实际授课的教学内容精编整理而成。成立于2017年的数橙科学致力于青少年科普推广、科学教育、研发创新的电脑编程、机器人和中小学STEAM课程,让青少年能快速掌握人工智能时代的科学技能,适应未来社会的发展。全书内容由浅入深,分为四个部分:
1.编程基础指令。通过动画、游戏等案例,详细地讲析各个图形化指令的含义及用法;
2.作品分析、创作。在学习基础指令的同时,学习指令的不同组合方式和所达到的效果;编写简单的动漫、课件或游戏作品。
3.算法挑战。通过学习算法如链表、迭代算法、冒泡排序法等,了解数据结构的基本概念;为以后进一步学习语言编程打下基础
4.综合实战。将编程与艺术、数学、科学、工程相结合,学习和编写综合性的大型案例。
全彩印刷,遵循青少年的思维特点,从青少年最感兴趣的动漫、游戏入手,图文并茂、由浅入深,循序渐进。与目前市场上的Scratch教程相比,更加注重项目式学习,全书都是通过完成一个又一个的程序项目来掌握相关的知识点。同时,更具系统性,体系更加完整,其它图书很少涉及的算法与综合实战、程序调试也是本书的一大亮点。
每章学习后都有课后强化能够帮助学生巩固学习效果延伸本章知识。在每个部分阶段学习完成后还有取自编程等级考试真题和编程竞赛的真题训练,有利于学生通过真题了解自己的知识掌握水平。学习完本书第一、二部分,就可以掌握Scratch等级考级一、三级的内容。学完本书就可以掌握参加蓝桥杯Scratch编程大赛的知识。