羊了个羊游戏开发教程3:卡牌拾取和消除

news2024/9/22 11:37:36
本文首发于微信公众号: 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。

嗨!大家好,我是小蚂蚁。

终于要写第三篇教程了,中间拖的时间有点儿长,以至于我的好几位学员等不及已经自己做出来了。这是一件让我感到非常高兴的事情。一位学员从零基础开始学,到最后有一定的能力自己琢磨着把游戏做出来,这是一件不论是对学员来讲,还是对我来讲都是值得骄傲的事情。因为他们已经掌握了自己学习和前进的方法,我认为这种自发性的能动性是推动一个人自主学习或者前进的最强大的动力。

好了,接下来让我们来看一下这一节将要学习的内容。

如图,在之前的基础上我们要实现将拾取的牌放到下面的插槽中,插槽中如果有三张同样的牌,则将她们消除掉,在这个过程中我们还要根据当前要插入的牌,对其它牌进行位置调整,除此之外,在消除后,也要对插槽中的牌重新进行位置调整。

理论部分

老规矩,我们先来一起搞定理论部分。

如图,还是先进行一下数据抽象,每个不同类型的卡牌都可以使用一个数字代替,整个卡槽中的 7 张卡牌,其实就等同于下方的 7 个数字。

接着,我们来看一下将卡牌插入卡槽的几种情况。

第一种情况,如果当前卡槽中没有与它相同的卡牌,那么就可以将这张卡牌放到队伍的最后。

第二种情况,如果当前卡槽中有一张与它相同的牌,那么就将这张相同牌的后面的所有的牌(这里只有牌 3)向后移动一个位置,然后把它插入到让出的这个位置上。

第三种情况,如果当前卡槽中有两张与它相同的牌,那么就将最后一张相同的牌的后面的所有牌(这里有牌 3 和 牌 1)向后移动一个位置,然后把它插入到让出的这个位置上。

这就是这个游戏中可能出现的三种插牌情况了。如何实现一张牌的插入,以及其它的牌的位置调整呢?

假设当前卡槽中有四张牌[5,5,3,1],现在要往里再插入一张“牌5”,整个过程是这样的:依次检查每个位置的牌,如果发现这个位置的牌跟要插入的牌一样,就记录一下这个位置,否则的话则跳过继续检查下一个,直到检查完所有卡槽中的牌为止。

这个过程结束后,那个“标记位置”记录的就是最后一张跟插入卡牌相同的牌的位置,有了这个“标记位置”就相当于我们知道了这张牌要插在哪里了,其实就是“标记位置 + 1”的那个位置上。

那剩余其它牌的位置如何调整呢?只需要判断剩余的牌的位置是否大于“标记位置”,如果大于的话,就将自己的位置增加 1,看起来就像是这样。

这就是卡牌的插入和位置调整了,接着我们再来看一下如何判断是否需要消除,其实非常简单,看到这里你应该也能想到的,只需要判断这一串数字里是否有 3 个相邻又相同的数字,有的话,就满足消除条件。

如图,就是针对于 5 张卡牌的检查过程,从前往后,依次的取出一张牌,然后看看它后面有没有两张跟它一样的牌,有的话就满足消除条件,没有的话,就接着去检查下一张牌,继续这个过程,直到检查完卡槽中的所有牌。

其实在上图的例子中,我们只需要检查完前三张就可以了,因为到这里就能够判断出当前满足消除条件了,在这个游戏中不可能出现同时满足两个三消的情况,所以第三张牌之后就不需要检查了。

在完成了消除之后,还需要针对剩余的卡牌进行一次位置的调整,根据我们之前讲过的位置调整,想一下消除之后的调整应该怎么处理呢?

在进行消除的检查时,我们可以做一个记录,记录就是排在最后面的那一张要消除的牌的位置,有了这个“标记位置”,剩余的牌只需要判断自己的位置是否大于这个“标记位置”,如果大于的话,就将自己向前移动三个位置即可。

实践部分

