游戏数字华容道的改进

在“用scratch编写游戏-数字华容道”(以后简称“前文”)一文中仅介绍了3行3列数字块的设计方法。本文介绍克隆法,该法在设计更多行和列的数字华容道时,使所有数字块都使用相同的脚本,极大减少了工作量。两方法采用的数据结构基本相同。首先给每一个可放置“数字块”的位置一个编号,叫“位置编号”,从第1行开始从左到右顺序编号1、2…,然后第2行,直到最后一行,“位置编号”顺序就是胜利完成游戏后所有数字块上的数字所排列的顺序。建立两个列表:“块可放位置X”和“块可放位置Y”,分别记录所有位置的X和Y坐标,列表的项号对应“位置编号”。建另一列表“块所在位置编号”(前文称为“块初始位置”),用来记录每个数字块和空白块放在几号位置上,列表项号对应数字块上的数字(即块号),所存数据是“位置编号”,即列表“块可放位置X”和“块可放位置Y”的项号。和前文不同的是,“块所在位置编号”的第一项是空白块(块0),然后块1、块2…。这样排列是因为关卡不同,块数量也不同,按前文那样放在最后,不同关卡的空白块编号不同,而程序中每一块都要判断和空白块的关系,如使空白块编号在任意关卡都保持不变会更加方便,所以采用以上排列顺序。现用例子说明程序运行步骤。如希望块号为1的数字块移到“位置编号”为9的位置上(即9号位置),只需将9保存到列表“块所在位置编号”的第2项(对应块号1,第一项是块0)中,然后发送移动消息,1号数字块接到移动消息,从列表“块所在位置编号”的第2项中取出数据9,再分别从列表“块可放位置X”和“块可放位置Y”的第9项取出9号位置的X和Y坐标,然后移动到9号位置。有关列表的脚本如下,这些脚本由于必须在选定关卡之后运行,因此未放到背景中。游戏有三关,块数分别为9、16、25。为了能摆放下25个方块,将左上角1号位置坐标设置为:-90,140,将方块边长改为70,因此上下和左右相邻块之间中心距离都为70。变量“块数9或16或25”是不同关卡的块数。“填入块可放位置坐标”脚本块将所有可放置数字块的位置坐标填入列表“块可放位置X”和“块可放位置Y”,注意关卡不同,可放置数字块的位置数量也不同。首先删除列表以前所有数据,根据块数决定行列数,先填位置的X坐标到列表“块可放位置X”,再填位置的Y坐标到列表“块可放位置Y”。“使块随机摆放”脚本块是为了程序初始时所有数字块随机摆放。首先删除列表以前所有数据,然后把“块数9或16或25”个数用循环方法从大到小顺序填入到列表“块所在位置编号”中,例如关卡1,把9、8、7…1这9个数顺序填入到列表。然后用随机数发生器从1到“块数9或16或25”中生成随机数作为项号,把最后一项的数据取出插入到该项号数据前边,然后删除最后一项。重复“块数9或16或25”次。在主程序发送“移动块到指定位置”消息后,所有数字块和空白块移动到列表“块所在位置编号”中指定的随机位置。
。“填入块可放位置坐标”脚本
。“使块随机摆放”脚本
程序只有两个角色:“带数字的块”和“提示”。角色“提示”,有两个造型,一个造型用来提示用户如何玩游戏:单击数字移动数字块,另一造型在玩家胜利后提示:你赢了。角色“带数字块”有25个造型,一个空白块造型上无数字,块号为0,其余24个块上面有数字,分别从1到24,块号从1到24。
两个角色及它们的造型
单击绿旗所执行的脚本(主程序)、“当作为克隆启动时”脚本、“接收到移动块到指定位置”消息脚本和“选择关卡”脚本如下。由于不使用角色“带数字的块”,主程序开始将其隐藏。主程序然后选关卡,根据所选关卡为3个前边提到的列表填入数据。根据关卡不同,克隆不同数量的角色“带数字的块”的克隆体。最后广播“移动块到指定位置”消息,由于主程序运行后列表“块所在位置编号”中位置编号是随机的,因此玩家看到随机摆放的数据块。在角色“带数字的块”中建立变量:克隆体编号,建立这个变量时,必须选择:仅适用于当前角色,这样每个克隆体都有一个名称为“克隆体编号”变量,用来记录克隆的数字块的块号。主程序中,使用变量N记录当前克隆体的“克隆体编号”,首先克隆空白块,其“克隆体编号”是0,因此首先设置N=0。每克隆一次,“当作为克隆启动时”脚本运行,首先令“克隆体编号”=N,修改造型,将N增加1为下一克隆体的“克隆体编号”,显示本克隆体。当各个数字块和空白块收到“移动块到指定位置”消息,“接收到移动块到指定位置”脚本运行,根据自己“克隆体编号”,在列表“块所在位置编号”找到自己要移动目的位置号,根据位置号,在列表“块可放位置X”和“块可放位置Y”找到位置的坐标,移动到新位置。
主程序及相关脚本
下边是“角色被点击”脚本、“被点击块和空白块交换位置”脚本块和“计算排列是否正确”脚本块。当数字块被点击时,程序首先判断数字块能否移动。前文是用检测被点击数字块是否碰到空白块方法。但本例中克隆体之间无法检测碰撞,只能另想它法。现在判断能移动的数学式为:绝对值(被点击块坐标X-空白块坐标X)+绝对值(被点击块坐标Y-空白块坐标Y)=70。这是因为只有和空白块相邻的数字块被点击时才能移动,换句话讲,被点击数字块必须和空白块在同一行或列,也就是说两者坐标X或Y相同,所以数学式加号两侧表达式必定有一个为0,相邻的意思就是两者中心点距离为70,即不为0的另一项为70。顺便说一下,点击空白块,数学式值为0,因此空白块不会移动。“被点击块和空白块交换位置”脚本块中,由于被点击数字块脚本无法移动空白块,因此采用间接方法,交换两者在列表“块所在位置编号”中各自的位置号,然后广播“移动块到指定位置”消息,令每个块按照列表“块所在位置编号”移动到新位置。移动块后要判断排列是否正确,方法和前文基本相同,只是列表“块所在位置编号”第1项是空白块,它的正确位置编号是最大的位置编号,关卡1是9,关卡2是16,关卡3是25,它要单独判断。第2项是块号为1的数字块所在位置编号,其正确位置为1,以此类推。因此判断是否正确的表达式为:列表“块所在位置编号”第N项内容=N-1是否成立。
在这里插入图片描述
角色“提示”的脚本如下。
在这里插入图片描述
运行效果图如下。
运行效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值