Scratch少儿编程|5分钟系列-自动走迷宫|智能AI

网友投稿 2020-03-17 08:46

 前面我们给大家介绍过一个走迷宫的小游戏,今天我们就来小试身手,让scratch实现自动走迷宫的功能。

 自动走迷宫,我们肯定要有一个智能的套路,比如智能寻径,人工智能 等等,不过今天介绍的这个功能似乎也算是带点智能,毕竟是让程序自己走嘛。

https://cdn.china-scratch.com/timg/200319/0T55R423-0.jpg

 好了,在开始之前我们先介绍一种摸墙走迷宫的算法(一提算法,不禁觉得好高大上。其实就是一种分析问题的套路而已)。

 经典的摸墙算法可以简单总结为:在一个连通的迷宫图中我们用左右其中的任意一只手摸着墙就一定可以走出这个迷宫。也称为绕墙走算法,是一种迷宫搜索的初级算法。

 下面我们就使用左手摸墙的走法实现这个算法。算法实现可以用下面的流程图来表示:

https://cdn.china-scratch.com/timg/200319/0T5591431-1.jpg

 我们来分析一下流程中有哪些关键点

 1.走到墙边

 2.检测左边是否存在墙壁

 3.检测前面是否存在墙壁

 4.左右转向

 通过上面分析,好像也没什么难点。那么就让我们动手试一下吧

 1.导入迷宫图,创建角色

 程序开始时,我们可以使用前期的迷宫游戏中使用的迷宫地图作为游戏背景,再选择一个小球作为走迷宫的主角角色。

 如果还没有迷宫地图,可在公众号中回复“迷宫图”

 在这个迷宫图中,我们为了防止小球走到迷宫外面,我们要提前把入口封起来,让迷宫只有一个出口可以走出去。

https://cdn.china-scratch.com/timg/200319/0T5596264-2.jpg

 2.走到墙边

 这个功能没有什么复杂的,就是让角色一直沿着既定的方向前进,直到碰到墙壁即可。这里可以使用侦测中的“碰到颜色”积木来实现

https://cdn.china-scratch.com/timg/200319/0T5596102-3.jpg

 3.检测左边是否存在墙壁

 我们通过流程图可以发现在角色行走过程中要不停的判断左边是否存在墙壁,所以我们就可以定义一个自定义积木。让这个积木专门做检测事件。

 同时我们为了得到检测结果,我们还需要一个左侧是否存在墙壁的变量,我们定义为“左边是否有墙”,如果左边存在墙壁,就将这个变量设为1 否则这个变量值就是0

 判断左边是否存在墙壁,我们可以让角色往左边移动一步,然后再侦测一下是否碰到了墙壁(在这个程序里,因为墙壁的颜色是黑色的,我还依然使用“碰到颜色”作为检测条件)就可以了。

 当左移一步碰到墙壁,则说明左侧存在墙壁,如果没有碰到墙壁,则说明左边没有墙壁。

 因为我们只是做侦测,并不是真的移动,所以我们在检测完毕后还要将角色进行复位。所谓复位就是把我们前进的步数退回来,转的角度也回转回来。

https://cdn.china-scratch.com/timg/200319/0T6004Y3-4.jpg

 4.检测前方是否存在墙壁

 这个功能和前一步中“检测左边是否存在墙壁”功能一致,所以我们就不再进行赘述。

https://cdn.china-scratch.com/timg/200319/0T6004J6-5.jpg

 5.左右转向

 左右转向在整个程序里起到了关键的作用,我们在分清在什么时候向左,什么时候向右。

https://cdn.china-scratch.com/timg/200319/0T6006191-6.jpg

 当左边没墙时,我们要向左转。同时左转后,要让角色移动一步。这个移动非常重要,如果一旦不移动的话,有可能会造成角色在原地打转的情况

 当左边有墙时,这时候我们才可以进行前方是否有墙壁。

   如果此时前方存在墙壁,我们只能右转,因为这时我们左边前面都有墙壁,我们只能右转;

   如果前方没有墙壁,那么此时就可以放心大胆的前进一步。

 6.到达目的地

 在整个过程中,我们都没涉及到是否到达终点的判断,那么我们要在什么时候进行目的地的判断呢?

 我们在观察流程图时,可以发现:其实我们每走一步都要看一下是否已经到达目的地。所以我们在进行循环积木的选择时,就要选择“带条件的重复执行”积木。积木的条件就是角色是否到达的目的地。

https://cdn.china-scratch.com/timg/200319/0T6013126-7.jpg

 通过以上代码的整合,我们就可以得到整个程序的完整代码。

https://cdn.china-scratch.com/timg/200319/0T602J63-8.jpg

 本例代码中我们用的是左手模墙法,您可以试着用右手摸墙法实现这个算法么?

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com