APP下载

Scratch复刻经典游戏《2048》

2020-10-29

电脑报 2020年39期
关键词:方块方格格子

众所周知《2048》是一款数字益智游戏,游戏规则虽然简单但特别耐玩。在4×4的方格中有几个2或4的数字,玩家可以选择上下左右任一个方向滑动所有的数字方块,所有数字都会滑向边缘并靠拢,相同的数字方块相撞会相加合并,然后在空白地方随机出现一个2或4的新方块。玩家需要在这16格范围内凑出2048这个数字方块。

今天我们就来挑战一下将《2048》用Scratch编程制作完成,游戏的画风相当简单,不需要太多美工基础,有利于我们用Scratch复刻这款游戏。当然这毕竟是一款成熟的热门数字游戏,编程复杂程度较高,会用到大量的变量、自定义积木模块和广播。你要做好克服难关的心理准备,由于篇幅有限只能讲关键点,如果你还有什么疑问可以下载源程序自行分析。

1. 游戏功能分析

在4×4的游戏方格内随机空位产生2或者4的数字方块。这需要标注每个方格的坐标位置并处理其中的数字块。

方向键移动所有数字块,相同数字相碰会相加合并,如果出现重复叠加情况需要分步完成,积分增加。

当没有空方格且没有数字可以合并时游戏失败。这需要对所有还可能合并的情况做出判断。

2. 素材下载

游戏使用的图片素材已经为你准备好了,可以扫码在百度云2020-39文件夹中下载,包含背景、数字、分数。这里还能找到已经做好的源程序供你参考,请使用Mind+打开。

角色中导入数字和分数。舞台中导入格子背景(图1)。

3. 判断游戏当前状态

游戏首先设置三个变量并赋值為0:判断是否克隆的变量(clone?),判断游戏是否结束的变量(gameover?)以及统计分数的值(score)(图2)。

4. 角色定位

为了让数字块角色生成、移动、合并后都能处在正确的格子中,我们需要对所有格子定位。由于格子很多需要用列表(grid)为数字定位,这部分功能在自定义积木(make clones)中实现(图3)。

如图3创建名为(grid)的列表并清空,重复执行16次,将列表内填充16个0,这代表《2048》游戏中每个方块内初始值全部为空即还没有任何数字块。

接下来手动调整每个方块的大小及所处背景方格的位置并记录下坐标备用。以左上角小方块的位置(-91,91)作为基准,每个数字方块高和宽都为70。设置好起点Y坐标91,X坐标-91,使用嵌套循环的方法,将4×4方格用克隆体全部铺满,如图3。

在克隆体启动时,用克隆体说话的办法报出自己的位置编号,这句代码在完成游戏后需要删去,编号规则是以方格的XY位置来编号(X,Y):从左下角的位置编号(1,1)开始,每往右一格X增加1,每往上一格Y增加1。用方块的X坐标和Y坐标数值通过我们推导出来的公式就可以换算出每个格子的位置编号,公式为:((X坐标-49)/70)+3;((Y坐标-21)/70)+3。为了方便程序员在开发过程中查看每个方块的位置编号我们可以将内容拼接进行显示,效果如图4对话框内数字。

这些位置编号还要通过公式与(grid)列表中的项目序号相对应,效果如图4红字部分,对应公式:(位置编号X-1)×4+位置编号Y,这部分内容后面会详细说明。

这样我们就用两个公式将(grid)列表中的数值通过给每个格子的位置编号与格子的坐标联系在了一起。

这个步骤是开发程序过程中的中间步骤,目的就是为了获得确定格子坐标与格子位置编号之间的换算公式。

5. 随机生成新的数字块

系统需要随机生成新的数字2或数字4,并填入余下的空格子中。在自定义积木(add random block)实现这部分功能。

找到还有空位的格子就是找到(grid)列表中还是0的项,那么它对应的格子就还是空着的。我们把生成的数字加到列表中还是0的项,进行暂时存放。然后再添加到这项对应的格子上。

每个方块的位置编号可以对应列表中的一个项目,比如左上角的格子对应位置编号为(1,4),对应列表中的第4项的内容。而旁边位置编号(2,4)的格子对应着列表第8项的内容。两者的对应公式:(位置编号X-1)×4+位置编号Y;也就是从左下角(1,1)对应第1项,从左往右从下往上依次数(如图4红字),右上角(4,4)对应第16项。

系统每次新出现的数字不是2就是4,并且出现2的可能性远远大于4的可能性。我们利用从1-10之间取随机数,如果这个数小于9就出现2,如果这个数等于10就出现4。

当确定出现2或4时,将(grid)列表中对应的项变为2或4(如图5)。

新增两个变量用来存储新生方块的坐标(new block x 和 new block y),当我们点击添加随机数的时候,列表中就会生成对应的数字了(如图6)。

6. 判断结束游戏

那么接下来我们思考这样一个问题,当我们列表中的数字全部被填满之后是不是就代表游戏结束了呢?当然不是,当我们的列表被填满之后,还需检查方格中的数字可不可以相互进行合并,只有当方格中所有的方块不能通过上下左右相互移动合并,那时游戏才能结束。

接下来更具体的问题是如何检测数字是否还可以合并。检测的方法是纵横两两组合,16格方块一共有12种方法。针对每个方块需要检测四周的四种情况:某个数字块在列表中分别与左、右、上、下相邻的数据项进行比较,如果有数字相等就说明还可以合并。如果我们检测出方块两个可以继续合并那么跳出循环,如果检测出方块都无法合并那么游戏结束。

