Scratch第三十九讲:俄罗斯方块

2019-11-03 15:41

想了解编程技巧,就请点击上面蓝字:跟我学Scratch编程,关注CC哥


 

这个俄罗斯方块本来CC哥想自己做,后来看到网上有一个朋友找了个例子但是看不懂,那CC哥也先不费功夫了,就把这个例子拿出来给大家讲解一遍。说真心话,看别人的例子比自己写还累。

俄罗斯方块


这个例子还是挺复杂的,初学者确实很难看懂,CC哥也花了些时间来。这个程序的网址如下,大家有兴趣可以自己上去下载。https://scratch.mit.edu/projects/2725010/editor
阅读别人的程序也有很多好处:1:学习别人的编程技巧,即使是scratch,但也是一门编程语言,一样有很多技巧,所以多看别人的程序,会学到很多技巧。而且可以学到一些很多教程上没有的方法。2:学习别人的编程思路,一个人做程序久了,就会形成自己的固定思路,碰到一个问题就会用自己最熟悉的思路去编程。多看看别人的程序,就会看到很多新的思路,开阔自己的思维。就跟你做奥数题一样啦,不光自己做,还要看看别人的解题方法。
我们观察一下这个程序的特点,也就是比较独特的部分:1:首选我们看这个程序里有哪些角色,前面7个就是7个方块了,不好理解的是detecter这个角色。剩下的角色都好理解。我们一会再去单独谈detecter这个角色。

https://cdn.china-scratch.com/timg/191105/154112I36-0.jpg


2:就是这个方格背景了,所有的方块都要严格的在这个方格背景里移动,这个看着简单,大家学scratch这么久了,应该知道还是有点难度的,如何做到,我们一会讨论。

https://cdn.china-scratch.com/timg/191105/1541124J6-1.jpg

3:第三个就是每个方块的移动,如何保证每个方块落到另一个方块上就会停下来。scratch里面一般是检测碰到角色,和碰到颜色,那么这个程序用的哪个呢?

https://cdn.china-scratch.com/timg/191105/1541134595-2.jpg

4:当一个方块落到下面停下来后,怎么实现这方块就停留在下面,而新的同样的角色还在上面?这个是用什么方法实现呢?

https://cdn.china-scratch.com/timg/191105/1541132939-3.jpg


5:就是当方块把某一层全部铺满的的时候,程序怎么能检测到呢?通过什么来检测呢?这是一个难点,说句实话,CC哥想了多方案,发现最后都没有设计者的构思的简单方便。

https://cdn.china-scratch.com/timg/191105/1541132016-4.jpg

6:当检测到某一层铺满之后,程序怎么实现的消除呢?这也是个难点,因为消除怎么实现呢?而且你还要保证上面的方块全部移下来。消除完之后会有很多方块就不是原来的角色形状了。

https://cdn.china-scratch.com/timg/191105/1541131W9-5.jpg


这是CC哥在分析这个程序时所发现的一些技术点,如果我们能自己想出解决的办法,或者能看懂编程者的方法,那么我们自己也就可以写这个程序了。另外一些技术点就比较容易理解,CC哥就不花篇幅讲了,比如玩这个俄罗斯方块,大家都知道角色可以选择,可以有四个方向,是不是大家第一的反应就是用角色旋转来做?而编程者就不是用旋转来做的,而是用造型来处理的。是不是很巧妙?所以当按旋转按钮的时候,程序只要选造型就好了。

https://cdn.china-scratch.com/timg/191105/1541133Z3-6.jpg

程序解析


我们先从简单的问题出发,第二个问题,编程者怎么控制这些角色沿着方格来运动的。而且在移动过程中如何检测碰到其他方块?

https://cdn.china-scratch.com/timg/191105/1541135396-7.jpg

通过这个就能看出,其实每一步移动距离都是20,也就是方格的大小也是20。如何检测碰到其他角色呢?我们发现只有一个检测命令,就是检测黑色。如果移动后发现碰到黑色,就退回上一步。

https://cdn.china-scratch.com/timg/191105/1541143145-8.jpg

从这里我们可以发现,这个编程其实最复杂的地方(设计程序经常会碰到虽然不难,但是很复杂的情况)就是如何精准的控制位置,和检测多个角色之间的相互碰撞。在检测方面编程者用了一招最简单的方式,通过给每一个方块加上一圈黑色的边,把整个方格区域的四周加上了一圈黑边,这样只需要检测黑色,就可以实现所有复杂的角色之间相互碰撞的问题了。但是这样简单的方式也带来了问题,就是要精准的控制角色的尺寸和位置。下面这个图看出问题来没有?
本来这个木棍方块应该在往下走一格的,但是肯定是碰到了下面黄色方块或橙色的T字方块的边上,导致没有落下来。这就是编程者没有精准的处理好角色的尺寸。这样的问题在消除的时候也会出现。

https://cdn.china-scratch.com/timg/191105/154114A95-9.jpg

通过分析,回答了刚才2和3的问题。
然后我们看一下这几个方块角色的程序,基本上都一样,CC哥只简单讲这个T方块就好了:

https://cdn.china-scratch.com/timg/191105/1541145K1-10.jpg


1:当接收到T的消息,也就是说出来一个T方块,那么就往下落好了,程序不复杂,在没有碰到黑色以前(不论是其他角色和边框)一直下落,每次一格。2:如果碰到了,就回退一步,这样可以停留在被碰物体的上方。3:重点来了,当停稳后,图章! 图章命令大家学过了,就是在原地画一个该角色。这就回答了刚才第四个问题,编程者是通过图章命令来让角色停留在原地的。并不是通过克隆。

https://cdn.china-scratch.com/timg/191105/15411555c-11.jpg


这个是用上箭头来进行方块的旋转,就是每按一次切换一个造型,其中在切换时一定要检测一下是否碰到其他角色或边框,如果碰到,就不做旋转。

https://cdn.china-scratch.com/timg/191105/1541152D7-12.jpg

这段程序是在程序开始界面里显示一下方块。

https://cdn.china-scratch.com/timg/191105/154115L53-13.jpg

https://cdn.china-scratch.com/timg/191105/1541154520-14.jpg

这段程序是在方格的右上角提醒下一个要出现的方块的样子。

https://cdn.china-scratch.com/timg/191105/15411544b-15.jpg

https://cdn.china-scratch.com/timg/191105/1541162309-16.jpg


关于检测和消除这部分是程序里难度最大的部分,CC哥下一课再跟大家讲。

总结


在scratch的官网上有很多非常复杂的程序,来自世界各地Scratch的爱好者,有些连CC哥看起来也非常吃力。但是每次认真分析完一个程序,虽然你还做不出同样的程序,但是你的编程思路都会得到拓宽。CC哥再一次强调,Scratch是一个非常好的锻炼思维的工具,通过它可以提升小朋友的思维的科学性,严谨性,逻辑性,创造性。至于是不是一定要编写出复杂的程序,并不重要。

--end--

后记,小编朋友公司研发了一个游戏化的少儿编程在线课程(5-12岁),游戏化教学结合scratch(一款在线少儿编程工具,类似乐高的积木拼搭),我家娃娃学了几次课,非常喜欢(超预期),16次课才200多块钱,对锻炼孩子的思维能力和动手动力很有帮助。

感兴趣的朋友可以扫描二维码,关注一下,或微信搜索“大耳猴少儿编程”

https://www.china-scratch.com/Uploads/Editor/2018-04-22/5adca08bdc212.jpg

声明:本文章由爬虫自动处理和转载作为教育分享用途,原作者可通过邮件及时和我们联系处理:freemanzk@qq.com