基于Java俄罗斯方块设计与实现毕业论文

本科生毕业论文(设计) 基于Java的俄罗斯方块的设计与实现 姓名 学号 专业 指导教师 2013年X月X日 摘要 俄罗斯方块作为一款风靡全球的多样化终端游戏,经久不衰。俄罗斯方块简单的基本游戏规则是旋转、移动,游戏自动随机输出7种形状的方块,经旋转后可形成28种形状,方块堆叠在一起,排列成完整的一行或多行消除得分,积分达到一定程度会自动提升级别。该游戏上手简单、老少皆宜、家喻户晓。

本论文在详尽分析传统俄罗斯实现的基本原理、基本规则基础上,更深一步地研究俄罗斯方块的创新模式,在经典模式基础上开发出等级可变的模式,以及进一步开发出颜色可变的模式,如随意改变界面的背景色、前景色等,本文对以上功能给出了实现流程、详尽描述、和部分源代码。

论文阐述了该游戏的历史、开发此游戏的意义和环境并根据软件工程的相关知识,进行系统的需求分析、概要设计、详细设计与实现、调试运行进行描述。

此设计是在Microsoft Windows XP系统下,以Java为开发语言,在MyEclipse开发平台上进行游戏的设计与实现。

关键词:游戏;

俄罗斯方块;

软件工程;

MyEclipse Abstract Tetris is a popular global diversification of terminal enduring game.Simple basic rules of the game is rotating, moving, automatic random output of 7 kinds of shape square game. It forms 28 kinds of shape, after rotating cube stacked together, forming complete one or more lines to eliminate score. Its level automatically rises with the score. The game is easy for young and old, has become a household name. This paper not only give the detailed analysis of the traditional Tetris which based on the basic principle and simple rules but also develop the color variable model, such as random change the background color and foreground color and so on. Further more, in this paper, the above functions are given the implementation process, the detailed description, and some source code. The paper expounds the history of the game, develops the meaning of the game and the environment of design. According to the relevant knowledge of software engineering, the author reports the demand analysis, outline design, detailed design, planning and execution of the test. This design is under Microsoft Windows XP system, based on Java development language, the MyEclipse development platforms to carry on the design and implementation of the game. Key Words: Game, Tetris, Software engineering, MyEclipse 目录 1 引 言 1 2 系统的需求分析 2 2.1 系统需求 2 2.2 接口控制 2 3 系统的概要设计 4 3.1 软件运行和开发工具 4 3.2 系统功能设计 4 3.2.1 手工处理业务的基本流程 4 3.2.2 基本流程的功能模块 5 4 系统的详细设计与实现 8 4.1 游戏主界面显示模块 8 4.2 画布、方块显示模块 9 4.2.1 背景画布模块设计 10 4.2.2 预览方块模块设计 11 4.2.3 方块移动、旋转设计 14 4.3 控制面板模块 18 4.3.1 菜单栏模块设计 18 4.3.2 控制面板按钮设计 20 5 系统的调试运行 21 5.1 测试的意义及注意事项 21 5.2 游戏代码、算法的测试 21 5.3 游戏界面菜单选项的功能测试 22 5.4 按键事件的功能测试 24 5.5 方块堆砌与消行测试 25 5.6 测试结果分析 26 6 结 论 27 参考文献 28 致 谢 29 1 引 言 俄罗斯方块的影响已毋庸置疑, 当今世界的电脑、手机到处都有俄罗斯方块的踪迹,同时它更是每个游戏平台的必备游戏,相关的复制品不胜枚举。这个最早由莫斯科的数学家亚力克西·帕杰诺夫(Alexey Pajituov)所设计的作品,被公认为有史以来最畅销的经典游戏,至今魅力不减当年。亚力克西·帕杰诺夫曾在俄罗斯科学研究院电脑中心工作, 当时他在Eletronica 60的旧型俄罗斯主机上进行开发工作, 这种机器不支持图形界面, 和PC也不兼容。他尝试将一种传统的拼图游戏Pentomino 改写成电脑游戏。Pentomino 一共有十二种形状, 各以七个方块组合而成。帕杰诺夫试着写了一个程序, 旋转并移动这十二种不同形状的方块, 让它们拼成一大块。后来几经修改,发展成我们现在所熟悉的经典模式。俄罗斯方块曾经引起的轰动和制造的经济价值可以说是游戏史上无可比拟的。它看似简单但却变化无穷,令人爱不释手。

