Scratch游戏《2048》实战(二)

上一回,我们已经成功把问题的重点就挪到了用来存储棋盘数据的列表变量上,那么这次我们就先从这个列表的结构说起,看看它里面应该如何合理的构建这个存放数据的列表,才能帮我们实现游戏的效果。

内部数据 → 显示画面

还记得这张图吧,左边的部分就是我们游戏后台的内部数据,我们将其存储在一个列表变量中,起名为“数据布局”,比如图中的数据,我们把它存入列表以后,列表应该是这样的:

数据布局

那如何让16个克隆的角色获取到自己对应的那个位置的值呢?
首先,我们这里要使用一种特殊的变量——局部变量(角色专用变量)。这种变量只可能被某个角色使用,其他角色是无法看到代码区里又这个变量的,同时,如果一个拥有局部变量的角色执行了克隆命令,那么每个克隆体之间的局部变量又是互不干涉的,他们的初始值与角色本体的局部变量值相同,但之后两个变量就互不相干了,克隆体中的变量值发生变化,对角色本体的变量没有影响。

这里,我们使用一个局部变量来给每个克隆体编号,我们给这个变量起名叫“角色ID”,ID变量初始值为1,每克隆一个克隆体,这个变量的值+1,所以这样下来,第一个克隆体的ID变量值为1,第二个克隆体的ID变量值为2,以此类推,第16个为16,而克隆全部结束后,本体的ID变量值为17,不过这个已经无关紧要了。

下面就是要让克隆体盯紧列表变量“数据布局”中自己所需要关注的那个变量的值了,我们发现,它们的ID变量这时候就起作用了,使用【数据布局】中第【角色ID】个元素,就可以轻松的获取到每个克隆体对应的数据值,我们使用一个死循环,让克隆体一直关注这个值,等于0时隐藏起来,一旦大于0,我们就把造型编号根据这个值进行一个改变,这样每个用于显示的克隆体就与数据部分一一对应起来了。

想想看这样的代码有什么好处

接下来,我们还要找到一个合适的方法来在空白的位置添加一个新的“2”,在Scratch3中,我们借助列表变量中特有的方法“【数据布局】中的第一个(0)”,就可以轻松找到列表中的第一个0。但我们现在需要的不是第一个,而是所有,我们要收集整个列表中所有的“0”元素的位置,然后从中随机挑一个出来,还好我们的列表并不大,只有16个元素,我们可以用一个16次的循环,挨个查看列表中的每个元素是否为0,如果是,那么就把序号保存到另一个列表变量——“可能零位”中。这里,我们需要一个临时变量,用来做序号,从1开始一直到16,方便我们收集。当这个循环结束时,我们就会在“可能零位”这个列表中收集到一些数据,其中包含所有目前棋盘中还空着的位置,然后,我们使用随机方法,取出【可能零位】中的第【(1)到【【可能零位】的项目数】的随机数】项作为一个目标位置,然后将【数据布局】中对应的位置,设置为1。如此我们就完成了在棋盘空白位置添加一个“2”的这个操作了。另外,我们很容易想到,这部分代码是要频繁调用的,所以我们可以给它封装成一个单独的自定义积木块来方便我们后面的使用,当然在封装的时候,我们也要考虑一些局部的初始化过程。

请大家仔细想想,这段代码还有可以优化的地方吗?