好了,以上就是所有的理论基础了,接下来,我们就到微信小游戏制作工具中实现一下吧!

如图,这里我新增了两个资源,一个是“卡牌槽”用于在下面放置卡牌,另一个是“插槽卡牌”,这个精灵用作卡牌槽中的牌,它跟我们之前创建的“卡牌”精灵类似的地方是,都有 10 个小动物头像造型,而且造型的顺序也都是一样的(为什么要再去创建一个这样的“插槽卡牌”呢?我们稍后会解释)。

接着,来看一下新增的几个全局变量

当前卡牌的插入位置:记录新来的牌要插入的位置。

当前卡牌的消除位置:记录最后的那一张要消除的牌的位置。

当前拾取的卡牌类型:记录当前从上方拾取的卡牌的类型。

是否可操作:用于判断是否可操作,在牌进行插入或者消除的过程中,玩家是不能够去操作其它牌的。

需要消除出的卡牌类型:满足消除条件的卡牌的类型。

除此之外,我们还创建了一个新的列表。

插槽牌的类型列表:卡牌槽中的卡牌的类型列表。

除了变量之外,我们还新建了几个通知

几个通知的内容直接根据字面意思理解即可。

接下来,我们来看积木逻辑,首先从上方的要拾取的卡牌开始,先来看“卡牌”精灵上的拾取逻辑。

图中红线框出的就是我们在之前的基础上新增的积木块,图中已经有了详细的解释,这里就不再赘述了。

上方卡牌拾取完后,接着看这个被克隆出来的“插槽卡牌”。

先在“插槽卡牌”上创建几个新的局部变量

位置:记录自己当前在卡牌槽中的位置。

类型:记录自己的卡牌类型。

迭代:在循环中用到。

标记位置:记录卡槽中跟自己一样的牌的位置。

是否是新牌:记录自己是否是新牌,刚拾取还没有进入到卡槽中的牌是新牌,进入卡槽之后就不再是新牌。

然后看一下“插槽卡牌”上的克隆积木逻辑。

其中的逻辑循环就是我们在理论中讲到的检查过程,可以对照着之前的图好好的理解一下。

在新卡牌插入卡槽之前,向卡槽中的其它的牌发送了一个调整位置的通知,接着,我们继续来看一下卡槽中的其它的牌是如何调整自己的位置的。

当前卡牌的插入位置”这个变量中记录的是新牌插入的位置,卡牌的调整就是将大于等于这个位置的旧牌,全部向后移动一个位置,以此来为新牌腾出一个空位。

新牌被插入卡槽之后,再来看一下消除的计算和处理。我把消除计算的逻辑放在了“卡牌槽”上,来看一下“卡牌槽”这个精灵上。

首先,还是需要创建几个局部变量

迭代1/2: 用于循环遍历。

比对类型:当前检查的卡牌类型。

匹配数量:当前检查的卡牌类型匹配的数量。

接着,来看一下消除计算的积木逻辑。

其中,较难以理解的一个是关于消除的遍历检查,这里用了双重的循环,另一个是关于“标记位置”的设置,为什么“当前卡牌的消除位置”设置的是“迭代2”呢?如果你觉得难以理解,我的建议是可以在纸上画出来一个卡牌队列,列举出一组数字,然后对照着你举出的例子来查看这段积木逻辑。其实,这整个过程你完全可以在一张纸上演绎出来。

最后,我们再来看一下“插槽卡牌”上的消除处理,以及消除后的剩余牌的位置调整。

这样这个从插入到消除的功能就完成啦!至于游戏的结束和过关条件如何判断,我们把它放在了上方的“消除处理”积木逻辑的最后。判读条件很简单,如果插槽中的 7 个位置都放满了卡牌,那么游戏就结束了;如果当前的游戏中不再有剩余的牌了,即“卡牌总数”变量等于 0 ,那么就证明玩家消除掉了所有的牌,游戏过关。

