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

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

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


640.png


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


创建形状



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


640.png


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


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


640.png


如图,是 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 块小方块的具体位置。


640.png


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


640.png


ce26a9cd132f630f7fcd8e5128fa05b9.png


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


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


随机



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


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


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


62b66afab264556881d581160355e8f6.png


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


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


bc7c072102d7c8d149cafb3e74731865.png


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


8b0041b37b9a289c6df430828886548a.png


接着来看一下积木逻辑。


fea0610a3253c5ded312266355123013.png


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


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


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

相关文章
|
22天前
|
前端开发 安全 开发者
贪吃蛇游戏创作手记:从构思到优化
使用通义灵码辅助开发贪吃蛇游戏的过程,从游戏框架搭建到代码优化,详细记录了遇到的问题及解决方案。重点讨论了安全性、逻辑Bug、异常处理、边界条件、性能效率和可维护性等方面的优化措施,最终成功完成游戏开发
贪吃蛇游戏创作手记:从构思到优化
|
算法 索引 容器
如何做一个俄罗斯方块游戏(二)
嗨!大家好,我是小蚂蚁。今天我们继续学习如何做一个俄罗斯方块游戏。整个系列教程计划按照这个流程图开展,这也是我制作整个游戏的过程,今天我们就来看一下“随机生成形状”这个模块。想要实现随机的生成形状,首先必须要知道在俄罗斯方块中一共有多少种形状(也就是我们上一节中留下的第二个问题)。
180 0
|
定位技术 开发者
如何做一个俄罗斯方块游戏(一)
从今天开始,我将开启一个新的游戏,并且顺带着会写一个新的系列教程,这个游戏就是人人都知道的——俄罗斯方块。 我一直都在做消除类型的游戏,在所有消除类型的游戏里,俄罗斯方块可以称得上是“鼻祖”了,所以,不论怎样这个系列里都不能少的了它。
147 0
|
小程序 索引
如何做一个泡泡龙游戏(二)
嗨!大家好,我是小蚂蚁。今天我们继续学习制作一个泡泡龙游戏。 绝大部分的泡泡龙游戏都是关卡制的,你玩过了一关,然后接着再玩下一关。每个关卡其实都是预先设计好的,闯关的过程就是游戏将一个一个设计好的关卡呈现给玩家的过程。这些关卡都是怎样设计的呢?游戏又是怎样将这些设计好的关卡呈现出来的呢?欢迎带着这两个疑问开启今天的阅读之旅。
143 0
|
小程序
如何做个泡泡龙游戏(四)
嗨!大家好,我是小蚂蚁。在上一节中,我们学习了泡泡的发射,移动,反弹和停靠。所有的这些都是以计算的方式来实现的,我们没有选择使用物理,碰撞检测这些方式,因为泡泡龙游戏需要一定的精准性,而通过在每一帧进行计算,可以保证游戏的精准。
115 0
|
小程序 流计算
如何做个泡泡龙游戏(三)
嗨!大家好,我是小蚂蚁。今天我们来继续了解在泡泡龙游戏中,泡泡是如何发射,移动,反弹和停靠的。 这一节里会涉及到比较多的数学运算,不过完全不用担心,试着找一张纸和一支笔,画一画,很容易理解的。
130 0
|
小程序
如何做一个泡泡龙游戏(一)
嗨!大家好,我是小蚂蚁。从今天开始,我将会用几篇文章讲一下如何制作一个泡泡龙游戏,泡泡龙是一个传统经典的消除游戏,也是一个经久不衰永不过时的游戏。 这篇文章我们主要来了解一下如何设置泡泡龙游戏的初始布局。
150 0
|
算法 小程序
如何做一个泡泡龙游戏(六)
嗨!大家好,我是小蚂蚁。 上一节中,我们学习了泡泡龙游戏中的查找算法,这个算法可以帮助我们找到所有相邻的相同颜色的泡泡,在查找完泡泡之后,再通过判断满足条件的泡泡的数量是否大于等于 3,来决定是否应该进行消除。
116 0
|
算法 小程序
如何做一个泡泡龙游戏(五)
嗨!大家好,我是小蚂蚁。我们今天来继续学习泡泡龙游戏中最核心的东西:查找匹配算法。 其实这也不算是什么新东西了,如果你有看过我的其它关于消除游戏的教程,应该会知道,消除游戏的查找算法就那么一个,不论何种类型的消除游戏,这个算法的核心是不变的,只不过会根据不同类型的消除稍作调整而已。所以,如果你之前对查找算法还不是很了解的话,那么就尝试跟随着这篇教程把它彻底搞懂吧!
118 0
|
开发者
不会美术如何做出好看的游戏
我不会美术怎么做游戏嘞?这也是一个经常有人问的问题,尤其是对于很多的技术而言,想要自己做个游戏,却苦于自己搞不定美术,上网找素材,东拼西凑看起来缺乏整体性,找人画的话价格昂贵,找美术合作的话,又不太容易找的到合适的。 那对于不会美术的人来讲,是不是就做不出游戏了?或者说就做不出好看的游戏了?当然不是。
137 0
下一篇
无影云桌面