当前位置: 首页 > 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;映射一个位置进行标…...

python冒号的用法总结

一维数组 1. 单个冒号的情况 1.1 写完整的情况下 单个冒号的情况下&#xff0c;对数组的遍历操作是从前向后操作。如&#xff1a;arr[a:b] &#xff0c;冒号前的a含义是从a开始遍历&#xff0c;冒号后的b含义是到b截止&#xff08;不包括b&#xff09;。 arr [1, 2, 3, 4,…...

面试题整理

面试题整理 一、Java基础 1、Java 语言有哪些特点 简单易学&#xff1b; 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b; 平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b; 支持多线程&#xff08; C 语言…...

C语言深度解剖-关键字(7)

目录 switch case 语句 理解&#xff1a; 补充&#xff1a; 深入理解&#xff1a; default 语句&#xff1a; case语句&#xff1a; 总结&#xff1a; do、while、for 关键字 while for do while 各种死循环方法&#xff1a; while for do while getchar 写在…...

利用JavaScript编写Python内置函数查询工具

最近我开始学习Python编程语言&#xff0c;我发现Python拥有非常丰富的内置函数&#xff0c;可以用来实现各种不同的功能。但是每当我需要查找一个内置函数时&#xff0c;我总是需要联网使用搜索引擎进行查询。这种方式不仅费时费力&#xff0c;而且需要联网&#xff0c;很不方…...

【MySQL进阶】SQL优化

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…...

最新版海豚调度dolphinscheduler-3.1.3配置windows本地开发环境

0 说明 本文基于最新版海豚调度dolphinscheduler-3.1.3配置windows本地开发环境&#xff0c;并在windows本地进行调试和开发 1 准备 1.1 安装mysql 可以指定为windows本地mysql&#xff0c;也可以指定为其他环境mysql&#xff0c;若指定为其他环境mysql则可跳过此步。 我这…...

csv文件完整操作总结

csv文件完整操作总结 1.概述 csv 模块主要用于处理从电子数据表格Excel或数据库中导入到文本文件的数据&#xff0c;通常简称为 comma-separated value &#xff08;CSV&#xff09;格式因为逗号用于分离每条记录的各个字段。 2.读写操作 2.1.测试数据 创建一个test.csv文…...

时间序列预测--基于CNN的股价预测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 时间序列预测有很多方法&#xff0c;如传统的时序建模方法ARIMA、周期因子法、深度学习网络等&#xff0c;本次实验采用最简单的…...

Dubbo与Spring Cloud优缺点分析(文档学习个人理解)

文章目录核心部件1、总体框架1.1 Dubbo 核心部件如下1.2 Spring Cloud 总体架构2、微服务架构核心要素3、通讯协议3.1 Dubbo3.2 Spring Cloud3.3 性能比较4、服务依赖方式4.1 Dubbo4.2 Spring Cloud5、组件运行流程5.1 Dubbo5.2 Dubbo 运行组件5.3 Spring Cloud5.4 Spring Clou…...

单元测试工具——JUnit的使用

⭐️前言⭐️ 本篇文章主要介绍单元测试工具JUnit的使用。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码…...

建昌县城乡规划建设局网站/怎么弄自己的网站

使用XML在SQL Server上创建计算列 在SQL Server数据库中&#xff0c;当你想使用一个数据&#xff0c;而这个数据不保存在表中&#xff0c;计算列很有用。例如&#xff0c;你有一张表&#xff0c;它包括列dollar amounts, wholesale prices和retail prices。你肯定不想在每次查询…...

三亚疫情最新政策/关键词优化是怎么弄的

const iterator表示iterator是const的&#xff0c;即iterator本身不能改变或者说iterator指针不能改变&#xff0c;但是iterator所指向的内容可以改变。比如&#xff0c; const std::vector<int>::iterator iter vec.begin(); *iter 10;是对的&#xff0c;改变iter指…...

怎么做提卡密网站万游/站长工具在线

有些银行推销的信用卡分期或贷款分期还款是这么计算的&#xff1a; A: 贷款额 x: 名义月利率或者所谓的每月手续费 m: 还款期限&#xff0c;单位月 每月应还&#xff1a; (A x*A*m)/m 这个还款额把本金和利息平均在了每个月里&#xff0c; 但是仔细想想是有问题的&#xff1a; …...

漯河网做网站/互联网推广是什么

这是【综合类型第 5 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 文章目录一&#xff1a;安装 Homebrew 失败问题描述二&#xff1a;安装 Homebrew 过程三&#xff1a;验证是否安装成功四&#xff1a;更新 Homebrew五&#xff1a;卸载 Homebrew一&#xff1a;…...

毕业设计代做网站都有哪些/如何建网站

作者&#xff1a; 小马哥 rstevens (rstevens2008hotmail.com) 欢迎转载&#xff0c;未经允许&#xff0c;请勿用于商业目的1. 定义 Packet&#xff1a; 通过网卡收发的报文&#xff0c;包括链路层、网络层、传输层的协议头和携带的数据 Data Buffer&#xff1a;用…...

网站如何做百度才会收录/厦门网站设计公司

原题链接 思路&#xff1a; ASCII码中32代表的就是空格’ 。此题不需要加逗号或者加空格 #include <stdio.h>int main() {printf("%c%c%c%c%c%c%c%c%c%c%c%c\n",73,32,99,97,110,32,100,111,32,105,116,33);return 0; }...