如何做一个俄罗斯方块游戏(二)

简介: 嗨!大家好,我是小蚂蚁。今天我们继续学习如何做一个俄罗斯方块游戏。整个系列教程计划按照这个流程图开展,这也是我制作整个游戏的过程,今天我们就来看一下“随机生成形状”这个模块。想要实现随机的生成形状,首先必须要知道在俄罗斯方块中一共有多少种形状(也就是我们上一节中留下的第二个问题)。

嗨!大家好,我是小蚂蚁。今天我们继续学习如何做一个俄罗斯方块游戏。



整个系列教程计划按照这个流程图开展,这也是我制作整个游戏的过程,今天我们就来看一下“随机生成形状”这个模块。


创建形状


想要实现随机的生成形状,首先必须要知道在俄罗斯方块中一共有多少种形状(也就是我们上一节中留下的第二个问题)。



如图,就是俄罗斯方块中所有的 7 个形状了,试着观察一下这七个形状有一个共同点。那就是每个形状都是由 4 个小方块组成,这是一个很重要的特征,这就意味着你只需要 4 个小方块,就可以通过调整摆放位置,构建出游戏中的所有形状了。


对于游戏中的形状来说,除了需要知道都有哪些之外,我们还需要另外一些信息,就是每一个形状有多少“状态”可以变换。



如图,是 7 种形状的变换,形状 1~3 分别有 4 个状态,形状 4~6 分别有 2 个状态,形状 7 只有 1 个状态。

这里我们把形状的每一个不同的旋转位置叫做一个“状态”,以第 1 个形状为例,它一共有 4 个状态,第 1 个状态是“T”型,第 2 个状态就是第 1 个状态以顺时针旋转 90 度,第 3 个状态是第 2 个状态以顺时针旋转 90 度,第 4 个状态是第 3 个状态以顺时针旋转 90 度。第 4 个状态再以顺时针旋转 90 度,就回到了第 1 个状态。整个状态切换是一个首尾相接的循环过程,每一个状态都是以上一个状态为基础,顺时针旋转 90 度。

你可以继续观察一下剩余的其他形状,看看每一个形状的状态是否都满足上述的条件。


在确定了形状之后,我们如何在游戏中把它们构建出来呢?答案其实很简单,直接拼出来就好了。


以第 1 个形状为例,假设每一个小方块的大小都是 50x50,以形状的中心为坐标轴的中心,那么很容易就可以计算出 4 块小方块的具体位置。



在得到了 4 个小方块的位置之后,我们可以在微信小游戏制作工具中将 4 个小正方形(50x50)打包到一个容器中,然后分别为它们设置到对应的位置上,这样一个形状就创建好了。




这里注意一下,当我们将 4 个小方块打包成容器“形状1”之后,这个容器整体是一个矩形,中点位于矩形的中心,这个中心也表示容器“形状1”的位置。例如,将“形状1”容器设置到(0,0)的位置,实际上是容器的中心点位于 (0,0) 的位置(这个在后续计算中需要用到,这里先了解一下)。


剩余其它的几个形状也如此,可以先在纸上画一下,计算出每个小方块的位置,然后再在制作工具中创建出对应的形状。


随机


形状创建好了,接着我们来看一下如何进行随机。目前对于俄罗斯方块的随机有很多种方式,这里我们只说一下其中的两种,一种是最古老的随机,另一种是用的比较多的叫做“Bag7”的随机。


最古老的随机其实就是每次生成的方块都是从 1~7 个形状中随机的生成一个。由于每次生成都是随机的,所以有可能出现连续多次生成同一种形状,或者连续很多次都不生成某一种形状的情况,这些情况会导致游戏难度的增加。


这种随机很简单,我们只需要从 1~7 中,生成一个随机数,然后根据这个随机数生成指定的形状即可。



后来,为了降低游戏的难度,普遍采用了叫做“Bag7”的随机方法。就是生成一个由 1~7 的 7 个数字随机排序组成的包(列表或者数组),然后按照这个包中的排序生成形状,生成 7 个形状后,就再创建一个这样的包,然后再继续。


这种算法保证了同一个形状最多只能连续出现 2 次(前一个包的最后一个数,跟后一个包的第一个数相同)。同一个形状最多只能间隔 12 次不出现(前一个包的第一个数,跟后一个包的最后一个数相同)。



接着,我们来看一下“Bag7”随机算法的实现。首先,我们创建一个叫做“Bag7”的列表,这个列表中包含了 1~7 的 7 个数字。



接着来看一下积木逻辑。



微信小游戏制作工具为我们提供了一个“将列表随机打乱”的积木块,我们可以直接利用它来得到打乱了顺序的列表(Bag7)。每当生成一个形状后,就将变量“Bag7索引”增加 1,直到这个列表中的所有项遍历完毕,然后再继续生成下一个新的“Bag7"。


