当前位置: 首页 > news >正文

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

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

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

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

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

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

理论部分

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实践部分

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

迭代:在循环中用到。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章:

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

本文首发于微信公众号: 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。嗨!大家好,我是小蚂蚁。终于要写第三篇教程了,中间拖的时间有点儿长,以至于我的好几位学员等…...

SHA1详解

目录 一、介绍 二、与MD5的区别 1、对强行攻击的安全性 2、对密码分析的安全性 3、速度 三、应用 1、文件指纹 2、Git中标识对象 四、算法原理 1、填充消息 2、消息处理 3、数据运算 (1)链接变量 (2)步函数 一、介绍…...

Go并发介绍及其使用

1. goroutine Go语言通过go关键字来启动一个goroutine。注意:go关键字后面必须跟一个函数,不能是语句或者其他东西,函数的返回值被忽略。 goroutine有如下特性: go的执行是非阻塞的,不会等待。go后面的函数的返回值…...

小米手机屏幕解锁技巧精选

手机锁是一种保护存储的用户数据和信息的方法。存储在锁定手机中的所有信息比任何人都可以访问的手机安全得多。但有时,如果用户忘记了这些屏幕锁定,可能会造成麻烦。在此博客中,我们将帮助用户了解如何解锁小米手机。 什么时候需要解锁小米手…...

「SDOI2009」HH去散步

HH去散步 题目限制 内存限制:125.00MB时间限制:1.00s标准输入标准输出 题目知识点 动态规划 dpdpdp矩阵 矩阵乘法矩阵加速矩阵快速幂 思维 构造 题目来源 「SDOI2009」HH去散步 题目 题目背景 HH 有个一成不变的习惯,喜欢在饭后散步…...

用上Visual Studio后,我的世界游戏的构建时间减少了一半

今天我们讲述一个使用 Visual Studio 提升工作效率的案例。 我的世界(Minecraft) 游戏开发商 Mojang Studios 近日联系了 Visual Studio C 团队,因为他们需要将 C 开发扩展到新平台(Linux),同时还希望保留他们现有的技术基础&…...

34、基于51单片机锂电池电压电流容量检测仪表LCD液晶显示 原理图PCB程序设计

方案选择 单片机的选择 方案一:AT89C52是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元…...

【Java基础】泛型(一)-基础使用

本文以Java的官方文档为参考,辅以代码示例,尽可能详尽的叙述泛型的每一个特性 什么是泛型 泛型(Generics)也称为参数化类型(parameterized types),也就是将类型本身作为接口、类、方法中的参数…...

学Python不会不知道NumPy计算包吧,带你五分钟看懂NumPy计算包

从今天我们就开始进入 Python 数据分析工具的教程。 前段时间数据分析和Python都讲了一点点,但是Python的数据库,讲的少了点,所以接下来就讲讲这些重要的常用数据库吧!!! Python 数据分析绝对绕不过的四个…...

积水内涝监测——埋入式积水终端设备介绍

一、设备概述 埋入式积水终端是针对城市内涝推出的积水信息监测采集设备,采用超声波传感技术,对积水的深度进行精确的测量。产品能够在低温、腐蚀环境下可靠运行本产品特别适用于智慧城市中,对城市道路、社区低洼处的积水进行实时监测上报到…...

Kafka的日志同步

首先介绍下LEO和HW LEO: 即LogEndOffset,表示该副本下次日志记录的偏移量HW:即HighWatermark,高水位线,是所有ISR副本集合中的LEO最小值上图中,如果此时三个副本都在ISR集合中,那么此时他们的LE…...

【Mybatis源码解析】mapper实例化及执行流程源码分析

文章目录简介环境搭建源码解析基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 简介 基于SpringBoot的Mybatis源码解析: 1.如何对mapper实例化bean 在加载BeanDefinition时&a…...

分布式文件管理系统(MinIO)

1.去中心化,每个点是对等的关系,通过Ngix对负载做均衡工作。 好处: 能够避免单点故障,将多块硬盘组成一个对象存储服务。 2. 使用纠删编码技术来保护数据,是一种回复丢失和损坏的数据的数学算法,他将数据分…...

Springcloud-配置中心config

一、添加依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId&…...

[项目篇] 音乐播放器开发报告

文章目录1. 项目描述:2. 项目上线展现&#xff1a;3. 项目具体实现&#xff1a;1. 登录2. 注册3.退出系统4.添加音乐4.1前后端交互约定4.2上传文件业务逻辑&#xff1a;4.3创建model包中的music类4.4在MusicMapper接口中&#xff0c;声明insertMusic抽象方法4.5在mybatis包中添…...

Spring Cloud Alibaba--gateway微服务详解之网关(二)

1、网关介绍 上篇对微服务中的nacos注册中心进行集成讲解。nacos主要作用是管理多服务之间复杂关系的组件。微服务是非常庞大且问题突出的架构&#xff0c;HTTP协议具有跨源资源共享 (CORS) Cross- Origin Resource Sharing机制&#xff0c;而处于安全考虑往往前端架构都会对跨…...

Zynq非VDMA方案实现视频3帧缓存输出,无需SDK配置,提供工程源码和技术支持

目录1、前言2、VDMA的不便之处3、FDMA取代VDMA实现视频缓存输出4、Vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 对于Zynq和Microblaze的用户而言&#xff0c;要想实现图像缓存输出&#xff0c;多半要使用Xilinx推荐的VDMA方案&#xff0c;该…...

血液透析过滤芯气密性检测装置中的高精度多段压力控制解决方案

摘要&#xff1a;针对目前血液过滤芯气密性检测过程中存在的自动化水平较低、多个检测压力之间需人工切换和压力控制精度较差的问题&#xff0c;为满足客户对高精度和自动化气密性检测的要求&#xff0c;本文提出了相应的解决方案。解决方案的主要特点是全过程的可编程压力控制…...

PDF加密如何批量解除?快来了解下这个方法

在现代办公环境中&#xff0c;PDF文档的使用非常普遍。然而&#xff0c;由于一些安全需求&#xff0c;有时候PDF文档会被加密&#xff0c;使得只有授权人员可以查看或修改它。但是&#xff0c;如果您需要对许多加密PDF文档进行操作&#xff0c;逐个解密这些文档可能非常费时费力…...

C++——哈希4|布隆过滤器

目录 布隆过滤器 完整代码 布隆过滤器应用 布隆过滤器的查找 布隆过滤器删除 布隆过滤器优点 布隆过滤器缺陷 布隆过滤器海量数据处理 布隆过滤器 位图只能映射整形&#xff0c;而对于字符串却无能为力。 把字符串用哈希算法转成整形&#xff0c;映射一个位置进行标…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...