这部分功能由自定义积木(check for gameover)来实现。

以检测左边为例,我们可以从左下角(1,1)位置开始,用循环嵌套依次比较,判断方块的位置编号对应着的列表数字是否和左边一个方块(这两个方块y值相等,x值加4)的列表数字重合,如果重合那么跳出循环。同理右边检测就从右下角(4,1)开始,它右边的数字块编号y值相等x值小4。

上面检测从左下角(1,1)开始,下面检测从左上角(1,4)开始。具体代码如图8。

7. 数字的显示

我们已经完成了在列表中添加数字的功能,完成了游戏结束的判断,下面我们再来讲一讲显示的功能。

当我们点击运行后,列表中的某两个数字会被替换成2或4,这个时候我们需要将列表中的数字对应到方块中去,那么如何显示对应的方块呢?

当收到消息show时,查看列表中各项的数字是否为0,如果等于0的话隐藏不显示,不等于0的数字通过合并连接【com+grid第(y+(4x-1))项】的方式找到对应的造型,显示在方块对应的坐标中。为了显示效果我们还可以给新出现的方块设置一个动画的效果(如图9)。

當然做完这些部分之后我们不要忘记了最初的地方把这些模块进行拼接显示(图10)。

这样的话我们点击运行就可以显示《2048》最初始的两个方块了(图11),到这里游戏的功能我们已经实现了50%,以上部分难点在于从列表到坐标之间的转换。

8. 发出滑动请求

广播show后,出现了开局的两个数字块,接下来我们要完成滑动模块和计分模块。

玩家会根据方格中的数字选择滑动方向,根据滑动的方向,方块中的数字会移动或者合并,分数会累加(如图12)。

玩家只需按下方向键或者AWSD键便可以对方块进行移动控制,这里新增变量(change grid)用来检测是否有新数字产生,当方块在移动的过程中两个相同数字会合并成新的数字。我们用四个自制积木模块(left,right,up,down)处理这个触发动作,一旦两个数字合并成新的数字之后,将变量(change gird)的值设为1,系统将在其他空白方格中重新生成一个新的数字(2或者4);为了防止玩家不小心在短时间连续按下两次相同的键发生误操作,我们还可以加上一个预防的条件。

9. 处理向左的滑动结果

接下来是本游戏的又一个重点——处理移动后的情况。

我们用自定义积木(left,right,up,down)来处理。由于四种情况左右、上下原理类似,我挑其中两种讲解。

以left处理向左靠拢且无合并情况为例,如图13我们将起点选择为(2,1);当玩家向左进行滑动的时候,依次按照箭头的方向进行合并,由箭头的方向我们可以看出X轴方向有3次,Y轴方向有4次,便可以构成一个循环。首先如果方格中存在数字并且数字不能为0便可以进行移动,移动的情况我们可以分成两种,第一种是无合并情况,判断方格位置(1,1)处是否为空,如果(1,1)处位置为空,直接将(2,1)的数字移动到(1,1)位置,并将(2,1)位置上的数字设置为0便完成了。

第二种情况如图14,(2,1)和(3,1)位置上的数字都为2,相邻两数字相同,那么便可以进行移动合并累加。玩家左移指令可以将(3,1)的数字移动到(2,1),而原先(2,1)上的数字只需要将本身乘以2得到合并后的数字。

对于合并数字还要注意一种特殊情况,《2048》中可能会出现相邻三个數字相同可以合并的情况,或者出现可以连续合并的情况,比如两个2合并为4,而移动方向上数字刚好又为4,可以继续合并,为了防止一次移动出现连续两次合并的问题,我们又新建了一个列表(combination)用来存储合并成功后的数据,当合并成功后,往这个列表中添加坐标,并且保证第二次移动的不能和列表中重复,便可以达到分步的效果。

往左移动和往右移动的处理方法类似,只需要改变初始的位置以及方程式中的个别变量的运算便可以完成了(如图15)。

10. 处理向上的滑动结果

向上与向下的处理方法类似,以up自定义积木为例。

当数字4位于(1,3)时,玩家向上移动,克隆体会按照箭头方向进行移动,Y轴方向3次,X轴方向4次。循环中的情况和向左移动大致类似,只需要注意合并时要替换的内容的公式上的差异。由于是向上移动,如图16,(1,4)位置为空的时候,(1,3)的数字可以直接替换到(1,4)位置上,原位置清零(如图18如果为真部分)。

如图17,如果相邻的数字相同要注意合并过程,以及位置的变化。合并之后的数字是原数字的两倍(如图18否则部分)。

11. 小结

《2048》游戏是目前我们制作过最复杂的游戏。游戏的难点在于坐标和列表数值之间的用位置编号转换过程,需要一定的数学逻辑思维能力。

这里以图19中4为例讲解一下移动时XY编号的变化以及与(grid)列表位置之间的关系。它目前处于(2,3)的位置,对应列表项目为(X编号2-1)×4+Y编号3=7。它往左边的(1,3)位置移动的话,变为(X编号2-2)×4+Y编号3=3。它往上移动一格,变为(X编号2-1)×4+(Y编号3+1)=8。只有搞清楚这点才能看懂我们的程序在做什么。

大家可以跟随我们的要点讲解自己分析整个源程序之后再重新制作一个。还可以开发出一些有个性的比如《朝代2048》《元素2048》之类的游戏来。

猜你喜欢

方块方格格子
谜题方块
玩转方格
纸板俄罗斯方块拼图
玩转方格
上期《玩转方格》答案
图画书里的格子象
叠方格
格子衣
有序数方块
好大的方块糖