vlambda博客
学习文章列表

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       俄罗斯方块的核心玩法非常简单,所以制作起来并不是很复杂,我准备先用2篇文字的篇幅详细讲解一下俄罗斯方块的制作方法。

       今天咱们算是第一篇,主要讲解俄罗斯方块中如何定义方块,以及如何实现方块的移动、旋转、下落等操作。

1. 需求分析

       俄罗斯方块中的基本逻辑非常简单,不过在介绍之前,我们先确定一下名词,防止出现词不达意的现象。


       这种方块,是构成容器的基本单位,我们称之为小方块。

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       由四个小方块组成,用来填充容器的东西,我们叫做大方块。

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       用来存放大方块的地方,我们叫做容器。

       定义了这三种东西之后,我们就可以这样描述俄罗斯方块这个游戏了。俄罗斯方块主要由一个存放正方形小方块的虚拟容器和实时下落的7种大方块构成。

       容器的宽是 10 列,高是 20 行,行高和列宽是相等的,所以容器可以看作是 200 个正方形小方块平铺的结果。

       每个实时下落的大方块都是由 4个正方形小方块组成,共 7 种固定样式,每种方块都可以旋转,所以理论上最多有 28 种样式,但其中有一些大方块在旋转的时候样式不会发生变化。

       7 种大方块按照形象可以由 7种字母替代,它们是:S、Z、L、J、I、O、T。

       这些大方块在下落到容器最底部或碰撞到其它容器中的小方块时会被固定在容器中,然后容器上方会重新产生一个随机的大方块,重复原来的下落流程。

       当容器中出现满行的时候,整行会被消除,该行上面的所有小方块都会依次掉落。


2. 大方块的定义

       俄罗斯方块中虽然基本的单位是小方块,但是所有操作的对象都是大方块,所以这里直接定义大方块的结构类型。

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       在定义大方块之前,我们需要先定义两个结构,分别是大方块的类型和大方块的旋转状态。

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       使用上面两个类型,就可以确定当前大方块的样式。除了样式之外,因为大方块会按照固定的速度移动,所以这里需要定义大方块的位置信息,加上前面两个成员,大方块可定义如下:

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       这里之所以没有定义大方块的下落速度是因为所有的大方块下落速度都是一样的,因此不需要在每个大方块内部都定义一个变量,只需要在外部定义一个速度变量即可。

       确认了大方块的结构,我们还有一个问题需要解决,就是如何获取大方块的具体形状。

       虽然大方块里面已经定义了类型和状态,但是并没有保存当前方块的形状,为了解决这个问题,我们可以定义一个全局的静态数组,数组的每一项代表一种方块的形状,算上重复的,一共可存放 28 种形状。

static unsigned short gBlockList[BT_NUM][BS_NUM];

       注意这里,数组的每一项用了一个 unsigned short 类型表示。

       因为大方块是由 4 个小方块组成,所以每个大方块都可以用一个 4 * 4 的二维数组来表示。

       因为二维数组的每一项都只有两种状态,所以可以进一步变形,每一项用一个比特位,这样算下来,16 位比特就可以描述一个大方块的形状,而 16 位比特对应 C语言中的数据类型,正好是 unsigned short。

       虽然确认了方案,但是我们还需要确认一个表达规则,就是 16 位比特串低四位是表示大方块的第一行,还是表示最后一行,又或者表示左边的列,还是右边的列。

       方法很多,只需要取一个认为方便的就好,这里我是这样定义的:

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       即低四位表示第一行。最终我们可以求出 28 个形状对应的每一个值:

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       以后如果在程序中如果需要获取当前大方块的形状,只需要使用类似下面的语句:

gBlockList[i][j]


3. 大方块的操作

       确定了大方块的定义,接下来就是对大方的操作实现。首先是初始化操作:

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       接着就是移动操作,因为我们使用两个变量来确定大方块的位置,所以代码逻辑非常简单:

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       除了移动,大方块还有一个常用旋转操作,因为前面我们已经使用打表法定义了所有方块的旋转状态,这里直接获取即可:

【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

       除了上面这些操作,其实还有碰撞检测以及渲染等操作。我们将在下一章节将为大家详细阐述!

       如果你也想学编程,可以来我的C语言/C++编程学习基地【Q群:1083154082】!

       还有免费的(源码,零基础教程,项目实战教学视频)!   

       涉及:游戏开发、课程设计、常用软件开发、编程基础知识、黑客等等...