首页 > 范文大全 > 正文

基于枚举算法设计“俄罗斯方块”游戏

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于枚举算法设计“俄罗斯方块”游戏范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要: 该文绕开了晦涩难懂、比较复杂的“矩阵算法”,提出了另一种“枚举算法”来实现这个经典游戏。“枚举算法”没有复杂的数学理论,避免了在程序中大量使用矩阵运算公式,设计思路清晰、明了,非常适合游戏设计的初学者理解和实现,最后用Flash Active Script设计实现“俄罗斯方块游戏

关键词:俄罗斯方块游戏;基本型方块;旋转型方块;枚举;算法

中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)14-3710-03

Designing Russian Grid Game by Using Enumerative Algorithm

QIU Ju, TANG Kai-jun, XU Li-xi, NIU Xiao-mei

(No.2 Public Course Teaching and Research Department, Zigong Health School, Zigong Renji Medical Center of Sichuan Province, Zigong 643000, China)

Abstract: This thesis keeps away from the elusive and complicated Matrix Algorithm and put forward the Enumerative Algorithm to realize the classical Russian Grid Game. The Enumerative Algorithm without complicated mathematical theory can avert large number of matrix operational formulas so that the consideration of design is clear and obvious. This is a suitable way for the beginners of computer game designers to understand, design and realize the Russian Grid Game by using Flash Active Script.

Key words: the Russian Grid Game; basic-form grid; rotating grid; enumerate; algorithm

1 “枚举算法”概述

本文则提出了所谓枚举算法,就是直接枚举出游戏中方块的基本形状和它们的旋转形状,然后控制每一种不同形状的方块在游戏中的产生、移动、旋转、落下、清除填满行等游戏过程。

1.1 方块基本形状和种类

根据分析,“俄罗斯方块游戏”中的方块,共有七种基本形状,它们分别是“I型”、“L型”、“反L型”、“Z型”、“反Z型”、“口型”、“T型”,如图1。

1.2 方块的旋转形状

游戏过程中,每一种基本方块都要做旋转控制,于是就产生了旋转后的方块形状,本文将其称为“旋转型”。

基本型中的“I型”、只有一种旋转型,即由竖直旋转90°后成为水平。因此,基本型加上一种旋转型,共有两种形状。

基本型中的“L型”和“反L型”有三种旋转型,将它按顺时针每旋转一个90°就产生一种旋转型,它可以旋转三次,得到三种不同的旋转型,因此,它的三种旋转型加上其基本型,“L型”和“反L型”方块分别有四种形状。

基本型中的“Z型”和“反Z型”可以顺时针旋转一次90°,加上他们的基本型分别有两种形状。

基本型中的“T型”有三种旋转型,将他按顺时针旋转一个90°就产生一种旋转型,它可以旋转三次,得到三种不同的旋转型,因此,它的三种旋转型加上其基本型,“T型”方块共有四种形状。

基本型中的“口型”方块没有旋转型,在游戏中只有一种形状。

经前面的分析得知,七种基本型方块,因旋转产生了不同的旋转型,这些旋转型加上他们的基本型,整个游戏中,共有19种不同的方块形状。

2 基本型方块的构成和控制

每一种基本型方块都由4个正方形小方块构成,利用小方块不同摆的放位置,产生19种旋转型。利用随机函数在一个预览窗中提前展示形状供用户参考,然后将展示的形状复制到游戏主窗口中进行摆放,在游戏主窗口中用户就可以使用键盘的方向键来控制方块的运动。然后对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用“向下光标键”加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。

2.1 基本型方块的够成

所谓“基本型方块”是指每新产生的,没有经过旋转的方块形状(如图1),基本型方块是有4个正方形的小方块拼接而成。在程序实现过程中,可以使用4个正方形控件来构成每一种基本型方块。

2.2 主游戏界面与数据结构设计

为了能实现控制方块的旋转、平移、下落等操作。需要构造一个游戏主窗口和一个二维矩阵数据结构。

2.2.1 主游戏界面

在主窗口中按照9X15,将小方块(控件)进行排列,每一个控件的Visible属性设置成“False――不可见”,表示在开始游戏之前,主界面中没有任何方块。左上角作为坐标起始点,为了在程序中,对主窗口中的每一个小方块(正方形控件)进行遍历,用数字字符给控件按照一定的规则进行命名如图2。

正方形控件的名称=行坐标*每行控件的数量+列坐标=行坐标*9+列坐标

