用scratch编写游戏2048(印章法)

用印章法编写游戏2048,是以克隆法编写游戏2048为基础,修改部分脚本而完成的。如果读者未看过我的上一篇博文:用scratch编写游戏2048(克隆法),请先读一读。印章法和克隆法,在处理数据的思路是基本相同的。印章法思路如下。游戏由16个正方体组成4*4矩阵,每个位置可显示空白或下列数字中的一个:2、4、8…1024、2048和4096。为每个位置编号,位号从第1行开始为1、2、3、4,第2行5、6、7、8,同样处理第3行和第4行。建立对象:带数字块,其有13个造型,一个造型名称为0,显示空白,其余12个造型名称分别为:2、4、8…1024、2048和4096,选择那个造型名称,该角色就显示该造型对应的数字,例如选造型2048,角色显示2048。建立列表:各位置造型。该列表的项号对应4行4列矩阵位号,列表每项所存数据为该项对应的位置应显示的数字。玩家使用上下左右键使数字4行或4列向一侧移动,数字可移到空位上,如两个相邻数字相等则合并成1位,数值翻倍,得分增加两数和,最终使数字都移到一侧,数字之间无空位,末位移出数字的位为空白。程序并不移动数字,而是按游戏移动规则处理列表“各位置造型”中数据,处理后的列表数据是移动后4行4列矩阵每位应显示的数字。例如,矩阵第1行要显示的数字存在列表“各位置造型”的第1、2、3和4项中,如移动前数据为2022,0代表空,矩阵第1行左移,就是使列表数据变为2400。最后需要把列表“各位置造型”中的数据显示在4行4列矩阵中,印章法不同于克隆法。印章法是移动对象“带数字块”到4行4列矩阵到位置1,从列表“各位置造型”项号1取出该位应显示的数字,转换为造型名称,修改造型,使对象“带数字块”显示从列表取出的数字,利用脚本印章,把该数字固定在位置1上;然后角色移动位置2,从列表项号2取出该位要显示的数字,根据这个数字修改角色造型,使其显示其应显示的数字,用印章固定数字;…重复16次,可使4行4列矩阵所有位置显示正确数字。
本游戏设计步骤如下。首先建立2个角色:提示和带数字块。如下图。“提示”有两个造型。“带数字块”有13个造型,块0造型是空白,其余12个造型是数字,其造型名称后的编号分别为:2、4、8、16、32、64、128、256、512、1024、2048和4096。请注意,角色显示的数字和造型名称后的数字相同。对象“带数字块”有正方形框,每次重新显示所有数字时,这些正方形框也要重画,而多个印章脚本运行要花费一些时间,能看到正方形逐个出现的过程,使眼睛很不舒服。另外,显示数字时,和上一次相同的数字不处理,保存原来数字,初始时,前次和本次有些位为空,都不处理,就可能看不到正方形框。为解决这两个问题,为背景增加一个由正方形组成的4行4列矩阵的造型,这个正方形和角色“带数字块”的正方形相同。
用scratch编写游戏2048(印章法)
建立8个变量:K、L、M、N、得分(要显示在屏幕上)、当前项、循环次数。建立两个列表:各位置造型和上次各位置造型。该列表的项号对应4行4列矩阵位号,列表每项所存数据为该项对应的位置应显示的数字。所有对4行4列矩阵的数字的移动,实际上都是对这个列表数据的处理。
“当绿旗被点击”的主程序及其相关程序如下。这里只解释和克隆法不同的脚本,完全相同的不做解释。先看主程序,角色“带数字块”隐藏,得分清0,两个列表都填入16个0,表示这次和上次4行4列矩阵都是空白。清除以前用印章所画所有图像。在列表“各位置造型”中填入2个2或4。调用函数“显示数字”,把列表“各位置造型”中保存的数字显示在4行4列矩阵中。函数“显示数字”是和克隆法的最大不同。其基本思路是,角色“带数字块”移到4行4列矩阵X号位置,从列表“各位置造型”的第X项取出在该位置要显示的数字,根据这个数字,改变角色“带数字块”造型,使其显示这个数字,用印章把数字固定在这个位置上。角色“带数字块”再移到其他位置做同样的工作,可完成4行4列矩阵的所有位置的数字显示。这里有个问题,执行16次印章脚本,是很费时间的,能看到数字逐个出现。实际上在移动前后,并不是所有位置数据都发生改变。列表“各位置造型”和“上次各位置造型”记录了移动前后要显示的数字,可比较两个列表对应项的值,只有不相等,才用印章固定数据,这样可使程序速度变快。印章法不在主程序中检查上下左右键状态来决定如何处理移动数据,而是在它们的事件函数处理移动数据。以左移4行为例,首先备份当前数据,以备和移动后数据对比。然后循环处理4行左移数据,最后调用函数“数字排列改变加2或4并显示”。该函数首先检查移动前后数据是否发生变化,如发生变化,增加2或4。如移动前后数据完全相同,再检查4行4列矩阵中是否有空,如无空要检查游戏是否结束。函数“在空白处随机插入2或4”有些变化。函数开始不再检查移动前后数据是否发生变化,最后也不用广播“显示列表指定造型”消息了。另外还删除了一些函数,可以和克隆法的博文对照一下。
用scratch编写游戏2048(印章法)
函数“数字上下左右移动”及相关脚本,见下图。这些和克隆法完全相同,不做解释。
用scratch编写游戏2048(印章法)
角色“提示”脚本如下。
用scratch编写游戏2048(印章法)