Scratch第三十九讲:俄罗斯方块
2019-03-01 11:30
这个俄罗斯方块本来CC哥想自己做,后来看到网上有一个朋友找了个例子但是看不懂,那CC哥也先不费功夫了,就把这个例子拿出来给大家讲解一遍。说真心话,看别人的例子比自己写还累。
俄罗斯方块
这个例子还是挺复杂的,初学者确实很难看懂,CC哥也花了些时间来。这个程序的网址如下,大家有兴趣可以自己上去下载。https://scratch.mit.edu/projects/2725010/editor
阅读别人的程序也有很多好处:1:学习别人的编程技巧,即使是scratch,但也是一门编程语言,一样有很多技巧,所以多看别人的程序,会学到很多技巧。而且可以学到一些很多教程上没有的方法。2:学习别人的编程思路,一个人做程序久了,就会形成自己的固定思路,碰到一个问题就会用自己最熟悉的思路去编程。多看看别人的程序,就会看到很多新的思路,开阔自己的思维。就跟你做奥数题一样啦,不光自己做,还要看看别人的解题方法。
我们观察一下这个程序的特点,也就是比较独特的部分:1:首选我们看这个程序里有哪些角色,前面7个就是7个方块了,不好理解的是detecter这个角色。剩下的角色都好理解。我们一会再去单独谈detecter这个角色。
2:就是这个方格背景了,所有的方块都要严格的在这个方格背景里移动,这个看着简单,大家学scratch这么久了,应该知道还是有点难度的,如何做到,我们一会讨论。
3:第三个就是每个方块的移动,如何保证每个方块落到另一个方块上就会停下来。scratch里面一般是检测碰到角色,和碰到颜色,那么这个程序用的哪个呢?
4:当一个方块落到下面停下来后,怎么实现这方块就停留在下面,而新的同样的角色还在上面?这个是用什么方法实现呢?
5:就是当方块把某一层全部铺满的的时候,程序怎么能检测到呢?通过什么来检测呢?这是一个难点,说句实话,CC哥想了多方案,发现最后都没有设计者的构思的简单方便。
6:当检测到某一层铺满之后,程序怎么实现的消除呢?这也是个难点,因为消除怎么实现呢?而且你还要保证上面的方块全部移下来。消除完之后会有很多方块就不是原来的角色形状了。
这是CC哥在分析这个程序时所发现的一些技术点,如果我们能自己想出解决的办法,或者能看懂编程者的方法,那么我们自己也就可以写这个程序了。另外一些技术点就比较容易理解,CC哥就不花篇幅讲了,比如玩这个俄罗斯方块,大家都知道角色可以选择,可以有四个方向,是不是大家第一的反应就是用角色旋转来做?而编程者就不是用旋转来做的,而是用造型来处理的。是不是很巧妙?所以当按旋转按钮的时候,程序只要选造型就好了。
程序解析
我们先从简单的问题出发,第二个问题,编程者怎么控制这些角色沿着方格来运动的。而且在移动过程中如何检测碰到其他方块?
通过这个就能看出,其实每一步移动距离都是20,也就是方格的大小也是20。如何检测碰到其他角色呢?我们发现只有一个检测命令,就是检测黑色。如果移动后发现碰到黑色,就退回上一步。
从这里我们可以发现,这个编程其实最复杂的地方(设计程序经常会碰到虽然不难,但是很复杂的情况)就是如何精准的控制位置,和检测多个角色之间的相互碰撞。在检测方面编程者用了一招最简单的方式,通过给每一个方块加上一圈黑色的边,把整个方格区域的四周加上了一圈黑边,这样只需要检测黑色,就可以实现所有复杂的角色之间相互碰撞的问题了。但是这样简单的方式也带来了问题,就是要精准的控制角色的尺寸和位置。下面这个图看出问题来没有?
本来这个木棍方块应该在往下走一格的,但是肯定是碰到了下面黄色方块或橙色的T字方块的边上,导致没有落下来。这就是编程者没有精准的处理好角色的尺寸。这样的问题在消除的时候也会出现。
通过分析,回答了刚才2和3的问题。
然后我们看一下这几个方块角色的程序,基本上都一样,CC哥只简单讲这个T方块就好了:
1:当接收到T的消息,也就是说出来一个T方块,那么就往下落好了,程序不复杂,在没有碰到黑色以前(不论是其他角色和边框)一直下落,每次一格。2:如果碰到了,就回退一步,这样可以停留在被碰物体的上方。3:重点来了,当停稳后,图章! 图章命令大家学过了,就是在原地画一个该角色。这就回答了刚才第四个问题,编程者是通过图章命令来让角色停留在原地的。并不是通过克隆。
这个是用上箭头来进行方块的旋转,就是每按一次切换一个造型,其中在切换时一定要检测一下是否碰到其他角色或边框,如果碰到,就不做旋转。
这段程序是在程序开始界面里显示一下方块。
这段程序是在方格的右上角提醒下一个要出现的方块的样子。
关于检测和消除这部分是程序里难度最大的部分,CC哥下一课再跟大家讲。
需要更精彩的Scratch3.0版本俄罗斯方块游戏的,请移步到这里,https://www.51scratch.com/85.html。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com