羊了个羊P1 基本功能
羊了个羊Scratch开发——第一集
从创建项目开始
打开“编程侯老师”网站,注册并登录账号,在Scratch课程中找到羊了个羊开发教程。在课程详情页中下方点击模板,进入模板后,点击右上角的查看源代码,便可看到当前项目的代码。点击项目上方的改编按钮,然后点击保存按钮,即可在自己的账号内保存项目。之后便可以在账号页面内打开保存过的作品再次进行编辑。
本集教程实现的功能
- 点击绿旗后可以生成卡片
- 点击卡片后可以进入选择框
- 点击多个卡片后,卡片会自动后移
开始前的准备
- 删除不必要的代码
在指令上单击右键,即可找到删除选项。使用键盘上的Delete键或者用鼠标将指令拖拽到指令区也可以删除指令。

点击舞台栏的背景,将背景音乐代码删除或者挪开,让音乐不再播放。

将暂时用不到的组件隐藏起来。

功能一 生成卡片
我们只有一个卡片角色,如何生成多个卡片呢?这里要用到克隆功能。
第一关先设计为九张卡片。当点击绿旗时,让卡片隐藏自己,并且克隆自己九次,生成多张卡片。生成的卡片要让他显示在屏幕上。并且我们的卡片不能在同一个位置重叠,需要让它们生成在不同位置。

原本的方块太大了,可以在卡片的属性栏中改变它的大小。

如何控制卡片的位置?可以在变量栏中建立存放卡片在X轴和Y轴方向上坐标值的列表。

在列表中根据卡片的数量输入坐标后,将克隆的卡片移到坐标所在的位置。创建一个存放当前卡片编号的私有变量和存放卡片数量的全局变量,并移动它们到对应的坐标。在克隆中加一个对话指令测试它们。


可以看到它们显示了同一个图案,现在我们要让它们显示不同的图案。我们在每次克隆之前生成一个随机数,让卡片变换造型之后再克隆自己。

此时我们会发现,用这种方法生成的卡片,不是每种卡片的数量都是三的倍数,显然是无法用正常手段通关的。
创建一个名为卡片类型数量的列表来规定每种卡片的生成数量,用代码在每次生成卡片之前规定每种类型最高的生成数量,然后在每次生成一种类型的卡片后,在数组中把对应的卡片类型减去1。

可以看到测试过后依然没有解决问题,因为卡片的当前数量可以被减成负数。为了解决这个问题,需要加入判断条件,当前卡片的剩余数量为0时,则不再生成这类卡片。

加入判断之后重新测试,问题成功解决,同一种类的卡片生成数量是三的倍数。
功能二 点击卡片后卡片进入选择框
每个卡片重复执行一个检测点击的代码,一旦检测到鼠标点击这张卡片,就将卡片移动到指定的位置。当卡片就位后,这个脚本就可以停止了。

此时所有的卡片在选择框中都是重叠的,所以我们需要一个列表和变量来计算卡片应该在的位置。注意列表需要在每次游戏开始前初始化为空(在程序开始时添加一块积木将列表置空)。

功能三 同种卡片插入和自动后移
根据游戏规则,当选择框中有同样类别的其他卡片时,新插入的卡片应该在原有的同种卡片之前。插入一张卡片时,需要判断当前选择框里有没有这种类型的牌。在点击后用一个如果-那么-否则(if-if else-else)语句来判断。如果没有,则按原来的方法进行处理;如果有,则把他放在原本第一张同类型牌的位置。
下方新增的变量中,全局变量插入位置为本次新卡片在选择框里插入的位置,私有变量已选择卡片位置是每一张已经插入选择框的卡片当前在选择框的位置。

但现在新添加的卡片位置正确了,原本在选择框中的牌不会向后移动。通过增加一行广播指令,命令在插入点和之后的卡片向后移动一格。

自动后移实现的解释
在功能三中的自动后移主要有以下几个关键的变量:
- 全局变量插入位置:存储插入前第一个与插入卡片种类相同的卡片的位置,即插入卡片插入后应该在的位置
- 私有变量已选择卡片位置:存储每张卡片在选择框中的位置,从一开始从左到右增大
- 队列已选择卡牌:存储选择框中的每一张卡片的名称
接下来,我们用画图来一步步解析移动中每个变量的内容和它们的作用。
首先,游戏开始,已选择卡牌在初始化中被清空。

我们点击一个绿色卡片,由于已选择卡牌中并没有其他同类别的卡牌,所以它被直接加入已选择卡牌。已选择卡牌中添加了这张绿色卡牌的名称,它的已选择卡片位置为已选择卡牌的项目数,即队列的当前长度1。由于经过的代码块中并没有对插入位置进行任何改变,所以这个变量的值不变。

接下来我们点击一个红色卡片,已选择卡牌中也没有其他同类别的卡牌,所以它被直接加入已选择卡牌,在绿色方块的后面。它的已选择卡片位置也为已选择卡牌的项目数,为2。插入位置的值依然不变。

然后我们再次点击一个绿色卡片,他应该所处的位置是已选择卡牌中的绿色卡片的前面。已选择卡牌中有其他类别相同的卡牌,修改插入位置的值为已选择卡牌中第一张绿色卡牌的编号,即这张绿色卡牌在已选择卡牌队列中的位置1。然后广播自动后移指令。由于插入位置1-1=0,选择框里的两张卡牌的已选择卡片位置都比0大,所以使两张卡片的已选择卡片位置+1,并使两张卡片都进行后移。

广播后,新插入的绿色卡片的已选择卡牌位置被设为插入位置1,最后在已选择卡牌中的第一张绿色卡牌之前插入新加入的绿色卡片。

再点击一张红色卡片,它应该插入的位置是当前已选择卡牌中的红色卡片的前面。已选择卡牌中有其他类别相同的卡牌,修改插入位置的值为已选择卡牌中第一张红色卡牌的编号,即这张红色卡牌在已选择卡牌队列中的位置。然后广播自动后移指令。插入位置3-1=2,选择框里的三张卡牌中,只有红色卡牌的已选择卡片位置比2大,所以使红色卡片的已选择卡片位置+1,并使它进行后移,前面的两张绿色卡片不发生移动。

广播后,新插入的红色卡片的已选择卡牌位置被设为插入位置3,最后在已选择卡牌中的第一张红色卡牌之前插入新加入的红色卡片。

总结
在本集课程中,我们根据素材建立了羊了个羊Scratch项目,并且实现了关卡初始化,点击进入选择框和选择框卡片自动后移的功能。用到了有关鼠标点击,角色移动,全局变量和私有变量,广播等有关知识。在实现功能的过程中,我遇到了以下这些问题:
- 在修改过程中积木摆放凌乱,在多次更改后容易出现意料之外的代码冗余或缺失,导致逻辑错误;
- 全局变量和私有变量仅在创建时可以更改且之后不能查看属性,设置错误会出现难以察觉的问题;
对于这两点问题,在更改前及时保存,更改时及时处理应该回位或删除的积木、在设置变量前特别注意变量类型并做出标记可以减少错误再次发生的概率。

浙公网安备 33010602011771号