好了,今天的内容就到这里了,稍微总结一下:我们了解了俄罗斯方块中的 7 个形状,以及每个形状所包含的不同状态,最后了解了两种不同的随机算法


是不是有种“哇哦~”的感觉?这么简单的一个俄罗斯方块游戏竟然能够包含这么多的东西。所以说即使是一个小游戏,只要你用心研究,里面也包含着很多可以学到的东西。更何况,我们的这个小游戏才刚刚开始而已。





我是会做游戏也会教你做游戏的小蚂蚁,想学习做游戏的话,关注我的公众号就对啦!

相关文章
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
AI 十大论文精讲(三):RLHF 范式奠基 ——InstructGPT 如何让大模型 “听懂人话”
本文解读AI十大核心论文之二——《Training Language Models to Follow Instructions with Human Feedback》。该论文提出RLHF框架,通过“监督微调-奖励建模-强化学习”三步法,首次实现大模型与人类意图的有效对齐,推动GPT-3进化为更安全、可信的InstructGPT,奠定ChatGPT等后续模型的技术基石,开启大模型“从博学到好用”的新时代。
1132 152
|
存储 Linux Docker
Docker 更新版本
Docker 更新版本原来版本 1.10 更新后的版本 19.03.1 更新 Docker 版本需要注意的问题: 注意系统是否支持新版本的储存驱动。 19.03.01 版本默认使用的储存驱动是 overlay2。
3301 0
|
11月前
|
API 监控 双11
淘宝/天猫获取商品历史价格信息 API 返回值的应用
本内容介绍了一款基于API的工具的核心功能,涵盖消费者决策支持、商家运营优化、市场趋势分析及数据服务拓展四大方面。消费者可借助历史价格曲线判断价格合理性、选择最佳购买时机;商家可通过竞品数据分析优化定价策略与促销活动;第三方平台能监测价格波动、跟踪竞品动态以洞察市场趋势。此外,工具还支持比价工具开发与价格预警服务,为用户和企业带来全方位的价格智能解决方案。
|
机器学习/深度学习 数据采集 算法
R语言中的机器学习库:caret与mlr的深度解析
【9月更文挑战第2天】Caret和mlr是R语言中两个非常重要的机器学习库,它们在数据预处理、模型构建、调优和评估等方面提供了丰富的功能。Caret以其易用性和集成性著称,适合初学者和快速原型开发;而mlr则以其全面性和可扩展性见长,适合处理复杂的机器学习项目。在实际应用中,用户可以根据具体需求和项目特点选择合适的库进行开发。无论是学术研究、商业智能还是教育场景,这两个库都能为数据科学家和机器学习爱好者提供强大的支持。
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
3258 1
|
9月前
|
API 数据安全/隐私保护 Python
贴吧私信自动群发神器,百度贴吧群发批量私信脚本插件,python框架分享
这个贴吧私信群发工具包含三个主要文件:主程序、配置文件和入口文件。主程序实现了登录
|
人工智能 自然语言处理 语音技术
《AI赋能鸿蒙Next:为特殊人群打造无障碍交互新体验》
在科技飞速发展的今天,鸿蒙Next设备借助人工智能技术,显著提升了特殊人群的无障碍交互体验。针对视障人群,提供精准屏幕朗读、视觉辅助智能问答和导航避障辅助;面向听障人群,实现AI声音修复、实时字幕与语音转文字;助力语言障碍者和老年人群体,通过AI优化交流与操作体验。开发者可利用鸿蒙Next的AI能力,深入了解用户需求,进行测试与优化,共同创造友好、便捷的无障碍环境,让特殊人群更好地融入数字社会,享受科技带来的美好生活。
713 8
|
存储 缓存 前端开发
PWA 如何实现离线功能
PWA(渐进式Web应用)通过Service Worker技术实现离线功能。Service Worker作为浏览器和网络之间的代理,可以缓存网页资源,在用户离线时提供缓存内容,确保应用正常运行。
|
消息中间件 关系型数据库 MySQL
SpringBoot-Kafka(生产者事务、手动提交offset、定时消费、消息转发、过滤消息内容、自定义分区器、提高吞吐量)
SpringBoot-Kafka(生产者事务、手动提交offset、定时消费、消息转发、过滤消息内容、自定义分区器、提高吞吐量)
SpringBoot-Kafka(生产者事务、手动提交offset、定时消费、消息转发、过滤消息内容、自定义分区器、提高吞吐量)
|
前端开发 Java C#
C#程序启动后乱码(通过idea启动)
C#程序启动后乱码(通过idea启动)
305 0