Scratch复刻经典游戏《2048》

来源 :电脑报 | 被引量 : 0次 | 上传用户:ynzhengda
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  众所周知《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》之类的游戏来。
其他文献
不同领域,复苏进度不一  一度坠入冰点的外贸,再度成为舆论的焦点。  近日,国内外多家主流媒体报道,因为印度多家纺织企业因疫情无法正常出口,订购商纷纷取消在印度的订单,将订单转移至中国。  而2020年10月13日海关总署发布的数据显示,第一、第二季度我国进出口增速分别为-6.5%、-0.2%,第三季度同比增长7.5%,其中出口5万亿元,增长10.2%,外贸正在逐渐复苏。  资本市场对上述消息立即
期刊
摘要:为应对竞争日益激烈的医疗市场,低成本策略逐渐被一部分医院管理者采用。全面预算管理作为一种有效的成本管理方法,已经引入到医院管理中。文章通过对目前预算管理现状的分析,从优化流程、提高效率、降低成本的角度出发,将目标成本法引入到预算管理中,构建出目标成本预算管理模型,以期为采用成本领先战略的公立医疗机构提供参考。  关键词:全面预算管理;目标成本法;医院  国务院印发的《深化医药卫生体制改革20
期刊
用户信任消耗殆尽?转型之后谁买单  国庆节假期最后一天,亚航发布的官宣信息惹恼了苏奇,“用户退票的钱一直拖着不给,倒是有钱升级做平台?”  苏奇与亚航的退票博弈,始于一场说走就走却始终没有成行的旅行计划——去年11月,苏奇和闺蜜们在亚航官网购买了2020年5月飞往曼谷的机票,但由于疫情突发导致无法出行,只能退票了事。  直到看见10月8日亚航在其微信公众号上发布“‘亚洲航空’正式升级为一站式旅游平
期刊
摘要:目的:分析中医治疗高血压的临床效果。方法:随机抽取20例患者,将患者随机分为对照组和治疗组。治疗组采用中医治疗高血压,而对照组则采用传统的西医方法进行治疗。结果:治疗组的有效率为90%。结论:中医疗法对于高血压的治疗效果是良好的,并且没有明显的不良反应,值得进行临床推广和应用。  关键词:高血压;中医;治疗;分析  高血压又称原发性高血压,是以体循环血压升高为主要表现的综合征[1]。在引起心
期刊
摘要:目的:探讨妊娠合并卵巢肿瘤手术前后的护理方法及效果。方法:选取我院60例妊娠合并卵巢肿瘤的患者,将其随机分为观察组和对照组,每组30例,对照组使用常规的护理,观察组在此基础上实行术前、术后的全面护理干预,观察比较两组患者的分娩结局和并发症的出现情况。结果:观察组患者的正常分娩率为86.7%,明显高于对照组的70%(P<0.05),且并发症的出现率显著低于对照组(P0.05),因此具有可比性。
期刊
摘要:目的:分析射频温控热凝治疗三叉神经痛围手术期护理措施和护理效果。方法:收集我院2013年10月-2014年10月期间经射频温控热凝治疗的三叉神经痛患者60例作为研究对象,以随机数字表分组的方式分为试验组(30例)与对照组(30例),对照组患者采用常规护理管理,试验组患者加强围手术期护理,对两组患者的感染发生率和疼痛改善情况及护理满意度情况进行分析对比。结果:研究结果显示,试验组患者的感染率明
期刊
摘要:目的:观察中药外洗治疗妇科炎症(慢性宫颈炎、阴道炎)的临床疗效。方法:选择有妇科炎症的患者70例,随机分为观察组和对照组各35例,观察组采用中药外洗治疗,对照组采用洁尔阴洗液治疗,观察两组临床疗效及复发情况。结果:中药外洗治疗妇科炎症总有效率为95.56%高于洁尔阴洗液对照组的77.78%,中药洗剂治疗妇科炎症的复发率4.44%低于洁尔阴洗液对照组33.33%,两组比较差异均有显著性(p0.
期刊
相信很多近视远视患者在配眼镜时都会遇到这样一个情况:店员一般会问你要不要配“防辐射镜片”,很多人对此表示一脸问号,眼镜还能防辐射?它防的是什么辐射?这到底是销售话术还是确有其事?科普作者“视光医生马老师”就为大家来了一次科普。  一般来说,辐射包含电离辐射,比如伽马射线、核辐射等,显然眼镜片不可能做到这一级别的防辐射,所以它只能做到对第二种辐射非电离辐射的部分防护,事实上目前几乎所有的眼镜镜片都具
期刊
YouTube最近开始要求创作者用测试软件标记和跟踪视频中的商品,同时在尝试与全球最大的电商SaaS平臺Shopify进行进一步的集成。据报道,Google想要把YouTube打造成一站式购物平台,让用户在YouTube上观看视频后直接完成购买。  从2013年就开始探索电商的谷歌,近两年加快了布局步伐。尤其是疫情以来,全球广告市场萎缩,而电子商务进一步崛起,焦虑的谷歌在几个月间接连推出关于电商的
期刊
摘要:目的:探讨强直性脊柱炎致骶髂关节炎X线和CT诊断价值的比较。方法:以2013年5月~2014年5月期间,我院住院部所收治的强直性脊柱炎合并骶髂关节炎患者共计20例作为研究对象,对所有患者临床资料进行回顾分析。20例患者均分别进行X线诊断与CT诊断。结果:CT诊断下,1级患者构成比为30.00%(6/20)、3级患者构成比10.00%(2/20),均与X线诊断结果存在显著差异,P<0.05,具
期刊