俄罗斯方块游戏是随计算机的发展而发展,并不断推陈出各种新演变出的类似游戏, 深受广大玩家喜爱。游戏模式有的简单、有的复杂, 但其根本原理是都是对随机出现的方块进行组合, 来训练玩家的反应能力、逻辑思维能力。游戏软件, 大多数人都视其为神妙莫测, 高不可及的东西。一般来说,游戏软件也确实具有很高的技术难度, 随着开发工具和软件开发方法学的不断发展, 自己动手开发游戏也并非难事。俄罗斯方块游戏可以上说是一种古老而又有趣的游戏。游戏软件不计其数, 网上也有很多关于游戏实现的复杂算法和设计, 其难度让一般初学者望而却步。本文利用数组作为方块的数据结构,用颜色变化作为方块下落和移动的标识,提出一种用Java语言实现游戏的简易方法,在经典模式的基础上实现等级可变,颜色可变等功能,初学者可仿此开发类似游戏, 并了解游戏软件的设计与开发过程。

俄罗斯方块游戏以其益智、简单又不乏挑战、创意独特的游戏模式,吸引了众多游戏爱好者,而且老少皆宜。当今社会里,人们的工作压力随着生活节奏的快速提高而逐渐繁重,随之减少的是可以自由支配的休息时间,人们迫切地需要一种既简单又节省时间的快速休闲方式。无可争议,它是永恒的娱乐经典,且它的代码简单,界面简洁,从最初发行时的单个游戏机到现在便捷的安装到电脑、手机、MP4、电子词典、商务通、IPAD、ITOUCH等便携设备,俄罗斯方块风靡世界,经久不衰。本次课题研究可以说是对游戏开发的一次尝试,无论从技术还是社会意义上看都是很有价值的。

2 系统的需求分析 对系统的需求分析就是用户和开发人员在“系统必须做什么”这个问题上实现相互理解,达到共识,从而形成双方认可的软件产品的需求规格。这样有利于提高软件开发过程中的能见度,便于对软件开发过程的控制与管理,便于采用工程化的模式开发软件,从而达到提高软件的质量,为开发人员、维护人员、管理人员之间的交流、协作提供便捷。作为工作成果的原始依据,系统的需求分析可以向潜在用户传递软件功能、性能的需求,使其能够判断该软件是否符合自己的需求。

2.1 系统需求 系统随机产生7中不同形状的方块,旋转后有28种状态。方块自由下落,玩家通过键盘控制方块的移动和旋转,把方块摆放在适当的位置。如果方块落下时,有被方块填满的整行,则该行可消去。每消去一行,玩家得分增加10分,每满100分,玩家等级增加一级。若由存在空格的方块填满整个窗口,则游戏宣告失败。游戏功能需求如下:

游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的默认背景色是深绿色,主界面方块默认用橘黄色,预显方块颜色默认为淡紫色。背景色、前景色对比鲜明,以达到让玩家眼前一亮的感觉,并能在游戏达到高等级状态,方块下落速度渐高的情况下使玩家能够清楚的分辨出下落方块的形状,增加游戏的刺激性。

游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型一共7种形状的向4个方向的旋转变形,各个方块要能实现它的任意变形,可设为顺时针变形或逆时针变形,一般为逆时针变形。方块的可否翻转需要加以判断,以防止其翻转越界。

键盘处理事件需求:方块下落时,可通过键盘方向键(上键、下键、左键、右键)或字母键I、K、J、L对下落方块进行向上(旋转变形)、向下(加速下落)、向左移动、向右移动。

鼠标处理事件需求:通过点击菜单栏中相应的菜单项或控制面板内的按钮,可以实现游戏的开始、结束、暂停、继续、提高等级、降低等级,预显方块形状的显示,分数、等级的显示,以及游戏帮助、颜色变换等功能。

显示需求:当方块填满一行时可以消行,剩余未填满的行逐次向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。当方块充满主界面的每一行,方块不能再下落时,提示“Game Over”的字样。

非功能性需求:本系统非功能性需求包括游戏主界面左上角显示图标需求、窗口尺寸可调整性需求、游戏运行时主界面弹出位置居中需求等。

2.2 接口控制 本游戏通过键盘和鼠标进行操作,在Windows的操作系统下,利用键盘的按键对方块进行移动、变形,要使用到键盘的接口事件。游戏使用鼠标对游戏进行全程控制,如游戏的开始、暂停、继续、查看游戏帮助、更改界面颜色、更改游戏等级等,通过对鼠标单击、按键添加监听事件,编辑相应代码来实现相应功能。