2.2.2 构造一个大小为9X15的二维数组

用来保存对应主界面中的每一个方块位置是否被填充,已经被填充的为“1”,未填入的为“0”。通过这样的方法,即可简单地将数据结构映射到由小方块(正方形控件)组成的图形界面上。

2.2.3 小方块的初始化显示

在游戏开始或者前一个方块已经不能继续下落的时候,需要在主界面的第一行(行坐标为0)、第五列(列坐标为4)的位置显示某一个基本型方块。这个功能由计算机产生一个1~7随机数,表示7中基本型方块的某一种,然后枚举出基本型方块初始时,在主界面中的位置,并把主界面中,对应的小方块(正方形控件)的Visible的值修改成“True(可见)”。例如:随机数为2,对应“L型”方块,它对应坐标为(0,4),(1,4),(2,4),(2,5),根据控件命名规则,可以计算出主界面中需要修改的控件名称分别为“4”、“13”、“22”、“23”。如图3。

小方块初始化算法:

Function Init(int Shape){

Switch(Shape)

Case 1:

设置主界面中相对应的控件Visible=true;

产生1型方块;

Break

Case 2;

设置主界面中相对应的控件Visible=true;

产生2型方块;

Break

Case 3:

设置主界面中相对应的控件Visible=true;

产生3型方块;

Break

Case 4:

设置主界面中相对应的控件Visible=true;

产生4型方块;

Break

Case 5:

设置主界面中相对应的控件Visible=true;

产生5型方块;

Break

Case 6:

设置主界面中相对应的控件Visible=true;

产生6型方块;

Break

Case 7:

设置主界面中相对应的控件Visible值=true;

产生7型方块;

Break

Return;

}

3 方块的下移、平移、旋转

基本型方块初始化产生后,还需要用变量保存它的形状代码shape、旋转型rot和在主界面中的起始行坐标row和列坐标column,例如图3中的“L型”方块:

shape=2;rot=1(旋转三个90°,分别为2,3,4);

row=0;column=4;

3.1 方块的下移

1) 下移的合法性判断:方块下移的前提是,方块没有到达最底部,这可以通过行坐标row

2) 下移的实现:方块下移也是通过修改主界面上的小方块(控件)的Visible属性来实现的。例如图3中的“L型”方块下移一格,需要修改控件:

控件4.visible=false;控件23.visible=false;

控件31.visible=true;控件32.visible=true;如图4。

3.2 方块平移

方块的平移包括左移和右移两种情况,无论那种情况都要首先进行合法性判断。

1) 合法判断,平移的合法性判断比较简单,只需判断它旁边相邻位置是否被填充为,可以通过对映射二维数组中相对应的单元是否为“1”来实现,同时也要判断是否已经到了左右边界。

2) 平移实现,方块平移也是通过修改主界面上的小方块(控件)的Visible属性来实现的。例如图4中的方块左移一格,需要将“13”、“22”、“32”控件的visible=false;“12”、“21”、“30”控件的visible=true即可。

3.3 方块旋转

1) 合法性判断,在游戏中,方块做顺时针旋转,每次旋转90°,方块旋转前的合法性检查稍微要复杂一些,主要涉及到它旋转所要经过的位置不能有已经填充的方块。

例如图4中的“L型”方块旋转前(顺时针90°),必须检查“21”、“30”、“14”、“23”处没有被填充方块,这个检查也是通过对二维数组中相对应的单元是否为“1”。来判断。

2) 旋转的实现,当合法性检查后,就可以通过修改相关位置的控件visible值来实现旋转。方法和平移、下落一样。

3.4 算法实现

从前述所知,游戏中7种基本型方块加上他们的旋转型方块总共有19种类型,程序算法只需要根据他们的形状代码shape、旋转型rot,在主界面中的行坐标row和列坐标column,每做一次平移、下落、旋转,要跟踪修改他的shape、rot、row,column等值,为下一次操作提供枚举依据,然后用代码对每一种情况进行处理即可。

由于篇幅有限,这儿没有给出全部源代码,有兴趣的读者可以与本文作者联系索取完全编译通过的源代码

参考文献:

[1] 唐凯军,汤惠莉.80例上手VB6编程[M].济南:山东电子音像出版社,2004.

[2] 韦纲.FlashMX2004多媒体课件制作教程[M].北京:海洋出版社,2005.

[3] 王燕.面向对象的理论与C++实践[M].北京:清华大学出版社,1997.