本文我将做为一个小创作者来说说我编写这个程序的过程。
拿到这个题目,想了很多种状况,感觉越想越复杂,有点无处下手,于是乎我决定从最简单的功能开始,制定出阶段性目标,然后逐步去实现,趋于完善,至于最后达到什么效果,我暂时还不去想那么多。
第一步:先让人动起来,简单的说就是通过克隆,让人物从马路的一侧出现,然后走到对面,这一步只要有了编程的基础,都没有什么难度。
程序说明:
1、绿旗点击隐藏角色,随机时间间隔生成一个克隆体;
2、当克隆体启动时,将克隆体移到斑马线的一侧,切换一个随机造型,显示出来,然后通过重复执行,改变克隆体的y坐标,让人物从上向下移动,到达斑马线的另一侧,也就是有坐标小于-170时删除克隆体。
第二步:同样的做法,让车也可以动起来,为了简单,我先只考虑单向行驶(从左往右有车),程序思路跟上面一样,就不再单独解释了。
这样,人车都有了,也都动起来了,那么问题就来了,人车各走各的,相互碰撞,确实乱了套。
接下来就急需解决一个问题,车让人,人让车:对于这种检测碰撞,我就想到了自动循线的模式,给汽车添加一个探测装置,就像如今的无人驾驶一样。
我们在程序中的简易装置如下图:
情况1:如果行人碰到探测装置,表明行人在车的前方,那么就需要让车停下来,人继续通行,如图。
情况2:如果人碰到车,但是人并没有接触到侦测装置,这时候人就需要等车走了才能往前走,如图。
思路有了,还是一步一步来,我们继续编写程序。
一、先实现情况1的程序设计:
采用颜色侦测,如果行人碰到探测装置需要让车停下来。
这时候会想到广播,碰到探测装置广播停车,这样在汽车的程序里添加代码,如果收到停车这个广播消息,等待4秒。然而事实是做不到的,每个克隆体都在重复执行移动的程序,广播无法让汽车停止,或许你会想到,收到广播停止角色其它代码,然后执行等待。好吧,就算我们很费力的处理好这个逻辑,那么还有一个问题,广播的消息是所有克隆体都能收到的,那么汽车收到停车,就意味着所有汽车会同时停下来,就像时间停滞了一样,所以这个思路我放弃了。
要让车停下来,最好的办法就是在汽车的程序中加入等待指令,这样才能阻止汽车移动。
创建一个变量“是否停车”,初始值为0,表示不停车(1表示需要停车)
行人的程序中加入判断,如果碰到探测装置,将“是否停车设置为1”,否则设置为0,如图:
再修改汽车的程序,在重复执行中加入等待语句(等待直到是否停车等于0),如图:
运行程序,发现程序起了效果,但是有一个bug,行人碰到探测装置时所有的汽车都停下来了。这是因为,所有汽车的克隆体都会执行等待,因此,需要再增加一个条件:当前克隆体碰到行人的执行等待,就将刚才的等待指令修改为:
二、解决情况2:如果人碰到车,但是人并没有接触到侦测装置,这时候人就需要等车走了才能往前走。
这就比较简单了,就在行人的代码里,添加一个等待语句就好了。
至此,一个简单的车让人,人让车的功能就有了雏形。
我们当然不能就这么结束了,还要继续完善,需要继续解决的问题:
1,前车在让行人,停下来了,后车不能与前车发生碰撞追尾;
2、现在只有单向有车,双向的车辆如何解决?
一:不让车追尾,有经验的朋友们就知道怎么做了,编辑一下汽车的造型,在车尾画一个红色尾灯,如果汽车的探测装置碰到红色尾灯,让当前汽车停下来即可。
1、先编辑汽车所有造型,给车尾画一个红色的尾灯(红色原点即可,颜色保持一致)
2、在汽车的程序里加上等待。(颜色一定要选准,否则就无法侦测碰撞了),汽车的完整代码如下:
运行测试一下,虽然不是非常精准,但是基本的功能都能模拟出来了。
二、实现双向行车。
1、我们再复制一个汽车角色:
2、修改这个复制出来的角色代码,需要修改的地方有:
a、初始位置在舞台右侧,面向左。
b、x坐标增加负值,实现从右往左移动,判断x坐标小于-230时删除克隆体
3、在行人的代码里再添加一个等待
复制的角色Convertible 3代码如下:
这样我们智慧交通的一个简单模型就完成了(当车流量大或者人流量大时还有bug存在,毕竟我们的探测装置很简陋。),希望能给你一些帮助,如果你有更好的思路或者创意,欢迎上传到少儿编程网,一起分享学习。
总结:程序用到的知识不多,实现到目前的功能难度也不是很大,重点是学会如何分析,如何将大的问题进行拆分,运用迭代的思想去一步步完善。
源码下载:Scratch少儿编程挑战-智慧交通
原创内容谢绝转载
本站内容未经许可,禁止任何网站及个人进行转载。