
wansq
2022/10/05阅读:855主题:橙心
Scratch版《羊了个羊》游戏开发1——卡片克隆体的管理
Part1:卡片克隆体的管理
《羊了个羊》可谓空前火爆,当大家都在考虑如何加入羊队时,笔者却不能专心玩游戏,作为一个略懂编程的爱好者,看到这种小游戏往往思考的是:它是如何做出来的?经过一番尝试,初步完成了Scratch版的核心功能。笔者将游戏的核心功能分章节阐述,本文主要聚焦卡片的功能,如有不当之处,欢迎指正。
1.基于列表管理卡片
由于《羊了个羊》游戏的卡片有很多,并且堆叠了多层。所以需要用到列表数据结构来存储卡片的相关信息。笔者所采用的卡片生成思路是:
-
建立三个列表,即 所有卡片x坐标
、所有卡片y坐标
、所有卡片层数
。基于这个三个维度的数据来克隆
生成卡片,进行排列。 -
建立一个 所有卡片种类
的列表,为后续实现随机重排。
即:基于列表数据克隆多个角色,基于克隆体_编号
设置各自的x坐标
、y坐标
、层数
、_种类
等属性。如下图所示:

除此以外,还有几个的关键问题需要解决,如:如何实现卡片的遮挡关系?如何保证生成的卡片正好被消除?如何实现卡片种类随机排列?
2.主函数
笔者将所有卡片的生成分解为四个大步骤,初始化
、随机生成所有卡片列表
、打乱所有卡片
、克隆所有卡片
。每个子函数需要实现的功能如下图所示:

下面结合脚本,具体来看四个主过程的实现方式:
3.初始化
卡片相关的初始化操作主要如下图所示:

注意:
-
卡片总数
变量可以修改,但是要保证是3的倍数,这是保证游戏能通关的必要条件。 -
_是否被遮挡
是私有变量,每一个克隆体都有各自的该变量。变量名前加_
是为了便于识别这是私有变量。
4.随机生成所有卡片列表
随机生成所有卡片列表
这个子函数,主要是产生所有卡片相关的列表数据,具体脚本主要分为两个部分,即生成位置相关数据和生成种类相关数据的部分,如下图所示:

具体来看生成这两部分的实现细节:
4.1生成位置相关数据
笔者采用了一种简单的排列规则,免去了手动排列卡片记录数据的烦恼。主要排列规则是每一层都是4*6
的矩形排列,层与层之间错位交叉排列。如下图所示:

这样做的好处是,如果把最底层作为第一层的话,就可以根据每一张卡片的编号计算出卡片对应的层号
、行号
和列号
。进而根据行、列号计算出对应的x坐标
和y坐标
。将每一张卡片的这些数据存入对应列表即可。如下图所示:

注:只要修改x坐标、y坐标、层数列表中的数据,便可以实现卡片的自由排列,后期可以开发可以卡片地图的编辑模式,此功能本质上便是修改这三个列表中的数据。
4.2生成种类相关数据
所有卡片种类列表的数据需要确保所有卡片可消除,即确保生成卡片种类是3个一组出现的。

注:无论是生成位置数据,还是生成种类数据,这两次遍历都用了变量_编号
,这个变量尽管是私有变量,但这里是本体调用的,所以是本体的变量_编号
。每个克隆体都有自己的_编号
,互不影响,后期管理克隆体卡片需要用到这个变量。
5.打乱所有卡片
上面生成的数据有一个“缺陷”,便是如果按照编号以此读取数据克隆,那么克隆体的种类是有序排列的。如下图所示:

只要打乱所有卡片克隆体列表
中的数据即可。这里用到的打乱算法
原理很简单,即重复多次随机抽取列表中的两位数据交换。

6.克隆所有卡片
最后一步便是依次克隆不同_编号
的克隆体,克隆体根据_编号
取出列表数据(x坐标、y坐标、层数、种类)即可。

至此,还有最后一个细节问题没有解释,就是如何判断卡片是否被遮挡。由于篇幅有限,后续再详细解释,有需要的朋友可以下载源码查阅。
关注公众号“字节杂谈”,回复“羊了个羊”,即可下载Scratch源码。
作者介绍
