消消乐P4 消除优化

消消乐 第四集

本集我们实现了交换后的消除,出界限制,以及消除方面的一大堆Debug。

在本集之前,消除方面的问题还是有很多的,让我在第三级之后以为是我代码哪里错了,检查一下午没看出来搞到破防orz

如果有一切消除方面的问题,请在这一集彻底做完之前无视。

物品拖动后消除

我们上一集中实现了物品拖动,但物品拖动后没有实现自动消除。

现在的代码中,只有当绿旗被点击的时候我们进行了消除和补充操作。我们在消除操作之后,也应该执行一次相同的操作。首先我们把消除的流程新建一个自建积木。这里的等待全部提到了检查之前,因为我们的克隆体里代码现在很长,需要一段时间让克隆体完成它的操作。

在交换操作执行完成后,我们发出一次广播检查消除状况。

我们发出的广播是所有克隆体都能收到的,但是检查消除情况只需要做一次就够了。我们让本体来完成这个操作。怎么判断本体?我们可以用一个变量是否本体来判断,但我们这次用新的办法。大家可能已经注意到我们有一个空着的造型7,我们把本体设置成这个造型,通过判断造型编号来执行操作。

出界问题

当我们把卡片试图向地图外面交换的时候,有时候会和另一排的卡片交换,有时候会直接回到地图中间的位置。这是因为卡片出界的时候,对列表编号的判断会出错,可能找到了位置不正确的卡片,或者编号根本不在列表中存在。比如第一排的卡片向上移动,编号-8之后得到的会是一个负数,显然这个编号是不在我们的列表中存在的。

为了解决这个问题,我们在交换之前来做一次判断,如果判断发现交换后出界了,我们就不执行交换操作并且提示。对于上下两排的卡片,编号是18和5764,我们可以直接通过判断大小来确认。如果在第一排试图向上移动,或者在最后一排试图向下移动,我们就要进行提示了。否则可以正常的执行交换。

对于列的出界判断,视频中并没有写,只对开头结尾做了一个判断。
但作为强迫症,不写是不可能的
我们之前在消除部分判断后两列的地方用余数判断列,我们同样可以使用这个方法。

说起来消除部分向下消除的代码也是越界的,但Scratch对越界的判断似乎十分宽松

Debug Time

接下来我们来完善消除的逻辑,让消除变得正常。消除之前都是以一种薛定谔的方式来消除,有的消不同种类,有的消不同位置,要多玄学有多玄学。这次我们一起解决这个问题。

位置编号出错

首先在游戏进行一段时间后,我们发现我们的位置编号列表一直保持和卡片数量相同的64,但是我们的物品类型列表却会随着游戏进行而增加项目数,会导致我们位置编号对应的物品类型出现问题。这是因为我们在生成新的克隆体的时候,总是将新生成的物品类型变量加入到物品类型列表中。对于初始化来说这没问题,但是在补充卡片的时候新增的克隆体应该在原有列表中修改,而不是新增。我们把克隆体中的添加操作放在初始化的代码中。

这个bug对应的应该是之前消除位置错误的问题。

造型显示问题

在克隆体生成时的造型切换我们也不能切换成自己的变量了,虽然视频中的理由是为了以后的交换,但我认为问题发生的本质原因是在补充卡片操作时没有更换克隆体的物品类型变量。所以可以按照视频里的操作改变切换造型的逻辑:

也可以在补充卡片里加上对物品类型的修改。

这个问题直接导致了之前消除时画面明明显示可以消除/不能消除,实际上无法消除/做出了消除反应的这种“表里不一”的情况。

删除编号列表优化

在交换的时候,我们先更改位置编号,再更换物品类型,可以避免一些可能的问题。

对于卡片的删除,替换造型后删除编号中的编号就不需要存在了,所以我们在删除卡片时也一并把删除编号中的项一同删除了。

为了防止列表残留项对删除的影响,我们把删除编号列表在补充卡片之前清空。

删除位置的修复

测试发现有一些看起来可以消除但是仍然没有消除的卡片。检查我们的物品类型物品编号列表,我们发现物品类型里的类型编号是正常的,但是位置编号对应的位置却出现了奇怪的地方。

位置编号第35项出现问题的原因是这个地方的卡片是原先卡片被删除后克隆的新卡片,所以卡片编号更靠后。但是对应的物品类型列表中并没有对应的下标,所以导致了消除错误。查看检查消除情况部分的代码,我们发现我们之前用i加入了删除编号列表中执行删除操作,但是i实际上代表的是需要删除的卡片在物品类型列表中的下标,而非这张卡片的类型,即物品编号变量。我们删除卡片的凭据是删除编号列表中是否存在卡片的物品编号,这就导致了我们没法找到需要消除的卡片。

到这里可能绕的有些晕,我们重复一下一些变量和列表的含义:

  • 私有变量物品编号:存放了卡片唯一的编号,在生成时确定,不可更改。这个编号意味着一张独一无二的卡片。
  • 私有变量物品类型:存放了卡片的造型,不同的卡片可能有相同的造型,但是一张卡片的造型不应该被修改。
  • 列表位置编号:列表下标意味着卡片在屏幕上的相对位置,列表中的值表示在对应位置上卡片的物品编号
  • 列表物品类型:列表下标和上面一样同样意味着卡片的相对位置,列表中的值表示的事对应位置上卡片的物品类型变量,也就是卡片的造型。

所以,我们在判定删除的卡片是,存放的应该是列表位置编号中,要删除位置删卡片的物品编号变量,而不是卡片在列表中的位置i本身。我们对删除编号位置中的添加做出修改。

总结

本集课程我们完成了交换后消除的操作,出界判断,以及重要的消除逻辑的bug修正,现在我们的游戏终于可以正常的实现消除逻辑了。在修改bug的过程中,我因为对一些变量和列表的含义认识不够充分,导致修改的时候无从下手。我们编程的时候还是应该从底层逻辑出发,理解每一个变量,列表和列表下标等重要组成部分的含义,这样在编写逻辑的时候我们就可以理顺思路,在出现问题的时候也容易确认原因。

posted @ 2025-03-18 18:27  AnzioNiko  阅读(115)  评论(0)    收藏  举报