3 系统的概要设计 3.1 软件运行和开发工具 操作系统:Microsoft Windows XP Professional Service Pack 3 内存:2G 硬盘:320G CPU:赛扬2.8 交互工具:键盘、鼠标 显示器:VGA显示器 JDK版本:jdk1.6.0.02 Eclipse版本:MyEclipse 8.5 SDK-3.4-win32 3.2 系统功能设计 3.2.1 手工处理业务的基本流程 本游戏的设计以娱乐为初衷,以益智为目的,在综合研究以往俄罗斯方块经典游戏功能的基础上推陈出新,加之新的功能,赋以新的生机和活力。图3-1为游戏基本流程图具体阐述游戏的基本流程。

运行说明:

1>运行程序,点击右侧控制面板内的“开始”或“控制”菜单内的“开始”按钮开始游戏。

2>使用上、下、左、右键或I、K、J、L键控制方块的变形、下落、向左和向右移动。

3>方块满行消除,分数自动增加,分数每满100等级自动增加一级。

4>等级增加、方块下落速度增加,按右侧控制面板或“游戏”菜单内的“提高等级”、“降低等级”按钮,来手动改变游戏等级。也可点击“颜色”菜单内的选项,更改前景色、背景色。

5>按右侧控制面板或“控制”菜单内的“暂停”可以控制游戏暂停,然后按“继续”可以控制游戏继续上次游戏。按“停止”按钮,游戏会彻底停止正在进行的当局游戏,再按“开始”或“控制”菜单内的“重新开始”会开始新游戏。

6>当方块占满整个窗口,不能再有新方块下落时,游戏会弹出“Game Over”的对话框提示游戏结束。

图3-1 游戏基本流程图 3.2.2 基本流程的功能模块 本系统基于游戏的各项功能来设计游戏的各个功能模块。图3-2为本游戏的系统功能模块示意图,如图所示,本游戏主要有两大模块:游戏界面区,游戏控制区。游戏界面区分显示玩家可选操作、显示玩家操作结果两个部分。游戏控制区分更改颜色、开始、暂停、继续、停止、重新开始、提高等级、降低等级、退出等功能模块。

图3-2 系统功能模块示意图 图3-3为游戏界面区模块设计示意图,如图所示,游戏界面区模块可细分为闯进新游戏界面、处理玩家操作、显示玩家操作结果三个功能模块。

图3-3 界面模块示意图 图2-4为游戏控制区设计示意图,如图所示,游戏控制区模块分为开始、暂停、继续、初始游戏级别设置、初始颜色设置、退出等功能模块。

图3-4 控制区模块示意图 4 系统的详细设计与实现 Java是一种纯面向对象(Object-Oriented)的程序语言,它的诸多优点在此就不作详细论述了。从面向对象的观念出发,本程序主要可分为以下几个模块:

l 游戏主界面显示模块 l 方块及数据显示模块 l 方块移动控制模块 l 游戏界面颜色控制模块 l 游戏进度、等级控制模块 分析对象的技巧在于它的功能的扩展性及维护效率。试想,如果因为外部环境或者用户需求的变化需要对程序进行功能扩展或者维护,就要对代码作大幅度的更动甚至重写,这样就失去了面向对象的优势,所以在本程序分析时将独立性高的模块作为一个对象,以提高程序的可扩展性和可维护性。以下该游戏中类的设计:

ControlMainGame类:继承自JFrame类,作为游戏的主类,负责对游戏的主体全局进行控制,连接与指挥各个类的枢纽。

ControlPanel类:继承自JPanel类,作为操作面板类,负责安放主游戏窗口,积分板,级别控制按钮等窗口用以控制游戏进程。

ChangeBlockColor类:继承自JPanel类,ChangeBlockColor线程类动态改变画布类的方格颜色,画布类通过检查方格颜色来体现ChangeBlockColor方块的移动情况与消去状况。

BlockPaint类:方格类,组成方块的基本元素,主要表达方式为颜色。

BlockOperation类:继承自Thread类,作为操控方块的类,控制方块的移动,下落以及变形。

4.1 游戏主界面显示模块 一个优秀的软件系统不仅体现在核心的功能的多样性和强大上,如果使用者所面对的是枯燥的、陈旧的界面的话,那么这个的软件系统是不成功的,所以好的、精美的界面设计是极为重要的环节。为玩家设计制作布局合理、视觉效果良好的界面的重要性就不言而喻了。

