基于C语言的俄罗斯方块的设计与实现 下载本文

龙源期刊网 http://www.qikan.com.cn

基于C语言的俄罗斯方块的设计与实现

作者:孟芸 朱肖安 罗刘敏 徐音 来源:《硅谷》2014年第23期

摘 要 介绍利用C语言开发俄罗斯方块游戏的设计和实现方法,对于编写类似的游戏程序具有指导和借鉴作用。 关键词 C;俄罗斯方块

中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2014)23-0019-02

俄罗斯方块游戏是一款家喻户晓、风靡世界、经久不衰的游戏,本文将采用C语言设计开发俄罗斯方块游戏,设计工具采用VC++6.0。 1 设计思想 1)图形的设计。

俄罗斯方块中有7种形状的方块,由于方块有旋转变化的需求,所以需要用到三维数组解决,第一维表示旋转变化形状的个数。

在俄罗斯方块设计中,需要定义游戏的边界,定义一个地图二维数组map[y][x],在数组中值的变化会有相对应结果。从这个二维数组中可以看出左边边界是map[0][x]—map[max(y)][x],右边边界是map[0][x]—map[max(y)][x]。 2)控制函数的设计。

首先需要考虑控制的功能有移动功能、加速功能、形状变化功能、暂停功能、退出功能。如图1用例图所示。 3)关键技术。

在功能确定之后,就要把其转化为算法,例如:方块如何下落,如何判断方块是否出界,方块下落到何时为止,下落中不可以和之前方块重叠,如何让方块落到之前下落的方块上停下,方块平移如何实现,方块旋转如何实现,旋转中空间问题,这些都构成了俄罗斯方块的关键技术。 ①方块下落。

龙源期刊网 http://www.qikan.com.cn

方块下落是很容易做到的,但是在变化及下落过程中其他特性,例如在移动过程中不能超过边界、不能和已经存在的方块重叠、缝隙填补这些都是要考虑的,不能把图形看成一个个孤立的方块构成,而应看成一个整体,所以图形的组要使用结构体实现。结构体定义如下: 结构体中有三个成员,其中x,y代表坐标,shape代表图形的基本信息。所谓图形基本信息就是在图形库里提取出来的图形信息,同时也就明确了所提取出来信息的形状、位置。图形的位置信息需要找一个参考点也就是基准点,所有的图形参考点是相同的,由于图形库中的图形采用的3*3矩阵存储,所以选择中间点为参考点。假设结构体变量为firstShape[n][i][j],则参考点确定为firstShape[n][1][1],其中这个点的二维坐标x=firstShape[n][1][1].x,y=firstShape[n][1][1].y则其他位置的信息如表1所示。

当firstShape[n][1][1].x以及firstShape[n][1][1].y的值确定了,即参考点的坐标位置确定了,其他点的位置坐标也就确定了。在改变一个形状的位置只需要把参考点的坐标确定了,用循环把四周的点位置信息记录赋值到对应的结构体数组中。

用循环判断,判断出相应的形状。如果判断firstShape[n][i][j].shape的值为1,则gotoxy(firstShape[n][i][j].x,firstShape[n][i][j].y),并打印出相应的形状,在移动过程中,位置是时刻发生变化的,而形状是不变的。当需要左右移动时,参考点的位置信息作出相应更改,但是当旋转图形时,参考点的位置信息以及形状都会作出改变,当方块移动过程中,在相应位置信息打印出图形,这就实现了方块的移动。 ②方块出界判断。

解决方块边界问题,就需要搞清两个问题。第一,左右边界的x值必须和初始方块位置的x保持一致;第二,防止过界及方块不能和之前落下来的方块重合,也就是说当你向左边移动方块,可是左边是边界或者是上一个落下的形状,这时方块就不能向左移动。

由于在水平方向上设置一个单位的长度为2个像素,所以方块在初始位置的x坐标为单数,则方块只能在单身上移动,反之只能在双数上移动。当方块落下后相应位置把map[i][j]的值赋予2,这样一个下落完毕的方块左右边也相当于一个小边界,当位置信息确认时,判断四周的位置信息,地图的相应位置是否为2,如果是,则说明该点已经在边界上了,需要做出相应的操作了,如果此时是在左边界上,玩家继续按向左移动说明方块左边过边界了,需要重新调整位置信息,即x=x+L,firstShape[n][1][1].x=x;当参考点的位置信息改变后,则四周的位置信息也要做出相应修改,这样就解决了边界问题,同时也解决了方块重叠问题。 ③消除重影。

俄罗斯方块在移动过程中会发生重影现象,重影现象生成是由于显示屏余辉效应,消除重影技术就是先把原来的形状擦除,然后再打印出新的图形或者延长图形显示间隔时间,本次俄罗斯方块采用前者进行重影消除技术。

龙源期刊网 http://www.qikan.com.cn

④下落终点判断。

俄罗斯方块还存在填补凹槽问题,在存储图形信息是以数组的形式保存的,以利于对每一个数组元素进行判断。

俄罗斯方块下落过程中何时到达终点,首先根据参考点以及参考点周围的位置信息做出判断,在判断时当map中存储的值为1说明该位置有图像块,继续判断该位置下面的map值是否为2,如果是,则意味着到达边界,即刻结束该方块的下落。方块下落完成,把相应的map值进行修改。如图2下落终点判断流程图所示。 ⑤方块变换。

图形变换有两种方式,一种是图形不动,坐标系变动,称之为坐标系模式变换;另一种是坐标系不动,图形改变,称之为图形模式变换。方块变换采用的是后者,旋转变换就是基本几何变换形式之一,在算法中需要用到图形库中对图形进行存储过程中的第一维数字,它代表该旋转后形状的个数,在设计过程中,空格键控制旋转方法,图形的旋转形状采用循环方式进行,同时对参考点做出修改,当图形下落完毕,新的图形产生把控制图形变化的值设为0。 方块旋转空间问题也是需要解决的一个关键问题,当方块一边或者两边有边界,方块下落时由于本身形状问题,导致在旋转变换过程中产生出界现象,又如当该方块一旦落入到狭小空间中,由于没有足够空间,形状旋转就无法进行,需要在旋转之前进行判断操作,当确定好参考点后,对周围的图形信息赋予相应信息,判断map中相对应的信息是否等于2,如果等于2,则说明该列有边界,没有足够空间进行形状旋转。 ⑥消行的操作。

消行操作可以一次消除一行,或者消除多行,消除多行和消除单行的原理一样,首先要搞清楚地图数组即map中左右边界之内的可以装下几个图形。这个计算为右边边界的横轴坐标减去左边边界横轴坐标,然后除于2,其最后的值为n。在地图信息map中倒数第二行开始向前一行一行的判断,若有一行中地图信息的值等于2的个数一共有n个,则说明该行已经全部装满图形,可以把改行消去,在算法中,当这一行的地图信息值等于2的有n个时,就要跳出循环,并记下这个行数,将该行的值替换成后一行的值,这样循环到行数为1。 ⑦暂停以及死亡的操作。

在游戏设计过程中,要考虑玩家的需求,所以暂停设置是非常有必要的。首先设置一个变量的值为0,如果按下暂停键则让这个变量加1,再按一下暂停键后此值继续加1,判断该变量如果能被2除取余为0,则执行代码,意味暂停结束,否则不会执行代码。

正在下落的方块的参考位置正是起始位置代表未有空间让方块下落,说明游戏结束,在此过程中要时时刻刻判断地图信息中的第一行若有一个值为2,则代表游戏结束,在结束时候,