用scratch编写游戏2048(克隆法)

网上有许多2048游戏。游戏由16个正方体组成4行4列矩阵,每个正方体显示可以为空,也可以显示2、4、8、16、32…2048、4096等数字。初始矩阵只有2个正方体有数字,其余全为空,这两个数字可为2或4,出现两个2的概率要高。玩家使用上下左右键使数字4行或4列向一侧移动,数字可移到空位上,如两个相邻数字相等则合并成1位,数值翻倍,得分增加两数和,最终使数字都移到一侧,数字之间无空位,末位移出数字的位为空。例如左移第1行4个数字8022,0代表空,从左到右逐位处理,移动后变为8400。第1步移动完成后,如发现还有相邻数字相等,且这两个数字都不是第1步中因相邻数字相等合并生成的,则继续将这两个相等数字合并成1位,数值翻倍,这是第2步。例如0404左移,两个4不相邻不能合并,第1步变为4400,还要做第2步变为8000。又如8044左移,第1步变为8800,第2个8是第1步合并的结果,因此不能执行第2步。移动完成后,如果本次移动后数字排列相对于移动前有变化,在矩阵中增加一个2或4,否则不增加任何新数字。
按上下左右键使数字4行或4列向一侧移动功能的实现是本程序的难点,下面介绍实现该功能的思路。为16个正方体组成4行4列矩阵的每个位置编号,位号从第1行开始为1、2、3、4,第2行5、6、7、8,同样处理第3行和第4行。左移第1行的位号处理顺序为1、2、3、4,从当前位到要处理的下位的增量为1;右移第1行的处理顺序为4、3、2、1,增量为-1;上移第1列的处理顺序为1、5、9、13,增量为4;下移第1列的处理顺序为13、9、5、1,增量为-4;其余行列可类推。由此可知,只要编写一个带两个参数的函数就可以处理所有的行或列移动数字功能,参数为“起始位”(移动时第1个处理的位号)和“增量”(当前处理的位号到要处理的下1位的增量)。完成行列移动要分2步完成,先介绍第一步。以左移第1行为例,处理的起始位为1,增量为1。因要循环处理所有位,必须增加变量“当前位”记住每次循环处理的位号,每次循环都从当前位开始处理。初始时,当前位=起始位。第1次循环处理第1位,第1位(当前位)可能为空,如不为空,和第2位(当前位+增量)可能相等或不等,这三种情况,要用不同方法处理。如为0,例如0822,0代表为空,822以第1位(当前位)为终点左移1位后,在最后1位(起始位+3增量)填0变为8220,8移到0所在位置上,下次循环要处理的8仍在第1位(当前位),即当前位不变。如不为0,但和第2位(当前位+增量)相等,例如2280,第1位(当前位)变为4,80以第2位(当前位+增量)为终点左移1位后,第4位(起始位+3增量)填0变为4800,下次循环要处理第2位(当前位+增量)的8,当前位要加上增量;如不为0且和第2位(当前项+增量)不等,例如2482,不做处理,下次循环要处理第2位(当前项+增量)的4,当前位要加上增量。然后进入下一循环处理新的“当前位”。在以后的循环中不可能知道要处理的是第几位,只能通过当前位、起始位和增量计算得到,也就是要把上边叙述中括号内语句替换其前边的语句。要循环几次呢?可能3次或2次。可以设定循环3次,在完成第2次循环后,如满足退出条件可退出循环。那么条件是什么呢?由上可知,处理某位可能有3种情况,该位为0,和下位不同或相同,前2种情况只处理1位,第3种情况处理了2位。经过2次循环,剩下未处理的位可能是0、1、2,两次循环都是处理和下位相同,剩余为0;有一次处理和下位相同,剩余为1;都不是处理和下位相同,剩余为2。剩余为0显然必须退出。剩余为1也必须退出,例如左移第1行0228,第1次循环后为2280,第2次循环后为4800,确实不必处理了。但剩余2位未处理的还是需要第3次循环。第3次循环结束,要进行第2步,检查是否有相邻两位数字相同,如这两个数字都不是在第1步因相邻数字相同合并生成的,则需要合并。在第1步的3次循环中,如有一次循环处理过相邻数字相同的都不能进行第2步,以第1行左移为例有3种情况:2248、4228、8422,移动后为:4480、4480、8440,虽然都有44,但其中都有1个4是通过22合并形成的,不满足指定条件。因此在循环2次后退出的都不必执行第2步,经过第3次循环的,剩下未处理的位是0个的也不必执行第2步,只有经过第3次循环后,剩下未处理的位是1个的要进行第2步。检查方法很简单,位1和位2比,位2和位3比,位3和位4比。所有这些功能是由函数“数字上下左右移动”实现的。
本游戏设计步骤如下。首先建立2个对象:提示和带数字块。如下图。“提示”有两个造型。“带数字块”有13个造型,块0造型是空白,其余12个造型显示数字,其造型名称后的编号分别为:2、4、8、16、32、64、128、256、512、1024、2048和4096。请注意,造型显示的数字和造型名称后的数字相同。当使数字整行或整列向一侧移动时,相邻数字相等则合并,数字相加,相加后的数字就是移动后的造型编号。主程序将为角色“带数字块”克隆16个克隆体,这16个克隆体组成4行4列矩阵,每个克隆体摆放位置固定不变,其位置号从第1行开始为1、2、3、4,第2行5、6、7、8,第3行,第4行。通过改变每个克隆体的造型,完成数字的不同排列。
在这里插入图片描述
建立8个变量:K、L、M、N、得分(要显示在屏幕上)、当前项、循环次数和克隆体所在位置号。建立变量“克隆体所在位置号”时,要选择“仅适用于当前角色”,使每个“带数字块”的克隆体都有这个变量,用来记录其所在位置的位号。建立两个列表:各位置造型和上次各位置造型。列表“各位置造型”的项号对应克隆体组成4行4列矩阵的位号,每项所存数据为该位置的克隆体的造型号,也是显示的数字。所有对克隆体组成4行4列矩阵的数字的移动,实际上都是对这个列表数据的处理。例如,矩阵第1行克隆体的造型号存在列表“各位置造型”的第1、2、3和4项中,如数据为2022,0代表空,矩阵第1行左移,就是使列表数据变为2400,这也是其移动后的造型号和显示的数字。移动完成后广播“显示列表指定造型”消息,每个克隆体响应这个消息,根据自己的“克隆体所在位置号”从列表“各位置造型”取出自己的造型号,修改造型,显示新数字。列表“上次各位置造型”记录移动前矩阵数字排列,移动后比较两个列表的对应项数据,如完全相同,则不增加2或4。
“当绿旗被点击”的主程序及其相关程序如下。主程序首先克隆16个克隆体。每克隆一个克隆体,该克隆体的“当作为克隆体启动时”脚本中将把变量N的值赋值给“克隆体所在位置号”,然后N加1。在克隆第1各克隆体时,先把角色“带数字块”移到4行4列矩阵位号为1的位置,克隆第1个克隆体,然后移到位置2,克隆第2个克隆体,直到克隆所有的克隆体,这样克隆完成后,所有克隆体组成4行4列矩阵,每个克隆体的变量“克隆体所在位置号”的值和其所在位号一致。将列表“各位置造型”填入16个0,表示所有克隆体都显示空白。调用函数“在空白处随机插入2或4”两次,填入初始的两个数。在该函数最后广播“显示列表指定造型”,此时4行4列矩阵除2个位置显示2或4外,其余位置都显示空白。主程序最后,循环检查下上下左右键状态,如被按下,则按指定方向使4行或4列的数字向一侧移动。其中函数“数字上下左右移动”的功能是移动1行或1列数据,参数“起始项”是要首先要处理的位置号(实际处理列表所以叫起始项),参数“增加值”是由当前处理位号移到下一处理位号的增加值,参数“起始项”和“增加值”取值如下:左移所有4行,按照第1、2、3、4行的顺序各行参数“起始项”分别为1,5,9,13,参数“增加值”为1。右移所有4行,各行参数“起始项”分别为4,8,12,16,“增加值”为-1。上移所有4列,各列参数“起始项”分别为1,2,3,4,参数“增加值”为4。下移所有4列,各列参数“起始项”分别为13,14,15,16,“增加值”为-4。一次移动要同时处理4行或4列,所以要循环4次。调用函数“备份各位置造型”,把列表“各位置造型”数据保存到列表“上次各位置造型”中,以便将来和列表“各位置造型”中移动后的排列数据进行比较,完全相同,不增加2或4。顺便说一下,主程序是在无限循环中使用侦测脚本检查哪个键按下,决定数字向那个方向移动。也实验用事件函数来完成,即上下左右键的事件函数中处理数字移动,但数据出错。
函数“在空白处随机插入2或4”是为了在4行4列矩阵的所有空白处选一随机空白位置填入2或4,要求填入2的概率要大于4。由于列表项号和4行4列矩阵的位置号对应关系,空白位对应列表中的0,函数可通过处理列表“各位置造型”的数据来完成这个工作。首先查看有多少个空白位置,即查看列表中有多少个0,如为N个。从1到N中随机选择一个数如为M,从项号(位号)1开始开始顺序逐项(位)查看该位是否为0(空),如查到第M个0(空白位),在此项(位)填入2或4,当从1到10生成的随机数为1时,填入4,随机数为其他值时填入2,填入2和4的概率为10:1。如果没有空位,肯定无法填入2或4了,此时要调用函数“游戏结束吗”来判断一下是否上下左右都无法移动了,即程序是否结束,如结束程序,显示程序结束,停止所有脚本。否则,不填入2或4,退出函数。还要检查一下,虽然按了上下左右键,数字排列是否改变,因此调用函数“数字排列改变否”查看是否改变,如数字排列未改变,不能填入2或4,必须退出函数。
函数“游戏结束吗”就是检查每行和每列中是否有相邻位相同能合并,检查方法很简单,以第1行为例,位1和位2比,位2和位3比,位3和位4比,函数“有2项能合并吗”完成此功能。要检查4行和4列,检查结果是没有能合并的项,游戏结束。只要有一个可合并相邻项,就要退出函数,继续游戏。
在这里插入图片描述
下边介绍函数“数字上下左右移动”及相关脚本,见下图。本函数实现按前边所述规则向某方向移动1行或1列数字,它有两个参数:起始项和增加值。本函数实际上是对列表“各位置造型”的处理,列表项号和位置号有对应关系,本文中位号即是项号。由于要在本函数中调用其它函数,为了好区分避免造成混乱,各函数中有些意义相同参数但取了不同名字,例如“起始项”和“开始项”都是行或列中的数字向一侧移动时所要处理的第1位,“增加值”和“增量”都是由当前处理位号移到下一处理位号的增加值,可以是1、-1、4和-4,参见主函数的介绍。还有函数参数“目前项”和变量“当前项”都是现在正在处理的位号(项号)。有了这些解释,以及本文第2段关于编程思路的叙述,看懂该程序还是不难的。在该函数中调用另一函数“按指定方向移动”完成数字向某方向移动功能,使用的移动公式是:列表“各位置造型”的(目的项+(L-1)增量)项替换为(目的项+L增量)项内容。例如左移第1行的0842,当前项(位)为1指向0,3个数842左移1位,移动方法是,位2的8替换位1的0,位3的4替换位2的8,位4的2替换位3的4,最后1位填0。如使用上边移动公式,可令L的值分别等于1、2、3来完成。可调用函数“按指定方向移动”完成该移动,该函数有4个参数:目前项、增量、移几项和开始项,逐次为参数赋值为:1、1、3、1即可。该函数3个参数:目前项、增量和开始项,可以预先确定,但参数“移几项”需要在调用函数“按指定方向移动”前,调用函数“计算移几项”获得,计算的结果放到变量L中。其实计算也很简单,上例子中目前项=开始项,要移3位(项),即842;如目前项=开始项+增量,要移2位(项),依此类推,移1位(项),移0位(项)。
在这里插入图片描述
角色“提示”脚本如下。
在这里插入图片描述
在用本程序玩2048游戏时,总感觉似乎有时数字不正确,但一直也未查到是否真出错。如有人发现问题请告知,感激不尽。另外,玩游戏2048的一个小技巧同大家交流。要把生成的大数尽量放到第1行,实现的方法是不使用向下键。最好第一行数大小从左到右递增或递减。玩到1万以上还是比较容易的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Scratch 是一种易于学习的编程语言,但在编写工程问题时需要注意一些事项。以下是一些可能有用的提示: 1. 规划你的项目:在开始编写代码之前,最好先规划你的项目。考虑你想要实现的功能和每个组件如何交互。这有助于确保你的代码能够实现你的预期效果,并且可以更容易地维护和更新。 2. 保持代码简洁和可读性:尽可能地保持你的代码简洁易懂,这样其他人也能更容易地理解和修改它。使用有意义的变量名称和注释,以便更容易理解你的代码。 3. 重用代码:在编写代码时,尽可能地利用已有的组件和代码块。这样可以避免重复编写相似的代码,同时也可以减少出错的可能性。 4. 测试你的代码:在编写代码之后,一定要测试你的代码,以确保它能够正常工作。这可以通过手动测试和使用 Scratch 内置的测试工具来完成。 5. 学习 Scratch 的高级功能:Scratch 有许多高级功能,例如变量、列表、广播等等。学习这些功能可以让你的代码更加复杂和功能更加强大。 总之,在编写工程问题时,需要注重规划、简洁、可重用和测试性。这些技巧可以帮助你更好地编写 Scratch 代码。 ### 回答2: 用Scratch编写工程问题是指使用Scratch这个图形化编程工具来解决或探索与工程相关的问题。Scratch是一种非常适合初学者的编程语言,它通过拖拽积木式代码块来实现程序的编写,使得编程变得更加简单和有趣。 使用Scratch编写工程问题可以帮助学生学习和了解工程的基本概念和原理。例如,可以使用Scratch来模拟一个机器人的动作,让学生了解工程中机器人运动的基本原理和控制方。学生可以编写一个程序,通过控制机器人的移动、旋转和传感器的使用来完成不同的任务。 此外,Scratch还可以用于模拟工程中的物理现象和实验。学生可以使用Scratch来模拟弹簧的伸缩、小车的运动、桥梁的承重等工程中常见的物理问题,并通过编写程序来观察和分析不同参数对物理现象的影响。 另外,Scratch还可以用于解决一些实际工程问题。学生可以尝试编写程序来模拟和优化电路中的电流流动、热量传递等问题,或是通过编写程序来探索和改进生产线的运作效率等工程问题。 总之,使用Scratch编写工程问题可以帮助学生通过实践来加深对工程原理和实际问题的理解,并培养他们的创新思维和解决问题的能力。 ### 回答3: 在使用Scratch编写工程问题时可能会遇到一些挑战。首先是如何将现实世界中的问题转化为适合在Scratch中解决的问题。这可能需要一些创造力和思考,以找到合适的方来模拟和解决实际问题。 另一个挑战是确定使用Scratch的哪些功能和特性来解决问题。Scratch提供了许多不同的积木和功能,但并不是所有的都适用于每个问题。因此,需要通过仔细分析问题的特点和要求来选择使用哪些积木和功能。 此外,编写工程问题还需要一些计划和组织能力。在Scratch编写大型工程问题时,需要事先规划好整个项目的结构和功能,以确保各个部分能够协调工作。这可能需要一些时间和思考,但可以避免后期调整和重构代码的麻烦。 最后,与团队合作也是一个重要的因素。如果有多个人一起编写工程问题,需要有一个清晰的沟通和合作机制,以确保各个部分能够协调工作。可能需要定期进行会议和讨论,以确保大家都理解和遵循相同的编码标准和项目规范。 总的来说,使用Scratch编写工程问题可能会面临一些挑战,但合理的计划和组织能力,创造力和思考能力以及良好的团队合作机制都可以帮助克服这些困难,并成功地完成工程问题的编写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值