欢迎光临
我们一直在努力

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

这几天收到了学友们的鼓励,非常开心,激励CC哥要更加认真的做一些帖子来跟大家交流。其实网上很多scratch的学习大都是以视频为主的,都是老师边做边教,看着更直观。但是我不是很认同这种方式,我觉得如果只是学会scratch或是在老师带领下一步一步做个小程序,学生不会学到什么东西,CC哥以前就是学竞赛考竞赛,也辅导过小朋友参加竞赛。所以我更认为思维的锻炼比学本身更重要。因为在未来的竞赛和竞争中,比的就是思维能力和创新性。如果只是亦步亦趋的跟着复制,那学编程最多是好玩,完全没有发自内心的成就感。所以CC哥继续用写来讲scratch了,不管是小朋友看也好,家长朋友看也好,你可以就把它当成一个想象力和思维训练的旅行吧。

上一讲讲了俄罗斯方块这个程序,但是留了两个问题。如果没看的可以先看上一讲。这两个问题一个是如何检测某一层已经铺满了方块。另一个问题是如何把铺满的方块的层消除掉,同时把上面的方块落下来。

这两部分都是难点,想想看如果让我们处理该如何处理。在检测是否铺满方块这部分,既然之前用的不是克隆,而是图章的方法,也就是屏幕上的俄罗斯方块都是用图章这个命令画图画上去的。那也就只能用检验颜色来检验了,那如何在屏幕里检测某一区域里是否碰到某个颜色呢?我们脑子里想到的就是用一个角色在运动过程中检测是否碰到某种颜色。想到这里答案就出来了。

我们之前在角色里就看到了一个detecter的角色,英文就是探测器的意思,通过视频我们看出来,作者其实就是用这样一个黑线在游戏区域里,每放一次方块就走了一遍,来检测是否填满某一行。检测的方法也简单,就是看看这个黑线每走一步是否碰到了背景色。如果碰到了,就说明这一行没有填满。

(作者把这个角色隐藏了,CC哥把它打开,大家就看明白了吧。)

这里面还是有些程序设计的风险在里面,也就是万一你的每个方块的尺寸出了些问题,也就是如果每个方块之间不是完美结合,而出现了空隙怎么办?上一讲CC哥演示了这种情况,这个程序里确实有这个问题,也就是精度问题。如果出现了空隙,哪怕只有一点的空隙,检测的这跟黑线也相当于发现没有填满而不去消除,那你怎么办?这里面就佩服作者构思还是挺精巧的,大家有没有注意游戏区域里的网格,这个网格看上去好像只是标明了一个一个的方块格子,在实际的游戏中并没什么作用?就算不放这些格子应该也不影响吧。难道就是为了好看?其实不是,这些格子是有颜色的,但是不是黑色,所以不会影响之前讲到的黑色的碰撞检测。但是这些格子还是有粗细的,也就是占据了一定的空间,那么即使方块之间有一点点空隙,这些空隙也会被格子占满,那么就不会出现误检测的情况了。所以说作者构思还是很巧妙的。

这一段程序还是有点复杂,变量也多,看起来有点累,大家也不必每一句都要读懂,理解作者的方法和意图就行。

知道了如何检测,那就面临的问题,就是检测到了如何消除呢?大家注意detecter这个角色里面还有这么多造型,大概就知道了,当检测到要消除的行,就把上面的方块都搬下来。比如中间有三行填满了,那么就把上面没有填满的每一行,都往下搬三行。这个搬动其实就是一个方块一个方块的检测颜色,然后换成对应的造型,往下移动三行填上去。

比如这段程序就是用conseclines这变量来判断要消除几行。

这一段就是往下搬方块的程序,要往下搬的时候先判断一下要搬的这一行有没有方块,用是否检测到黑色就能知道这一行有没有方块,还记得上一讲讲的所有的方块都有黑边吧,所以作者在这个俄罗斯方块的程序里,把碰到颜色这个命令的特点用的淋漓尽致。

这一段程序就是一旦发现要搬动的行,就把这个detecter的造型变成一个小圆点,然后从左往右一个一个方格去检测颜色,如果检测到,就换到这个颜色对应的造型,然后往下移动几行再去用图章来复制一个,反复重复执行,就等于把这一行给全部移动下去了。

这个程序后面CC哥就不再详细讲了,大家可以自己在网上下载源程序去仔细分析,不过CC哥也不建议,大家理解就行了。这个程序设计虽然巧妙,但是对精度要求太高,比如CC哥在反复测试的时候,就发现除了出现上一讲讲的在移动方块时因为边角的粗细,导致被卡在半空的情况外。在搬动所有方块往下走的时候,因为是用新的图章去覆盖了原先的方块,结果由于尺寸不完全吻合,导致有些方块的边并没有被全部覆盖完,空中会出现一些残留的颜色。而使得程序紊乱。比如下落的方块因为碰到了残留的黑边,导致停在半空。

还有就是程序设计的也不够严谨,比如我连续按空格,就会不等一个方块落下就又出来下一个方块,导致程序混乱。(还记得CC哥在这个程序讲的状态变量吗?所以如果当你在事件不希望被激活前,可以用一个状态变量来辅助做判断。)

还有一个小技术点,CC哥之前也没讲过太清楚,就是角色隐藏了,哪些侦测还能进行呢?比如,如果一个角色隐藏了,那么还能侦测到它碰到其他角色吗?还能侦测到它碰到其他颜色或者舞台边缘吗?这个答案CC哥留给你自己去回答,做个小程序试试把。,CC哥也是做了下面的小程序,试了所有的情况,才能有答案。

编程是一个探索,尝试的过程,没有一本书,任何一本教材告诉你所有的答案,就算百度也不见得有现成的答案。很多答案需要你自己一个一个去尝试才能知道,自己找到了答案才有快乐和成就感。

所以CC哥鼓励大家花些时间去玩编程,因为可以培养小朋友的耐心,细心,认真,关键还有自信!

如果觉得CC哥做的不错,请点击右下角的"好看",给CC哥一个鼓励!

超乎想象的使用体验

历史课程:

赞(66)
分享到: 更多

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址