极客小将

您现在的位置是:首页 » scratch编程资讯

资讯内容

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

极客小将2021-02-18-
这个俄罗斯方块本来CC哥想自己做,后来看到网上有一个朋友找了个例子但是看不懂,那CC哥也先不费功夫了,就把这个例子拿出来给大家讲解一遍。说真心话,看别人的例子比自己写还累。 俄罗斯方块 这个例子还是挺复杂的,初学者确实很难看懂,CC哥也花了些时间来

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

俄罗斯方块


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

upload/article/images/2021-02-18/8544023eaacbcac597a7d819d4e4d90a.jpg


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

upload/article/images/2021-02-18/ba8d2a04aa0b55358813e5846e252322.jpg

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

upload/article/images/2021-02-18/9ec672c669c0ccc98ec02b666ea413db.jpg

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

upload/article/images/2021-02-18/99632f56d2ceb53577e85c08f07ffd11.jpg


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

upload/article/images/2021-02-18/7ea968c8817485709fbbd71d66ed4b02.jpg

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

upload/article/images/2021-02-18/9b703c77dbbc1ed447957cd77c5eb07d.jpg


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

upload/article/images/2021-02-18/dab296dc2a72ab006c30e4ca9726343a.jpg

程序解析


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

upload/article/images/2021-02-18/b303f56795b6b8a528118f8ac34fbb55.jpg

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

upload/article/images/2021-02-18/f57c12d945648a6c61a8c25d3cfd408e.jpg

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

upload/article/images/2021-02-18/75d069391f4826f276073a348cd610b7.jpg

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

upload/article/images/2021-02-18/cde165fc247e334ce0707766ae0834c8.jpg


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

upload/article/images/2021-02-18/996b0d4ebf266972d8b871636cd2a1c1.jpg


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

upload/article/images/2021-02-18/c25b8db622028909c11b0844b00364e4.jpg

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

upload/article/images/2021-02-18/052b4232ec4aa9d27921ea15b1978f4a.jpg

upload/article/images/2021-02-18/ab7d03d7f19529896d95bf5acbcc2d96.jpg

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

upload/article/images/2021-02-18/f33f8807917320799c9177f0e379e9e7.jpg

upload/article/images/2021-02-18/86d9eba2302ba8a2f77c14e632633c23.jpg


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

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

网友点评

共有5条评论来说两句吧...

在线客服