最后说一下为什么要再新增加一个“插槽卡牌”,而不是把“插槽卡牌”中的逻辑都放到原来的“卡牌”中,这是一种职责的分离,游戏中的每一个精灵只需要处理自己的职责即可,“卡牌”负责的是主要是堆叠的布局和拾取,拾取之后它的职责就结束了,剩余的如何插入卡槽,如果在卡槽中进行位置调整,如何进行删除等职责将都由“插槽卡牌”来处理。

把不同的职责和功能划分开来,会方便我们做计划或者开发,因为每一部分都只负责处理自己份内的事情,所以你在实现这部分功能的时候,就可以更专注啦!

最后,我们再预览一下整个游戏吧!

到这里肯定会有人问了,如何获取示例呀?答案是没有示例的获取方法,如果你想找的是一份类似“羊了个羊”游戏的源码,那么网上已经有开源的源码了,可以自己去搜索。如果你想要的是学习自己动手做一个这样的游戏,那么相信我,最好的方式就是你自己动手做一个。

只有你自己动手做出来的游戏才是真正属于你的,否则的话,即使游戏在你手里,它也不属于你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023美赛C题思路数据代码分享

文章目录赛题思路2023年美国大学生数学建模竞赛选题&论文一、关于选题二、关于论文格式三、关于论文提交四、论文提交流程注意不要手滑美赛C题思路数据代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片,加入获取一手资源 202…

【小西】同步咪咕订单给咪咕方(写接口给第三方)

同步咪咕订单给咪咕方前言思路实现1、定义请求体和响应信息MiGuOrderSyncReqMiGuOrderSyncResp2、nacos定义好咪咕相关配置信息3、同步咪咕参数配置4、MiGuOrderSyncControl5、MiGuOrderSyncService6、MiGuOrderSyncServiceImplCreateAscIISignUtil 生成参数 字典排序 签名Hmac…

数据分析:消费者数据分析

数据分析:消费者数据分析 作者:AOAIYI 创作不易,如果觉得文章不错或能帮助到你学习,记得点赞收藏评论一下哦 文章目录数据分析:消费者数据分析一、前言二、数据准备三、数据预处理四、个体消费者分析五、用户消费行为总…

【CMake】CMake构建C++代码(一)

在Linux开发过程中,难免会用到CMake来构建你的代码。本文将说明如何构建自己的代码,将自己的代码变为共享库,共其他代码使用。 文章目录在Linux开发过程中,难免会用到CMake来构建你的代码。本文将说明如何构建自己的代码&#xff…

R语言Ternary包绘制三元图、RGB三色空间分布图的方法

本文介绍基于R语言中的Ternary包,绘制三元图(Ternary Plot)的详细方法;其中,我们就以RGB三色分布图为例来具体介绍。 三元图可以从三个不同的角度反应数据的特征,因此在很多领域都得以广泛应用;…

2023美赛F题思路数据代码分享

文章目录赛题思路2023年美国大学生数学建模竞赛选题&论文一、关于选题二、关于论文格式三、关于论文提交四、论文提交流程注意不要手滑美赛F题思路数据代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片,加入获取一手资源 202…

MySQL 索引 (只要能看完)(一篇就够了)

文章目录前言一、MySQL索引介绍1.1 索引的类别1.2 索引的创建原则二、索引的管理和使用2.1 制造实验数据2.2 explain 使用说明2.3 创建索引2.3.1 基于创建表时建立索引2.3.2 基于已创建好的表创建索引2.4 删除索引2.5 聚集索引和二级索引2.5.1 聚集索引2.5.2 二级索引&#xff…

【python知识】win10下如何用python将网页转成pdf文件

一、说明 本篇记录一个自己享用的简单工具。在大量阅读网上文章中,常常遇到一个专题对应多篇文章,用浏览器的收藏根本不够。能否见到一篇文章具有搜藏价值,就转到线下,以备日后慢慢消化吸收。这里终于找到一个办法,将在…

【IIC子系统之读取温湿度】

