用 Scratch 3 制作小游戏:2048

缘起

乐宝幼儿园的时候上过一段时间的 Scratch 的课,他对这个表现出了浓厚的兴趣,于是我就给他买了基本相关的书籍,他也爱不释手。由于领导注意到乐宝对电子产品的痴迷,怕他迷失,所以规定他周末才能玩儿半小时的 Scratch。我发现他在用 Scratch 做一点小程序(照着书吧),而且还乐此不疲。正好我也有时间,所以我想琢磨下怎么做个游戏,然后再教乐乐(编写)。

真的是这样吗?哈哈,真的起源原因真不是这样的,而是因为乐乐手头有一个我二十多年前买的 Handspring 的 Visor,就是这一款:Handspring Visor Deluxe PDA@ifixit,乐乐也很喜欢,但我网上找了找,几乎已经没有任何应用了,连中文支持:CJK,貌似都没法用了。于是我想能不能自己写点简单的小程序,port 上去。于是就有了写个小游戏:2048 的想法。

这才是最初的需求,至于改用 Scratch 来弄,那是后来的想法。

过程

后来一搜,Scratch 官网就有一大堆的 2048 游戏程序例程(当然是别人分享出来的),我看了好多,都觉得有点复杂。而且油管上也有人录视频专门讲怎样编写 2048 这个游戏。本来想哪天翻译下来,再录个视频(又给自己挖了个坑:)。然后在中文世界里翻一翻,发现 B 站也有详细讲解的中文的视频。具体链接在这里:B 站用 Scratch 编写 2048 游戏的教学视频 然后我的这个 2048 程序也是完全按照这个视频做(抄)下来的。

所以,这里说起来过程,其实就是一个字:抄。:)

言归正传。这个视频里其实还是有一些小坑的。大家从头看到尾了就会知道。有些的,是前面挖,但是后面自己填了,但是有一些是没填的。我这里就提一下没填的。其实主要就是一个:变量 clone? 的问题。

这个变量我理解应该是标识角色是否是克隆体的。由于作者的疏忽,视频里作者点击“新建一个变量”,然后输入变量名“clond?”,保持缺省选项:“所有角色可见”的前提下点击“OK”,结果发现系统已有这个变量。这是个容易忽视的小细节。在我的系统里(Scratch 3.29)里,照作者的方式是能新建这个变量:clone? 的,就算系统已存在叫“clone?”的变量。

然后一直到最后,我都发现有一个小问题:就是我的程序跑起来,会在 4x4 方格的右下方,显示一个方框角色,怎么都弄不掉。仔细再看了看程序代码,发现这个方块是方块角色做完 16 次克隆自己的操作以后移动到的位置。但是按照程序里处理广播消息:show 的积木块的代码来讲,母体角色是应该不显示的呀。再仔细看看处理广播消息:show 的程序,发现这个逻辑有问题:

这段程序是在 clone? = 1 的前提下才执行的(这个思路貌似很清晰:只有克隆块才执行),但问题是启动时变量 clone? 被赋值为 0,但是在“当作为克隆体启动时执行”的代码块里,又将 clone? 设置成了 1。问题来了,clone? 是个全局变量,克隆体里将其设置为 1 了,那么母体角色也能读到,所以每次做 show 操作时,母体角色执行时也会是 clone? = 1 成立,所以母体角色也被显示了出来。:(

当然,也有其他办法来修复这个 bug,但我又翻了翻 Scratch 关于变量的资料,发现其实这里只要将 clone? 设置为本角色可见就行了。因为在母体角色里,clone? 是为 0 的(系统启动时设置的)。克隆以后,克隆体继承了这个私有变量(本角色可见的变量),然后又在“作为克隆体启动时”的代码块里将其(clone?)设置成了 1,但是母体角色里 clone? 还是 0!!!!!这样母体角色在执行处理 show 消息的代码块时,判断 clone? = 1 不成立,所以不会被显示。问题被解决。

最后

这里贴一张改好后我自己玩儿 2048 时的截图

2048,我玩儿到 512 了

然后,最最后,我把代码贴出来,有兴趣的可以用来教小朋友哟。哈哈