游戏主界面采用Swing组件开发,并且向其注册监听器,以实现各种控制功能,综合游戏窗体的设计,其上至少需要注册三个监听器,分别是动作监听器(ActionListener)、键盘监听器(KeyListener)、选项监听器(ItemListener)。

根据初步设计,可以确定客户端上所要用到的Swing组件对象有JFrame对象、JPanel对象,JLabel对象、JButton对象、JMenuBar对象、JMenu对象、JMenuItem对象、JTextField对象、JTextArea对象、JDialog对象等,至少十个Swing组件对象。下图4-1为游戏主界面截图。

图4-1 游戏主界面截图 本游戏主界面设计的初始颜色搭配基于对比鲜明的原则,默认背景色为深绿色,左上角设置俄罗斯方块图标,得分初始值为0,等级初始值为1,最高分记录初始值为0。游戏主窗体尺寸设置为(520,580),方块移动范围窗格由一个20行、12列的二维数组控制,且左上角图标设置为方块图案,起标识作用。

4.2 画布、方块显示模块 本游戏中将画布底色默认设计成深绿色,在方块下落过程中,根据颜色的变化识别下落的方块。

4.2.1 背景画布模块设计 该游戏的主背景画布是一个20行、12列的二维数组,方块显示是由相应颜色变化来标识,主窗体用颜色填充后可形成呈现出来背景样式和方块。本游戏用继承自JPanel的ChangeBlockColor类控制背景画布的显示,用rows代表画布的行数,cols代表画布的列数,行数和列数决定着画布拥有方格的数目。背景画布实现代码如下:

