当前位置:网站首页>消除游戏中宝石下落的原理和实现
消除游戏中宝石下落的原理和实现
2022-08-08 14:55:00 【51CTO】
本文首发于微信公众号【小蚂蚁教你做游戏】,欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。
嗨!大家好,我是小蚂蚁。
在消除游戏中,发生消除之后,会留下空白位置。此时,如果上方有其它的宝石,那这些宝石就会下落填充空白位置。今天我们就来了解一下宝石下落的方法以及实现。
下落原理
如图,用线画出来的红色宝石是满足消除条件的,它们会被消除,产生空白位置。消除过后,看起来是下面这样。
来观察一下这些空白,在第一列中,有一个空白,将上方的黄色宝石和蓝色宝石同时向下移动一个位置,可以完成填充;第二列中,有连续的两个空白,将上方的黄色宝石和绿色宝石同时向下移动两个位置,可以完成填充;第三列中,有两个不连续的空白,需要将黄色的宝石向下移动一个位置,将绿色的宝石向下移动两个位置,才能完成填充。
在寻找方法的时候,通常我们首先会通过观察来寻找规律,一旦找到了规律,就能很容易找出解决方案。但是对于“宝石下落”来讲,貌似是没有明显的规律的,一列中有几个空白位置?这些空白位置是连续的?还是不连续的?这些貌似都没有规律。
以空白位置为关注点的话,找不到明显的规律。那我们就试着切换一下关注点,关注消除后剩余的宝石。
第一列有两个宝石,第二列两个宝石,第三列有两个宝石......貌似是有点儿规律了。忽略掉空白位置,我们从每一列的下方开始,向上寻找宝石,每找到一个宝石就为它设置一个编号,宝石的编号依次增加。
发现规律了吗?宝石的编号就是它要下落到的位置的行号。
获取表格中的一列,然后从下向上依次检查每个格子,空白位置跳过,如果格子里有宝石,就为这个宝石设置一个编号,编号依次增加 1,这样检查完一列之后,下落宝石的目标位置就知道了。接着,像这样检查表格中的每一列,当所有的剩余宝石都编号完成后,再统一进行下落处理。
这个就是宝石下落的实现原理了。
下落实现
首先创建 3 个列表,一个用于为宝石设置编号,一个用于记录哪些宝石需要下落,一个用于记录下落宝石的下落目标位置。
接着,来看一下下落的积木逻辑。
这里有一点儿可能比较难理解,就是如何使用一个列表来记录宝石的编号。
如图,以第一列为例,从下向上依次查看每一个格子,第一个格子是空白位置,跳过。第二个格子有宝石,将第二个格子的宝石的索引加入到列表中(列表的第一个位置),接着第三个格子有宝石,将第三个格子的宝石的索引加入到列表中(列表的第二个位置)。检查完一列后,在最终的列表中,项的内容是要下落方块的索引,位于第几项,就是下落方块的目标位置行号。
最后,再来看一下宝石上的下落处理积木。
收到通知后,首先判断一下自己是否需要下落,如果需要的话,更新的自己的行号和索引,更新网格数据表格中的数据,最后将自己向下移动到新位置上。
最后,来看一下下落的效果。
以上就是下落的原理和方法了,基本上适用于所有需要进行下落处理的消除游戏。
在寻找解决方法时,我们首先关注的是空白位置,发现空白位置找不到规律后,我们转换了一下角度,关注剩余的宝石,最后找到了解决方案。
这或许能给我们带来一点儿启发。在寻找解决方案的时候,如果一个方向行不通,就不妨换个方向,很可能在转换方向之后,问题就变得清晰明了容易解决了。
欢迎关注小蚂蚁的微信公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。
边栏推荐
- Make mistakes small yards artisan study room 】 【 the ladder of the progress of children
- 【服务器数据恢复】Ext4文件系统fsck后mount不上并报错的数据修复案例
- 兆骑科创赛事服务平台对接,海内外高层次人才引进
- PHP —— 用 ThinkPHP5.0 实现微信小程序登陆
- 什么是低代码开发?大家都真的看好低代码开发吗?
- 基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法
- 基于接口而非实现编程
- 增效降本开源节流,2022年技术趋势前瞻(异步编程/容器技术)
- CS231n: 6 training neural network (2)
- Mysql的分布式事务原理理解
猜你喜欢
一文读懂字节跳动“埋点验证平台”
Shell Three Musketeers-----sed command
浏览器跨域方案,适用于本地调试接口(超简单)
JS-Bom-while(计算闰年)
See how three years of CRUD programmers solve database deadlocks
Tungsten Fabric SDN — OpenStack 与 Kubernetes 异构集群统一 SDN 方案
logistic regression model - based on R
如何使用 Eolink 实现 API 文档自动生成
EasyExcel导入校验必填项不能为空
JS-BOM-factorial calculation
随机推荐
面试官:Redis 大 key 要如何处理?
一万块钱能做一手尿素期货吗?尿素期货怎么做才安全?
WPF 常用布局方式
幂等性~~
CS231n: 6 training neural network (2)
华为云会议的优势【华为云至简致远】
浏览器跨域方案,适用于本地调试接口(超简单)
基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法
“科林明伦杯”哈尔滨理工大学暑假训练赛 B吃雪糕 (异或思维题)(补题)
深度学习-神经网络原理1
synchronized修饰类的注意事项
【LeetCode】761. 特殊的二进制序列
领域驱动设计系列贫血模型和充血模型
Talking about the underlying data structure of Redis
把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
Elegantly detect and update web applications in real time
[Small Coder Study Room] ABC179-C: It is a miracle that the code does not count down
电商秒杀系统架构设计
Redis RDB分析系统
万字长文:常见的软件测试面试题(附答案)