IIC子系统之读取温湿度IIC总线协议主机读取一个字节主机发送一个字节设备树编写IIC设备驱动层API编写程序读取温湿度应用层驱动读取温湿度函数解析头文件IIC总线协议 1.I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工同步总线,主要用于连接整体电路。 1&a…

面试准备知识点与总结——(基础篇)

目录Java基础Java面向对象有哪些特征ArrayList和LinkedList有什么区别高并发的集合有哪些问题迭代器的fail-fast和fail-safeArrayList底层扩容机制HashMap面试合集解答设计模式单例设计模式哪些地方体现了单例模式Java基础 Java面向对象有哪些特征 Java面向对象有三大特征&am…

Win10显示dds及tga缩略图

整理之前做游戏MOD时收集的模型资源,3D游戏模型的贴图文件格式基本都是dds或tga的,毕竟无损压缩、支持嵌入MipMap、带透明通道、可以被GPU硬解balabala...道理我都懂但这俩玩意系统根本直接查看不了,就算装上专门的看图软件或插件,文件夹视图下也没有缩略图预览,只能一个个点开…

SQL查询的优化:如何调整SQL查询的性能

查询优化是在合理利用系统资源和性能指标的基础上,定义最有效、最优化的方式和技术,以提高查询性能的过程。查询调整的目的是找到一种方法来减少查询的响应时间,防止资源的过度消耗,并识别不良的查询性能。 在查询优化的背景下&a…

CF1795D Triangle Coloring (组合数学)

链接 题意: 给定一个 n 个点 n 条边的图 ,n 为 6 的倍数,每条边都有边权。 这个图是由 n/3 个三元环构成的 [1,2,3],[4,5,6],[7,8,9],[10,11,12]...... 一个 n12 的图长成这个(唯一): 现在你需要给图染上红…

厂商推送限制说明及极光的适配方案

背景 自2023年起,各个厂商逐步对营销类消息做数量管控,具体如下: 华为 自2023年1月5日起,华为PUSH通道将根据应用类型对资讯营销类消息的每日推送数量进行上限管理,服务与通讯类消息每日推送数量不受限制。详情请参考推…

使用MMDetection进行目标检测、实例和全景分割

MMDetection 是一个基于 PyTorch 的目标检测开源工具箱,它是 OpenMMLab 项目的一部分。包含以下主要特性: 支持三个任务 目标检测(Object Detection)是指分类并定位图片中物体的任务实例分割(Instance Segmentation&a…

服务间调用方式 OpenFeign 的介绍和使用

文章目录前言1、 RestTemplate1.1、通用方法 exchange1.2、RestTemplate 和 OpenFeign 的区别2、RPC 和 HTTP2.1、RPC 是什么2.2、RPC 调用过程示意图2.3、HTTP 是什么2.4、HTTP 调用过程示意图2.5、对比3 、OpenFeign3.1 、OpenFeign 常用注解3.2 、案例前言 Feign 停更了&am…

空间复杂度与时间复杂度

1、时间复杂度和空间复杂度 (1)时间复杂度、空间复杂度是什么? 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,空间效率被称作空间复杂度时间复杂度主要衡量的是一…

Python空间分析| 02 利用Python计算空间局部自相关(LISA)

局部空间自相关 import esda import numpy as np import pandas as pd import libpysal as lps import geopandas as gpd import contextily as ctx import matplotlib.pyplot as plt from geopandas import GeoDataFrame from shapely.geometry import Point from pylab im…

LeetCode 1139. 最大的以 1 为边界的正方形

原题链接 难度:middle\color{orange}{middle}middle 2023/2/17 每日一题 题目描述 给你一个由若干 000 和 111 组成的二维网格 gridgridgrid,请你找出边界全部由 111 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在&am…

Transformer论文阅读:ViT算法笔记

标题:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 会议:ICLR2021 论文地址:https://openreview.net/forum?idYicbFdNTTy 文章目录Abstract1 Introduction2 Related Work3 Method3.1 Vision Transformer3.2…