/* ChangeBlockColor 类 画布类的构造函数 rows int, 画布的行数 cols int, 画布的列数 行数和列数决定着画布拥有方格的数目 */ class ChangeBlockColor extends JPanel { private Color backColor = new Color(0,51,0) , frontColor = new Color(255,153,0); private int rows, cols, score = 0, scoreForLevelUpdate = 0; private BlockPaint[][] boxes; private int boxWidth, boxHeight; public ChangeBlockColor(int rows, int cols) { this.rows = rows; this.cols = cols; boxes = new BlockPaint[rows][cols]; for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { boxes[i][j] = new BlockPaint(false);// } } } //画布类的构造函数 public ChangeBlockColor(int rows, int cols, Color backColor, Color frontColor) { this(rows, cols); this.backColor = backColor;//背景色 this.frontColor = frontColor;//前景色 } //覆盖JComponent类的函数,画组件 // g 图形设备环境 public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(frontColor); for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { g.setColor(boxes[i][j].isColorBox() ? frontColor : backColor); g.fill3DRect(j * boxWidth, i * boxHeight, boxWidth, boxHeight, true); } } } 4.2.2 预览方块模块设计 方块和数据信息是游戏中最基本的功能模块。ShowBeforePanel这个类提供方块预显图形 ,blockkindnum用来控制随机产生的方块编号,blockstatusnum用来控制方块的四种旋转状态。定义一个4x4方阵,共16个小格。用“0”和“1”来表示每个方格是绘制新颜色还是保留底色。

每得到一个新方块,都是随机从七种形态的方块中选取一种。游戏定义了一个变量,代表新方块的模型。比如定义int型数组STYLE代表28中方块类型,7行4列,每个元素代表其中一种方块。即0<=blockkindnum<=6,0=

Java语言包中的Math类提供了一个生成随机数的方法random(),调用这个方法会产生一个在0-1之间的双精度浮点数。所以每次要得到新方块时,只需调用一次这个方法,得到一个0-1的双精度浮点数,然后用该数乘以7,之后强转成整型,即可得到1—7的整数,用来控制行。用该数乘以4,之后强转成整型,即可得到1—4的整数,用来控制列。

由此可以组合出多种图形定义然后用代码实现下列功能:

1>每次执行首先为随机数产生不同的初值。

style=BlockOperation.STYLES[(int)(Math.random()*7)][(int) (Math.random() * 4)]; 图4-2 随机产生方块图 2>随机选取一个图形,图3-1随机产生方块图具体描述用生成的随机数控制产生的图形。

3>当前图形在其4*4网格中的位置信息。

绘制4行4列的方块预显方格,随机生成预显示的方块样式。本游戏用二维数组存储方块的28种样式。

public final static int[][] STYLES = {//分别对应对7种模型的28种状态 {0x0f00, 0x4444, 0x0f00, 0x4444}, // 长条型的四种状态 {0x04e0, 0x0464, 0x00e4, 0x04c4}, // 'T'型的四种状态 {0x4620, 0x6c00, 0x4620, 0x6c00}, // 反'Z'型的四种状态 {0x2640, 0xc600, 0x2640, 0xc600}, // 'Z'型的四种状态 {0x6220, 0x1700, 0x2230, 0x0740}, // '7'型的四种状态 {0x6440, 0x0e20, 0x44c0, 0x8e00}, // 反'7'型的四种状态 {0x0660, 0x0660, 0x0660, 0x0660}, // 方块的四种状态}; 以下为与数组相对应的方块样式截图。

l 长条型的四种状态 图4-3 长条型状态截图 l 'T'型的四种状态 图4-4 T型状态截图 l 反'Z'型的四种状态 图4-5 反Z型状态截图 l 'Z'型的四种状态 图4-6 Z型状态截图 l '7'型的四种状态 图4-7 7型状态截图 l 反'7'型的四种状态 图4-8 反7型状态截图 l 方块的四种状态 图4-9 方块状态截图 4.2.3 方块移动、旋转设计 方块的翻转与移动比较容易实现,方块移动只需要改变方块的横坐标或纵坐标,然后重新绘制方块即可。方块翻转也只需要改变背景数组的值,重新绘制方块即可。

本游戏方块下落时,进行动态绘制,实现Cloneable接口, 以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。方块的操作类BlockOperation继承Thread类,重写run()方法,以实现方块的动态正确下落。当然,在线程中要判定方块是处于moving状态还是pausing状态。

public void run() { //moving判定方块是否在动态下落 while (moving) { try { //betweenleveltime指示相邻等级之间相差时间 sleep(betweenleveltime * (ControlMainGame.maxlevel - level + flatgene)); } catch (InterruptedException ie) { ie.printStackTrace(); } //pausing判定游戏是否处于暂停状态 if (!pausing) moving = (moveTo(y + 1, x) && moving); //moving是在等待的100毫秒间,moving没被改变 }} 当然,在游戏中还要判定方块移动的边界问题, 比如,一个方块在它左边正好差一个格子的空间才能够翻转,但是它的右边恰好有一个格子的空间,这种情况,如果方块不能够翻转,就不方便用户操作,如果能够翻转,就会发生越界,将已经存在的方块挤占掉。要想实现翻转又不发生越界,那么,就应该在方块翻转后把它往右边移动一个格子,然后再绘制方块,这样,方块就不会挤占掉其它已经固定住的方块了,以下解决越界问题。

1>方块翻转判定 在两种情况可能发生越界,一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。

第一种情况只需要参考方块落下去后不能够再移动的判定即可。

对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转。否则,不能翻转。

因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,但是这样做未免过于麻烦。

根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只要能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4x1个格子的空间才能够翻转。对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田字型的方块只要没有落下,就一直能够翻转。而其它五种形态的方块,又有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3x2个格子的空间。

所以,方块翻转的判定,要分三种情况,第一种情况是方块落下去后不能翻转;

第二种情况是对竖直状态出现的长条形的方块进行翻转判定;

第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。

何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。

可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4x4个格子的空间范围内。

方块数组在游戏主界面中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。

假定方块数组的横纵坐标是x和y,那么,这个位置就是,长条形的方块翻转后所处的那一行是游戏地图的第y行,所占的列是第x到x+3列,长条形和田字形以外的五种方块翻转后的所占的行数是游戏地图的第y和第y+1行,所占的列是第x到x+2列。

所以,如果以上空间有空格子,方块就能够翻转。

2>翻转越界纠正 只要方块翻转后所处的空间足够,方块就能够翻转,但是,如果方块翻转后所处的空间不足够,而在它的另一边却有足够的空间呢? 方块在边界处时,翻转后不仅可能翻出地图外,还可能发生数组越界,当然,只需要将地图数组定义得大一些,就能够避免数组越界错误,对于方块越界,如果在它的另一边有足够空间,那么,就应该把方块往另一个方向移动适当的单位,纠正方块越界错误。如图4-10方块翻转流程图所示,方块翻转需要经三次判定:是否已经下落到底部、翻转后是否有足够空间、翻转后是否越界。

4-10 方块翻转处理流程图 玩家操作键盘实现方块的移动、旋转,代码引进ControlKeyListener类继承KeyAdapter类进行键盘监听功能的实现。KeyAdapter类继承自Object类,实现KeyListener接口,用来接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。扩展此类即可创建 KeyEvent 侦听器并重写所需事件的方法,即是 ControlKeyListener类。使用ControlKeyListener可创建侦听器对象,然后使用组件的 addKeyListener 方法向该组件注册此侦听器对象。当按下、释放或键入某个键时,将调用该侦听器对象中的相应方法,并将 KeyEvent 传递给相应的方法。实现代码如下:

private class ControlKeyListener extends KeyAdapter { public void keyPressed(KeyEvent ke) { if (!game.isPlaying()) return; BlockOperation blockope = game.getCurBlock(); switch (ke.getKeyCode()) { case KeyEvent.VK_DOWN: blockope.moveDown(); break; case KeyEvent.VK_LEFT: blockope.moveLeft(); break; case KeyEvent.VK_RIGHT: blockope.moveRight(); break; case KeyEvent.VK_UP: blockope.turnNext(); break; default: break;}}} 4.3 控制面板模块 4.3.1 菜单栏模块设计 菜单栏中有“游戏”、“背景”、“控制”、“帮助”四个菜单选项。“游戏”选项又分“新游戏”、“提高等级”、“降低等级”、“退出”四个选项。“背景”选项又分“前景色”、“背景色”,下分若干种颜色。“控制”选项分“开始”、“暂停”、“重新开始”、“停止”。“帮助”选项分“游戏帮助”、“关于”。相关截图如图4-11、图4-12、图4-13、图4-14所示。

4-11 菜单栏“游戏”选项 4-12 菜单栏“背景”选项 4-13 菜单栏“控制”选项 4-14 菜单栏“帮助”选项 1>“新游戏”的按钮功能为实现游戏画布的重新绘制,类似reset的功能。该按钮的监听实现代码如下: // “新游戏“按钮添加监听 miNewGame.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae) { //停止游戏 stopGame(); //让游戏“复位”到初始状态 reset(); //设置游戏难度 setLevel(initlevel); } }); 2>“提高等级”、“降低等级”按钮用来手动调节游戏的等级,从而改变方块下落的速度。

“退出”按钮控制游戏随时退出,终止游戏。

3>“背景”按钮中的“前景色”、“背景色”又有“黑色”、“白色”、“红色”、“蓝色”等选项,根据选项可更改主界面和预显窗口的背景色以及方块的颜色。玩家可根据个人喜好,更改游戏窗口颜色,方便,快捷。

4>“控制”选项的“开始”子选项控制游戏的开始,点击按钮,方块开始下落。

5>“帮助”按钮中“游戏帮助”选项,点击可弹出对话框显示游戏帮助信息,点击6>“关于”按钮显示与游戏软件本身相关信息,具体信息如图所示:

4.3.2 控制面板按钮设计 本游戏控制面板中包含得分统计、等级统计、最高分记录统计等字段, 其中的TextField控件均由游戏本身统计给出,玩家不能私自编辑。本游戏的游戏规则为每消一行得10分,每增加100分上升一个等级,初始得分为0,初始等级为1,“最高分记录”记录游戏的目前最高分记录。

以下给出得分、等级更新字段的代码:

//当一行被游戏者叠满后,将此行清除,并为游戏者加分 // row int, 要清除的行,是由BlockPaintesGame类计算的 // synchronized设置同步 public synchronized void removeLine(int row) { // 绘制方块 for (int i = row; i > 0; i--) { for (int j = 0; j < cols; j++) boxes[i][j] = (BlockPaint) boxes[i - 1][j].clone(); } // 每次消行加10分 score += ControlMainGame.scoreplus; // 等级更新 scoreForLevelUpdate += ControlMainGame.scoreplus; // 重绘画布 repaint();} 控制面板中按钮的功能在4.3.1中已给出代码,在此不再赘述。

5 系统的测试运行 5.1 测试的意义及注意事项 软件测试是软件设计过程中极其重要的一个环节,是保证软件的质量的重要保障。测试的方法的好坏会直接影响到软件的好坏,进行软件测试可以找出其中的错误、不足并加以改进,从而得到一个高效、可靠的系统。

软件应从多角度进行测试和分析,这样才能找出其中错误的地方。测试的时间最好找一些与设计系统无关的人员,或者分析人员。因为在开发软件的时候,开发人员已经形成了自己的思维定势,在测试的时候始终受到这种思想的束缚,很难找出其中的错误而与设计无关的人员和那些分析人员很容易找出错误所在。

在程序调试过程中一定要耐心仔细,一个细微的错误将会导致整个功能不能实现导致浪费很多的时间去修改。应在以下几方面加以注意:

1>语法错误 语法错误是经常碰到的错误。例如,命令拼写错误或传递给函数的参数不正确都将产生错误。语法错误可能导致不能继续编写代码。

2>逻辑错误 逻辑错误通常可能是潜在和难以检测的。当有因键入错误或程序逻辑流程引起的逻辑错误,可能会成功运行,但产生的结果却是错的。例如,当本应使用小于符号比较数值,但却使用了大于符号时,那么将返回不正确的结果。

3>运行时错误 运行时错误是在执行过程中指令试图执行不可能的动作而导致的,必须纠正运行时产生的错误,这样才能保证软件运行的可靠性。

本游戏在开发过程中采用了多种有效措施进行测试以保证软件质量,对本游戏进行了边界处旋转、方块翻转越界等方面的测试,极大的保证了软件质量和出错几率。但是系统中可能还存在着一些其他的错误和缺陷,因此,游戏必须要经过反复的运行测试,尽最大量将bug减到最少。

5.2 游戏代码、算法的测试 1>写get()方法时需要有返回值,但是程序中没有写return语句,使程序在编译时出现错误。解决方法是,在方法中加入return语句,返回相应的内容即可。

2>使用随机函数产生方块时没有给各个方块传入参数,编译不能通过。解决方法是,根据各个方块的构造传入相应的参数。

3>写T字形方块各方格的默认位置时,将控制方块位置的变量i,初始化为0,运行的结果是丁字形方块默认成了竖形方块。解决方法是,将变量i的初始化数值改为1,即可达到设计的效果。

4>运行程序时,统计的分数只是每一次消除满行后的分数,而以前的分数就会被覆盖,没有累计。解决方法是,将程序中的“score=”改为“score+=”,就可以使分数累加。

5>算法流程的错误主要集中在如何检测及消去方块,还有如何在通关之后对分数的累加进行处理,是否升级的判定这些方面,经过与同学的讨论以及参考资料,都最终得到了解决。

5.3 游戏界面菜单选项的功能测试 1>“游戏”菜单测试 ①点击“游戏”à“新游戏” 输出:游戏重置 结果:正常 ②点击“游戏”à“退出” 输出:游戏结束 结果:正常 ③点击“游戏”à“提高等级” 输出:等级提高一级 结果:正常 ④点击“游戏”à“降低等级” 输出:等级降低一级 结果:正常 2>点击“背景”菜单测试 ①点击“背景”à“前景色”à“黑色” 输出:方块颜色变成黑色 结果:正常 ② 点击“背景”à“背景色”à“黑色” 输出:背景颜色变成黑色 结果:正常 3>“控制”菜单测试 ①点击“控制”à“开始” 输出:开始游戏,方块开始下落 结果:正常 ②点击“控制”à“暂停” 输出:暂停游戏,方块停止下落 结果:正常 ③点击“控制”à“重新开始” 输出:重新开始新游戏 结果:正常 ④点击“控制”à“停止” 输出:游戏停止 结果:正常 4>“帮助”菜单测试 ①点击“帮助”à“游戏帮助” 输出:弹出对话框,提示游戏规则 结果:正常 图5-1 游戏帮助菜单运行截图 ②点击“帮助”à“关于” 输出:弹出对话框,提示游戏软件版本相关信息 结果:正常 图5-2 游戏关于菜单运行截图 5.4 按键事件的功能测试 1>方块移动测试 游戏过程中,点击“左、右、下”方向键 输出:方块正常移动,不会移出边界 结果:正常 2>方块旋转测试 游戏过程中,点击向上方向键 输出:方块无边界和障碍物阻挡的情况下可反转 结果:正常 5.5 方块堆砌与消行测试 1>方块堆砌测试 当方块下落到最底面或与障碍物接触时 输出:方块成功堆砌在底部 结果:正常 2>游戏消行测试 当出现满行现象时 输出:所有满行被消除,方块依次下移 结果:正常 图 5-3 游戏结束状态截图 3>游戏结束测试 当出现满屏现象时 输出:弹出会话窗口,提示“Game Over”,如图5-3所示。

5.6 测试结果分析 经过本次系统测试,本游戏实现预设的基本功能,不过整体功能还不够强大,创新方面做的稍微逊色,作为开发的第一个版本,游戏在功能、界面设计等很多方面还需要进一步完善。

6 结 论 在做毕业设计之前,我对Java相关的开发只是停留在理论知识的水平上,此次毕业设计让我明白“纸上得来终觉浅,绝知此事要躬行”的道理。缺乏实际的软件开发经验,是我给自己下的定论。通过这次毕业设计,我完成了俄罗斯方块游戏的全部开发任务。在整个开发过程中遇到了很多问题,如方块的绘制和变形、线程的创建问题、同步的控制、满行判断、消行的处理以及最高分数记录的功能实现,但最终都被我一一解决,对其中比较主要的几点体会总结如下:

第一,为了熟悉俄罗斯方块的相关功能和设计,我时常从各大游戏下载网站下载单机版俄罗斯方块游戏,并研究其中功能的实现和界面的设计,思考和查阅资料进行分析,经过逐步的设计与反复的修改论证,才完成了整个游戏的开发。

第二,在游戏设计过程中,我采用从粗到精的设计模式,从小到大测试的原则。先设计游戏框架,并逐层测试,而后再添加具体实现代码并逐步进行更细化的测试。设计过程中,经常会遇到难题,我会通过反复思考和测试,然后找出自己的错误并加以改正,再进行下一个步骤,确保万无一失,尽力减轻最后的调试工作量。

第三,毕业设计业可以作为一个不断学习新鲜事物的过程,从设计初的不懂到最后能够圆满完成,我体会到在实践中不断学习的重要性,这对于将来我走上工作岗位具有重要的教育意义。通过毕业设计的创作,我对Java这门课程有了更深一步的了解,也对我今后的就业之路打下了一定的基础。

参考文献 [1](美) Paul Hyde.Java线程编程[M].北京:人们邮电出版社,2003 [2]Martin dejode.Symbian OS J2ME[M].北京:人民邮电出版社,2005.10 [3]朱福喜. Java程序设计技巧与开发实例[M].北京:人民邮电出版社,2004.2 [4]袁海燕 王文涛.Java实用程序设计100例[M].北京:人民邮电出版社,2005.2:51~96 [5]高凌琴 陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信息化讨,2008年第二期 [6]黄复贤.俄罗斯方块游戏的敏捷设计与开发[J]. 电脑编程技巧与维护,2005.4 [7]艾克尔.Java编程思想[M].北京:机械工业出版社,2005.2 [8](美) Paul Hyde.Java线程编程[M].北京:人们邮电出版社,2003 [9](美)Bill Venners.深入Java虚拟机[M].北京:机械工业出版社,2003.9.63~98 [10]闻怡洋.J2ME MIDP 1.0/2.0无线设备编程指南[M].北京:北京大学出版社,2004.5:393~420 [11]赵东跃.俄罗斯方块编程[J].电脑编程技巧与维护,1998年第六期 [12]殷兆麟.Java网络编程基础[M].北京:北方交通大学出版社,2004 [13](美)John Zukowski.Java 2 从入门到精通[M].北京:电子工业出版社,1999 [14]宋波.Java应用开发教程[M].北京:电子工业出版社,2002 [15]托普雷.J2ME技术手册[M].北京:中国电力出版社,2004.6:259~312 致 谢 在这次毕业设计制作和毕业论文写作过程中,孙楠老师在论文写作过程、相关专业知识的指导等方面,给予了我大力的支持和帮助,还有XX实训基地实习导师XX老师在代码实现过程中对我的多方面指导,以及各位同学在论文详细设计流程图制作等对我的帮助。同时向四年来教我知识、育我成长的河南财经政法大学计算机与信息工程学院的全体教师致以最衷心的谢意! 由于我的学识有限,加之时间仓促,文中不免有错误和待改、不足之处,真诚欢迎各位师长、同学提出宝贵意见。我会以身作则,严于律己、奋勇拼搏,以母校为荣,走出一条属于自己的阳关大道。最后,祝愿所有的教师和同学们,愿你们身体健康,工作顺利!

毕业设计论文

毕业实习与毕业设计论文相关材料装订要求

室内设计毕业论文

毕业论文设计说明

团队毕业设计论文

推荐访问:毕业论文 俄罗斯方块 设计 Java