Scratch游戏《2048》实战(四)

上节课最后,我们把制作右移操作积木块的任务当成了作业布置下去,大家做的如何呢?下面我们先简单看一下老师这边的实现情况。

我们再稍微往细致思考一下,还记得上节课分析出来的三个步骤吗?
①删除同行的所有0;②检查相邻元素是否相同,如果相同就去掉一个然后留下的+1;③补“0”使得该行总数为4。
我们依次来看。

第①个,删除同行的所有“0”。
删除所有的“0”,这个好实现,但是“同行”应该怎么操作呢?
第一行是列表【数据布局】中的第1、2、3、4个元素,第二行就是第5、6、7、8个元素,第三行是第9、10、11、12,最后一行是第13、14、15、16,那么我们发现了什么样的规律吗?是否有一个通用的公式可以代表每行的四个元素的下标呢?大家自己思考一下,我把答案用白色的文字写在这里:在下面~
(行号 -1)×4+列号

这样的公式第一行第三个元素的序号是3,我们把行号=1,列号=3代入计算,得到的结果为3,这当然没问题了;换一个试试,比如第三行的第二个元素的序号是10,将行号=3,列号=2代入计算,得到的结果确实是10。由此可见,我们使用了一个通用的公式完成了【数据布局】中的元素序号和行列坐标关系的转换,这样对于我们下面的工作又做好了铺垫。

我们第①步要做的是删除每行所有的“0”,那么我们自然不能在【数据布局】这个大的列表中进行删除,因为这样会影响到这个列表的排列顺序,所以我们选择一个比较稳妥的方法,将每行的元素取出到一个临时列表变量【待处理元素】中,每次放一行共4个元素,然后我们开始在这个小的列表里进行处理。

既然要放到这个小列表里,那么我们首先要保证这个小列表里是空的,即便它本来是空的,我们也应该在开始时进行一个初始化,删除掉它当中的所有元素。然后我们就可以依次放入第一行的内容了,用我们刚才得出的公式,嵌入到一个4次循环中,每次取出一个,放入到【待处理元素】中。我们发现这个公式里要考虑两个变量——行号和列号,所以我们需要两个临时的变量来用于计算。

这里要注意添加到小列表时的顺序
这里使用的是在“第1项前插入”,为什么呢?

对应行的内容我们取到了,“0”我们也去掉了。
那么下面我们执行第②步:检查相邻元素是否相同,如果相同就去掉一个然后留下的+1。
这一步操作,实际上,我们要进行3次比较,分别比较第一列和第二列、第二列和第三列、以及第三列和第四列,如果有相同的,我们就删掉一个,然后留下的+1。

使用一个临时变量,完成了一行的4个元素的比较

好了,下面剩下最后一步了,第③步,补“0”使得该行总数为4。

为了完成这最后一步的要求,我们要先把【待处理元素】这个列表中补齐4个元素,这个简单。

用0补齐

最后,我们按照顺序,用【待处理元素】列表中的元素,替换【数据布局】里对应行的元素,之后就完成咯。

这部分内容留给大家做本次内容的作业吧!