消消乐P1 卡片生成和自动消除
消消乐 第一集
在本系列教程中,我们将从零开始完成一个消消乐游戏。这一集中,我们首先完成卡片克隆和自动消除的功能。
布置场景
我们从侯老师的界面中导入素材。我们使用的是水果部分的素材作为卡片,所以我们暂时隐藏掉其他暂时用不到的素材,然后让我们的卡片本体在开始时隐藏。
接下来我们完成对卡片初始状态的布置。我们准备布置8行8列共六十四张卡片,所以我们使用一个循环嵌套来完成场景的布置。
首先我们开始时移动到左上角的坐标。接下来重复八次,每次克隆一次自己,然后右移一段坐标,再克隆自己,重复八次后回到第一个的x坐标,y坐标下移一段距离。这样就成功的克隆了一行的卡片。然后把上面行的操作重复八次,这样我们就完成了八列八行的卡片克隆。

但此时我们并没有看到卡片,是因为卡片克隆的时候没有显示。并且为了防止克隆出来的卡片一模一样,我们给卡片随机更换造型。我们可以发现有六种卡片,第七种是空的。所以我们选择1到6的随机数更换造型。

自动消除
接下来我们对生成的卡片中三个连在一起的卡片做判断。对于三个连在一起的卡片,我们需要让它们都被消除。为了实现这个功能,我们需要让卡片记录一下自己所在的位置和类型。我们新建两个私有变量物品编号和物品类型,物品编号来存放卡片的代号,物品类型来存放卡片的种类。
为了存放整体的排序,我们用两个列表物品编号和物品类型来存放所有的代号和卡片类型。由于列表和上面的私有变量同名,所以我们在私有变量之前加一个下划线_来区分。
两个列表需要在游戏开始时初始化为空。

在克隆卡片时,给卡片唯一的编号。本体的物品编号初始化为1,克隆后的克隆体物品编号也为1。随后本体的编号增加,让下一个克隆体的物品编号也随之变化。克隆完成后,把每个卡片的物品编号添加到列表中。

然后我们来记录一下卡片的类型,可以先随机数切换造型,然后把造型名称存到变量和列表里;也可以先存入变量,然后再切换造型,存入列表。

接下来我们来完成消除逻辑,要选择哪些卡片要被消除。我们先建立一个列表删除编号,要把被删除的卡片编号存到列表里。对于每张卡片,判断一下右侧和下面有没有两张和自己类型相同的卡片就可以了。为什么不对左侧和上面的卡片进行判断?因为对于三张可以消除的卡片,我们在对左和对上进行判断成功时,它们三个已经被对右和对下的判断所标记了,所以对左和对上的判断只是重复我们之前卡片中的判断过的内容,没有意义。我们使用一个迭代器i来完成遍历,i为当前遍历到的卡片在列表中的位置,从左到右从上到下递增。
首先完成对右侧的卡片的判断,如果当左侧第一张和第二张的卡片类型和遍历到的卡片类型相同时,就把他们的卡片编号加入待删除的卡片中。需要删除的卡片编号就是卡片编号列表中i,i+1,i+2项中对应的值。

接下来我们对下方进行判断。我们是按顺序存放所有卡片的编号的,那么在某张卡片下方的卡片,编号就比这张卡片大8。所以我们判断i,i+8,i+16项的卡片类型是否相同,如果相同也把它们加入待删除的列表中。
两种判断完成后,要把i增加1,去判断下一张卡片。

对于卡片,我们让它重复执行判断,如果判断到自己被消除了,就修改列表中的值为特殊值大写X,让自己消失。

总结
本集我们完成了卡片的布置和自动消除功能。我们通过对列表下标值的关系来进行相邻的判断。但是因为Scratch中并没有多维数组的概念,所以我们只能用一维的列表当二维列表的映射,这导致了一些问题,比如我们向右的判断会各行判断。大家可以思考一下如何解决这个问题。
*我们在第四集中会集中修复消除方面混乱的问题,如果在这集结束后发现消除方面的奇怪操作,请先看完第四集教程再尝试。
改了一下午代码后才知道后面一整集基本都在debug的教训

浙公网安备 33010602011771号