数据结构课程设计俄罗斯方块(样本)
- 格式:doc
- 大小:104.00 KB
- 文档页数:10
《软件基础》大作业项目名称:“俄罗斯方块”游戏班级:测控21小组成员:周海明(02013030)杨勇(02013028)杨光(02013026)完成时间:2004.12.10指导教师:***目录一.项目介绍1.1 项目简介1.2 游戏介绍1.2.1详细规则、胜负判定方法1.2.2游戏操作方法1.3 开发工具1.4 软件运行环境1.5 项目任务书二.项目设计2.1 总体方案2.2 详细设计2.2.1方块模块设计2.2.2线程模块设计2.2.3主界面模块设计2.3 模块设计小结三.工程进度四.项目测试分析五.制作安装软件六.项目总结与体会七.参考书目一.项目介绍1.1项目简介本项目是为了制作一个“俄罗斯方块”游戏。
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。
这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。
相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。
制作此软件是为了使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。
1.2游戏介绍1.2.1详细规则、胜负判定方法用户分别移动和旋转自己窗口内落下的方块,方块在一行堆满后就可以消掉,当方块先堆积至窗口顶端,即告负。
1.2.2游戏操作方法1. 按游戏界面的"开始"菜单来开始游戏2. 键盘操作:"←"左移一格;"→"右移一格;"↑"旋转方块;"↓"方块丢下(方块下落加速)3. "计分牌"显示的内容:"得分"为本局的分数,计分标准为下落一个块10分,一次消1行10分、2行30分、3行60分、4行100分。
该游戏共有4个等级,一级、二级、三级、四级最高分分别为800,1500,2500,4000。
"级数"为游戏当前等级,当分数达到当前等级的最高值,等级就会提升、速度加快。
1.3 开发工具JDK1.4.2+JCreator1.4 软件运行环境此软件由Java开发完成,可以在任何装有JRE(Java运行环境)的机器上运行。
1.5 项目任务书开发小组成员及任务分工:周海明(组长):协调各成员之间的任务,完成所有程序的编写及调试工作;杨勇:方块模块设计,主界面模块设计及其程序算法设计;杨光:线程模块设计及撰写项目文档;二.项目设计2.1 总体方案首先,要想该游戏易于操作,则需要一个良好的界面,能够接受鼠标和键盘操作等;其次,由于游戏涉及到许多不同种类的方块,所以要构造这些方块;再者,在游戏过程中,必须要处理好方块的一些事件,例如自动下落,消除满行等。
由java的面向对象和多线程机制,很容易实现这些。
由上分析可知,该游戏程序大体框架主要分为三大模块:1.通过继承Frame类派生出MainFrame类来实现自己的主界面。
2.创建方块Block类来构造各种各样的方块。
3.通过实现Runnable接口来创建一个新的线程,用来处理方块事件和得分级数等。
2.2详细设计2.2.1 方块模块设计此模块主要完成实现各种方块。
本游戏总共有7种方块,而每种方块还可以进行旋转。
每种方块每行每列最多只有4个小方块。
这7种方块如下图1所示。
(1)(2)(3)(4)(5)(6)(7)图1.算法设计:用二维数组来表示每种类型的方块,当数组元素为1时,则显示该方格,当数组元素为0时,则不显示该方格。
例如图2(1)的方块即可用二维数组{{1,1,1,1}}即可表示,其它类型及旋转后的方块表示可依此类推。
2.2.2 线程模块设计此模块主要实现对各种方块的自动下落,正确停止以及自动消除满行和得分、级数、下一个方块的正确显示。
问题分析与算法设计:●方块自动下落可以通过多线程机制来实现,当此线程每次得到运行时,将下落方块的显示位置下降一个小方格即可。
●方块能够正确停止,即判断方块何时停止。
由游戏介绍可知,当下落方块下方有方块阻挡或到达边界时,该方块停止下落。
此算法如下:首先可以设置一个30*10的二维数组来实现30*10小方格的显示情况。
每当小方块停止下落时,由表示方块的二维数组来给由方块覆盖的小方格附值。
这样,每当方块每次下落时,要检查表示方块的二维数组与即将覆盖小方块的区域是否冲突(即检测对应的数组元素位是否都为1,如果都为1,则冲突),以及是否到达边界,如果其中之一发生了,则此方块必须停止,否则继续下落。
●满行的自动消除当30*10的小方格如果有任一行被填充满时,即将此行删除。
算法如下:当方块正确停止后,循环检测表示小方格矩阵的二维数组,当检测到某一行有任一元素不为1时,则表示未满,否则表示此行此满,接着要完成二件事情:a.设第i行已满,从下往上,将k-1行的值附值给第k行(0<k<=i);b.将第一行的元素值清零。
●下一个方块的显示由于方块的出现均是随机性的,要得到每种状态的方块,首先要得到哪个种类的随机值,还要得到此种类不同形态的随机值。
此算法如下:由前述可知,每种方块均由二维数组来表示,这样可以构造七个三维数组,每个三维数组就对应每种方块不同的形态。
再构造一个四维数组,此数组包括此七个三维数组。
因此可通过得到这个四维数组和三维数组的两个随机下标即可得到下一个随机方块。
●得分及级数显示由前述介绍可知,得分要看具体的一次消行数,级数根据得分的情况显示。
算法设计:设置一个计数值标志,在前述一次消行判断中,每消一行,该计数值增1。
在消行判断完后,检测该标志,根据不同的值,加上不同的分数。
在得分判断完后,再根据得分多少来显示级数。
若得分已经达到当前级数最高分,则级数加1,得分清0,否则保持当前得分、级数不变。
2.2.3主界面设计模块主界面设计主要包括界面的显示,以及处理键盘事件,菜单事件。
下面就分别关于各个部分的设计详细分述。
2.2.3.1界面内容包括:主窗体,一个控制菜单(包括开始、重来、暂停、退出),得分和级别情况,下一个方块内容,30*10的小方格矩阵。
在程序运行初始化过程中,通过添加所需菜单条(MenuBar)及菜单(Menu),标签(Label),画一个30*10的小矩阵方格。
最终程序运行后的主界面如下图2所示:图22.2.3.2 键盘事件处理键盘事件包括按"↑","↓" ,"←","→"事件,由前面游戏介绍可知这四个事件所产生的功能。
问题分析与算法设计:按"↑"此事件产生方块旋转操作,方块并非任何时候都能旋转,如果旋转后与小方格矩阵显示的方块有冲突或超出边界时,均不能发生旋转。
因此首先要解决怎样正确得到旋转后的方块,再判断何时能旋转。
算法如下:正确得到旋转后的方块,可通过前述表示方块种类的三维数组来实现。
在显示下一个方块时,要得到这个随机的三维数组,这样可通过循环改变此三维数组的下标来实现。
当此按键事件触发后,下标增1,下标越界时,再将下标置为0。
判断方块是否能够旋转,与前述判断方块正确停止的方法类似。
将旋转后得到的方块与此方块覆盖的小方格区域作比较,若两者均为1,则发生冲突;或旋转后方块超过了边界范围,则可判断此当前下落方块不能发生旋转,否则显示旋转后的方块。
●按"↓"此事件产生方块加速下落操作。
由于方块自动下落是由创建一个线程单独控制,这样可通过改变此线程的睡眠时间来改变下落速度。
睡眠时间越少,下落速度赶快。
●按"←"此事件产生下落方块左移操作。
首先要判断此方块是否能够发生左移,当越界或与小方块显示方块阻挡时,则不能左移。
此算法与按"↓"事件的能否旋转算法类似,在此不再赘述。
●按"→"此事件产生下落方块右移操作。
首先要判断此方块是否能够发生右移,当越界或与小方块显示方块阻挡时,则不能右移。
此算法与按"↓"事件的能否旋转算法类似,在此不再赘述。
2.2.3.3 菜单事件处理控制菜单有开始、重来、暂停、退出菜单。
●“开始”事件点击“开始”,游戏即开始运行。
因此首先要新建一个新的线程用来处理方块事件。
还要随机显示第一个下落的方块。
最后把“开始”菜单设置成灰色,“暂停”菜单恢复显示。
●“重来”事件将当前状态恢复至初始状态,得分清0,级数置1。
●“暂停”事件暂停即要停止当前方块的下落,则只要关闭当前的线程即可。
同时使“暂停”菜单变成灰色,“开始”菜单恢复显示。
●“退出”事件结束线程,关闭窗体。
2.3模块设计小结由上述模块分析和设计可知,本游戏的核心模块是主界面模块,方块模块与线程模块均是为其而服务。
由于源程序给出了详细注释,本文档只提供算法设计思想,不再提供源程序,关于算法的具体实现可参看项目工程文件俄罗斯方块.java。
源程序的主窗体类(MainFrame),方块类(Block)以及为创建线程的类(Timer)的关系如下图3所示:图3三.工程进度四.项目测试分析第一次测试:测试时间:2004.12.1测试目标:测试整个程序运行情况是否满足基础要求实际测试情况简介:能够基本实现整个要求,但同时出现了一个小问题,就是游戏在运行时有时不能同时消除多行的情况。
问题分析:检查源程序中消除满行程序。
发现在消除一行(记第i行被消除)以后,由于要进行下移操作,原来的第i-1行变成了第i行,而原程序继续扫描第i-1行,这样原来的第i-1行因此就并没有被扫描掉,出现了漏扫的情况。
解决方法:改进原程序,只要在每消除一行后,将扫描位置下移一位即可。
第二次测试:测试时间:2004.12.10测试目标:测试本游戏还有没有值得改进的地方。
实际测试情况简介:已经完全达到预定任务的要求,但在界面的美观方面还值得改进。
解决办法:通过合理设置界面的背景色,背景色,布局即可。
五.制作安装软件制作好程序之后,利用微软XP系统自带了自带的安装制作软件iexpress,由于是微软自带的程序。
iexpress的使用方法很简单,只需在运行中输入iexpress就可以, 如下图3所示,。
制作安装程序包采用的是向导式,根据自己的实际情况来进行选择。
图3最后生成的exe文件名为RussionBlock.exe,双击其图标即可运行,详见项目工程文件六.项目总结与体会本次大作业完成得比较理想,很好地完成了预定任务。
但也还有值得改进的地方,例如为方便用户,增加设置对话框可以设置操作按键等,设置更多的级别层次等。
通过本次大作业的实践,我们小组四人都感觉到受益匪浅,加深了对面象对象编程和软件工程的理解,学习了不少新的知识。