wansq

V1

2022/10/05阅读:855主题:橙心

Scratch版《羊了个羊》游戏开发1——卡片克隆体的管理

Part1:卡片克隆体的管理

《羊了个羊》可谓空前火爆,当大家都在考虑如何加入羊队时,笔者却不能专心玩游戏,作为一个略懂编程的爱好者,看到这种小游戏往往思考的是:它是如何做出来的?经过一番尝试,初步完成了Scratch版的核心功能。笔者将游戏的核心功能分章节阐述,本文主要聚焦卡片的功能,如有不当之处,欢迎指正。

1.基于列表管理卡片

由于《羊了个羊》游戏的卡片有很多,并且堆叠了多层。所以需要用到列表数据结构来存储卡片的相关信息。笔者所采用的卡片生成思路是:

  1. 建立三个列表,即所有卡片x坐标所有卡片y坐标所有卡片层数。基于这个三个维度的数据来克隆生成卡片,进行排列。
  2. 建立一个所有卡片种类的列表,为后续实现随机重排。

即:基于列表数据克隆多个角色,基于克隆体_编号设置各自的x坐标y坐标层数_种类等属性。如下图所示:

生成卡片原理
生成卡片原理

除此以外,还有几个的关键问题需要解决,如:如何实现卡片的遮挡关系?如何保证生成的卡片正好被消除?如何实现卡片种类随机排列?

2.主函数

笔者将所有卡片的生成分解为四个大步骤,初始化随机生成所有卡片列表打乱所有卡片克隆所有卡片。每个子函数需要实现的功能如下图所示:

主过程
主过程

下面结合脚本,具体来看四个主过程的实现方式:

3.初始化

卡片相关的初始化操作主要如下图所示:

卡片初始化脚本
卡片初始化脚本

注意:

  • 卡片总数变量可以修改,但是要保证是3的倍数,这是保证游戏能通关的必要条件。

  • _是否被遮挡是私有变量,每一个克隆体都有各自的该变量。变量名前加_是为了便于识别这是私有变量。

4.随机生成所有卡片列表

随机生成所有卡片列表这个子函数,主要是产生所有卡片相关的列表数据,具体脚本主要分为两个部分,即生成位置相关数据生成种类相关数据的部分,如下图所示:

子函数概览
子函数概览

具体来看生成这两部分的实现细节:

4.1生成位置相关数据

笔者采用了一种简单的排列规则,免去了手动排列卡片记录数据的烦恼。主要排列规则是每一层都是4*6的矩形排列,层与层之间错位交叉排列。如下图所示:

排列示意图
排列示意图

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

位置数据生成方式
位置数据生成方式

注:只要修改x坐标、y坐标、层数列表中的数据,便可以实现卡片的自由排列,后期可以开发可以卡片地图的编辑模式,此功能本质上便是修改这三个列表中的数据。

4.2生成种类相关数据

所有卡片种类列表的数据需要确保所有卡片可消除,即确保生成卡片种类是3个一组出现的

生成卡片种类数据
生成卡片种类数据

注:无论是生成位置数据,还是生成种类数据,这两次遍历都用了变量_编号,这个变量尽管是私有变量,但这里是本体调用的,所以是本体的变量_编号。每个克隆体都有自己的_编号,互不影响,后期管理克隆体卡片需要用到这个变量。

5.打乱所有卡片

上面生成的数据有一个“缺陷”,便是如果按照编号以此读取数据克隆,那么克隆体的种类是有序排列的。如下图所示:

未打乱效果
未打乱效果

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

打乱算法
打乱算法

6.克隆所有卡片

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

克隆卡片的子函数
克隆卡片的子函数

至此,还有最后一个细节问题没有解释,就是如何判断卡片是否被遮挡。由于篇幅有限,后续再详细解释,有需要的朋友可以下载源码查阅。

关注公众号“字节杂谈”,回复“羊了个羊”,即可下载Scratch源码。

分类:

前端

标签:

小程序

作者介绍

wansq
V1