基于Java的飞机大战游戏的设计与实现

基于Java的飞机大战游戏的设计与实现

目 录

1  引言

1.1  项目背景

1. 2  国内外研究现状

1.3  项目主要工作

1.4  本文组织结构

2  开发平台与开发技术

2. 1  IntelliJ IDEA简介

    2. 2  IntelliJ IDEA与Eclipse 、MyEclipse的比较

2. 3  Java

3  可行性研究

3. 1  技术可行性

3. 2  经济可行性

3. 3  操作可行性

3. 4  用户使用可行性

3. 5  法律可行性

4  需求分析

4. 1  系统需求概述

4. 2  功能模块设计

4.2.1  游戏状态控制功能模块

4.2.2  游戏难度的调整模块

4.2.3  游戏界面绘画功能模块

4.2.4  玩家游戏控制功能模块

4. 3  游戏难点分析

4.3.1  绘图美化

4.3.2  多线程技术的实现

4.3.3  防碰撞问题的解决

4.3.4  动画的实现

5  飞机大战功能实现

5.1  模型图

5.2  软件功能模块

5.3  游戏首页的实现

5.3.1  界面实现

5.3.2  流程图

5.3.3  核心代码

5.4  游戏开始模块的实现

5.4.1  界面实现

5.4.2  流程图

5.4.3  核心代码

5.5  发射子弹模块的实现

5.5.1  界面实现

5.5.2  流程图

5.5.3  核心代码

5.6  积分模块的实现

5.6.1  界面的实现

5.6.2  核心代码

5.7  防碰撞逻辑 

5.7.1  核心代码

5.8  游戏操作的实现

5.8.1  核心代码

5.9  特殊NPC蜜蜂

6  系统测试

6.1  测试的定义及其重要性

6.1.1  测试的定义

6.1.2  测试的重要性

6.2  测试方法

6.3  测试结果

7  结论

参考文献

致谢

外文文献

中文翻译

1  引言

1.1  项目背景

90后的我们,童年最开始接触电子游戏是在游戏厅,那时候的飞机大战游戏机前,往往人山人海,绚丽多彩的画面,带感操作让人沉醉不能自拔。再后来,珍珠港(Pearl Harbor),虎虎虎(Tora! Tora! Tora!)等空战电影中激烈的空战和飞机在天空中的英姿让我彻底爱上了空战,所以毕业设计我选择了与飞机战斗有关——基于Java的飞机大战游戏的设计与实现的毕业设计。

而选基于Java的飞机大战游戏的设计与实现为题,是对大学期间学到知识的一次实践运用,也是对自己大学四年学习成果的一次检验。

柏拉图:“游戏是一切幼子生活和能力跳跃需要而产生的有意识的模拟活动。”亚里士多德给游戏的定义是:“游戏是劳作后的休息和消遣,本身并带有任何目的性的一种行为活动。”可以说,游戏是一种一直存在的社会现象,有了人类就有了游戏,人类与游戏息息相关。游戏也随着人类的进步有了新的发展。

PC机刚开始普及的时候,游戏并不能被广泛接受。最主要的原因就是不能充分发挥PC机的性能,即游戏程序不能最大化使用PC机的硬件资源,导致PC机的早起游戏画面差,操作感僵硬,可玩度不高,所以不被人们所接受。但是随着切硅的技术的提升导致CPU性能的飞跃及Java语言的开发,游戏程序对硬件资源的利用率的提高,现在游戏的各个方面都有了质的飞跃。比如20世纪末,暴雪公司下的《星际争霸1》掀起全球星际流,其操作感和画面打击感及游戏可玩性都有很大的提升。当然,除了游戏本身的优秀质量以外,可以较广的支持不同的硬件设备的功能也不容忽视,高中低端PC机都有不错的流畅度。

而飞机大战类游戏中起步较早的还要数由日本公司Cyber Front研制并发行的雷电系列,该系列操作简单,节奏明快,因此,可以说成是飞机大战游戏类的经典之作。该系列下的《雷电3》在2016年中旬从PS2平台移植到PC机平台上后,更成为当时风靡一时的游戏。

《雷电3》一共有8个关卡,分别是病变的森林,玄武岩城市。岩石港湾,金色的沙漠,原子核工厂,小行星带,大型宇宙舰和地方总部。雷电3的关卡不多,而且流程比较短,所以主要还是以刷新分数上限,挑战操作极限的目的为主,考验玩家的手速和反应能力,是一款极为经典的游戏,即使过去了十几年,《雷电3》仍然广受欢迎,各大应用商店的点击下载量还是很高,衍生出来的游戏更是数不胜数。

    

1.2  国内外研究现状

Java语言经过多年的发展,已经十分成熟。Java语言称霸企业级应用这门多年的事实证明了这门语言适合开发各种项目。当Java语言的运行效率随着发展再次提升了一大截后,Java语言的一系列优势就更加明显的体现出来了,比如:语言严谨,高抽象,可读性强等。

对于游戏开发,由于涉及到各种复杂的问题情况,经常遇到新的问题,所以在开发过程中,需要进行对代码进行不断的修改添加,这就需要可以随时随地的修改代码。而Java具有虚拟机特性,Java游戏本身可以用Java来写,例如,目前的BeanShell,Groovy和其他脚本语言可以很容易地,无缝地与Java语言的互动,我们可以通过脚本随时对游戏进行添加与删除,不必要重新开发某个模块。这是大大方便了Java游戏编程。

在游戏的发展中涉及到了大量的Java技术,某些技术现在已经淘汰,但是也有些技术一直在使用。如Sun公司较早推出了3D技术-- Java3D,是一个高度封装的API,OpenGL和Direct 3D都是基于Java3D的,可以说是最有名的3D Java技术;Jogl函数则是opengl接口对Java的实现;lwjgl函数(light weight Java game library)是将游戏图形(opengl)、音效(openal)、控制输入集合为一,以成为Java界的directx(不是direct3d)而努力;joal函数则是Java对openal的一个绑定,是Java音效的一个解决方案;jinput函数是Java对非标准输入设备(游戏手柄,操纵杆)的解决方案; Project Wonderland是Sun开发的一个3d虚拟世界构建工具等。

由于VR(Virtual Reality)虚拟现实的发展,对游戏的发展影响巨大。科幻电影小说中的科幻游戏玩法有可能成为现实,未来游戏也许不需要鼠标键盘,只需要一个类似VRBox的头盔设备即可完成指令的输入与输出。

1.3  项目主要工作

本次项目的题目——基于Java的飞机大战游戏的设计与实现,主要目的是实现飞机大战这个游戏。期望结果游戏无BUG现在人们将在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题统称为BUG——漏洞,简单易上手,老少皆宜,让玩家“玩不释手”。

从游戏的玩法来说,主要就是我方飞机(Hero airplane)和敌方飞机(Enemy airplane)的对决,首先是游戏的开始界面与结束界面,然后就是我方飞机(Hero airplane)的移动方式(鼠标移动或者键盘移动,我打算选择鼠标移动,因为鼠标移动可以转移到手机上,现在大多数手机都没有键盘,基本靠手指滑动操作),接下来就是我方飞机(Hero airplane)子弹的生成,然后是敌方飞机(Enemy airplane)的出现坐标的选择,然后飞机与子弹防碰撞,飞机与飞机的防碰撞,最后是我方飞机(Hero airplane)与敌方飞机(Enemy airplane)的对战结果。

该游戏要满足以下功能性需求:

(1)游戏状态控制功能

    游戏的状态控制包括运行、暂停、恢复及结束游戏,首先是游戏的开始页面,在游戏正在进行时,如果你有其他的事情又不想结束游戏你可以将鼠标移出游戏界面或者鼠标在游戏界面单击即可暂停游戏,当你的其他事情解决后你还可以选择恢复游戏,继续玩下去,当游戏结束时会显示游戏结束界面。

(2)游戏难度的调整

     玩家随着玩游戏的时间的增加,敌方飞机的数量会增加,出现的频率会有所提高,移动速度也会提高。

(3)游戏界面绘画功能

     在右上角显示游戏时间(游戏难度于时间成正比,即游戏时间越长难度越高),玩家游戏得分,与我方飞机生命值,游戏主屏用来显示玩家对我方飞机(Hero airplane)的控制与敌方飞机(Enemy airplane)的出现及移动的显示。

(4)玩家游戏控制功能

     玩家可以通过控制移动鼠标或者键盘来控制友机的移动。

1.4  本文组织结构

  本文的组织结构如下:

  第一部分介绍了本文的国内外背景。

  第二部分介绍了开发游戏项目涉及到的软件平台与开发语言。

  第三部分介绍了项目的需求分析。

  第四部分介绍了项目各个模块的实现。

  第五部分介绍了对软件测试的过程及结果,找到项目的优缺点。

3  可行性研究

可行性研究顾名思义,研究其的可行性。可行性研究是项目开发之前的重要阶段。在软件开发实践中,软件开发人员或者用户对市场的了解不充分,对技术的掌握不好,对进行开发的各项风险评估不足等因素,有些问题不能再预期下得到解决,造成不可预估的损失,为了避免盲目的软件开发和不必要的损失,相关人员需要对开发特定软件项目的可行性进行研究,结合资金、时间和环境等各方面的制约条件,对该软件产品是否能够解决存在的问题,是否能够带来预期的效果和价值做出评估。

3.1  技术可行性  

现在开发游戏的语言一般都是Java语言,为了保证开发出来的游戏可以在手机、Web浏览器、PC客户端等平台使用,所以就要求开发语言可以在多平台移植,而Java语言刚好符合这个特性。开发工具IntelliJ IDEA可以下载并且可以免费使用,Java的编译工具JDK也可以在Sun官网上直接下载安装,其过程十分简单。

3.2  经济可行性

配置较低的电脑也能进行Java游戏的开发,一台电脑就行,开发成本低。由于Java具有跨平台以及一次编译,到处运行的特点,开发出来的游戏可以放到各大游戏平台上发售,玩家可以在电脑,浏览器,手机等各种平台运行。而且软件维护简单,实用性强,一次开发使用,即可长久使用,当软件满足不了用户需求时,只需对用户的需求进行添加即可。  

3.3  操作可行性

本游戏操作简单,在电脑和浏览器上可以用鼠标键盘操作,在手机上可以用手触摸屏幕运行。

3.4  用户使用可行性

    本软件操作简单,对用户的要求,不需要多强技术能力。

3.5  法律可行性

信息产业部已将游戏通用引擎研究及示范产品纳入国家“863计划”,这是中国首次将游戏技术纳入国家科技计划当中。

4  需求分析

需求分析是对即将开发的系统确定一个完整的,准确的要求。需求分析的结果是否完美解决了用户的问题,将直接影响到后面的进程,并影响到设计结果是否能让用户接受。软件需求分析对软件系统提出了清楚、准确、全面而具体的要求,是对软件使用者意图不断进行揭示与准确判断的过程,它并不考虑系统的具体实现,而是严密地、完整地描述了软件系统应该做些什么的一种过程。

4.1  系统需求概述

飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。

基于Java的飞机大战游戏的设计与实现有以下几个模块:

    (1)游戏状态控制功能模块 

    (2)游戏难度的调整模块 

    (3)游戏界面绘画功能模块

    (4)玩家游戏控制功能模块

4.2  功能模块设计

4.2.1  游戏状态控制功能模块 

游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游戏就会结束,弹出游戏结束界面。

4.2.2  游戏难度的调整模块 

玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。

4.2.3  游戏界面绘画功能模块

左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示

4.2.4  玩家游戏控制功能模块

 玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。

4.3  游戏难点分析

4.3.1  绘图美化

清新靓丽的游戏界面将给用户带来愉悦的美感。因此,在这个游戏中,主要参考原始的游戏画面,敌我飞机的形象也应该是美丽的。

4.3.2  多线程技术的实现

应用程序线程机制的基石,实现了游戏,游戏的刷架的控制,装上各种角色的资源和背景(如飞机,机友)的要求,以实现整个游戏实现自动控制线程 控制。

4.3.3  防碰撞问题的解决

例如,敌方飞机与玩家飞机防碰撞,敌方飞机与玩家飞机防碰撞,等等。防碰撞检测技术实现在不同情况下,有不同的防碰撞检测方法。

4.3.4  动画的实现

用图片的阵列,动画切片变换形成。图像阵列,千变万化的图像画在画布标,使动画,这是一个图像的形成阵列。使用切片来实现动画,所有的帧都放置在相同的图像中,以达到爆炸的效果。

5  飞机大战功能实现

5.1  模型图

基于Java的飞机大战游戏的设计与实现_第1张图片

                         

              

图1-1  飞机大战游戏的模型图

5. 2  软件功能模块

基于Java的飞机大战游戏的设计与实现_第2张图片

图1-2  飞机大战游戏的软件功能模块图

5.3 游戏首页的实现

5.3.1 界面实现

    飞机大战的界面如图1-3所示。

基于Java的飞机大战游戏的设计与实现_第3张图片

图1-3 飞机大战游戏开始界面

5.3.2  流程图

    游戏开始的流程图如图1-4所示。

基于Java的飞机大战游戏的设计与实现_第4张图片

图1-4  游戏初始化流程图

5.3.3 核心代码

游戏初始化代码如下:

\*

*   写于3月20日,主要目的:完成游戏的初始化过程

*\

public final void paint(Graphics g) {

      g.setColor(this.bgColor);

      g.fillRect(x, y, width, height);

      g.setColor(this.fgColor);

      g.drawRect(x, y, width, height);

      this.paintBoxContents(g);

}

private void paintBlock(int x, int y, int blockType, Graphics g) {

      int blockX = this.boardX + (this.blockSize * x);

      IntblockY=this.boardY+(this.blockSize*(y-TetrisConstants.TOP_

      VISIBLE_ROW));

      if(TetrisConstants.BLOCK_EMPTY != blockType) {

            g.setColor(TetrisConstants.COLOR_BLACK);

            g.fillRect(blockX + 1, blockY + 1, this.blockSize - 1, this.

            blockSize - 1);

            this.setColor(blockType, g);

            g.fillRect(blockX, blockY, this.blockSize - 1, this.blockSize - 1);

            }

else {

            g.setColor(TetrisConstants.COLOR_WHITE);

            g.fillRect(blockX, blockY, this.blockSize, this.blockSize);

            }

      }

5.4 游戏开始模块的实现

5.4.1 界面实现

飞机大战的开始界面如图1-5所示。

基于Java的飞机大战游戏的设计与实现_第5张图片

图1-5  飞机大战开始界面

5.4.2 流程图

流程图如图1-6所示。

基于Java的飞机大战游戏的设计与实现_第6张图片

图1-6  游戏开始模块程序流程图

5.4.3 核心代码

下面是游戏开始模块的功能代码,如下:

\*

*   写于3月27日,主要目的:完成游戏的开始界面

*\

private int clearCompletedRows(TetrisPiece piece) {

TetrisBoard board = this.getBoard();

for(int i = 0; i < TetrisConstants.FOUR_BLOCKS; i++) {

int rowY = piece.getBlockY(i);

if(board.checkRowCompleted(rowY)) {

this.markRowCompleted(rowY, true);

}

}

int numClearedRows = 0;

for(int y = TetrisConstants.HEIGHT - 1; y >= 0; y--) {

if(numClearedRows > 0) {

board.dropRow(y, numClearedRows);

}

if(this.isRowCompleted(y)) {

numClearedRows++;

this.markRowCompleted(y, false);

}

}

for(int i = 0; i < numClearedRows; i++) {

board.clearRow(i);

}

return numClearedRows;

}

5.5 发射子弹模块的实现

5.5.1 界面实现

    发射子弹界面实现如图1-7所示。

基于Java的飞机大战游戏的设计与实现_第7张图片

图1-7  发射子弹界面

5.5.2 流程图

    流程图如图1-8所示。

基于Java的飞机大战游戏的设计与实现_第8张图片

图1-8  发射子弹模块程序流程图

5.5.3 核心代码

    发射子弹实现代码如下:

\*

*   写于4月5日,主要目的:完成游戏的子弹的自动发射

*\

    public void rotate(int pivotX, int pivotY, boolean rotateDirection) {

if(TetrisConstants.ROTATION_TYPE_TOGGLE == this.rotationType) {

// 如果翻转类型为TOGGLE

rotateDirection = this.rotationToggle; //判断翻转方向

this.rotationToggle = !this.rotationToggle; // 如果与canRotate匹配,

               中心点方块将被使用

}

// 重构四个小块,每个都转动

for(int i = 0; i < TetrisConstants.FOUR_BLOCKS; i++) {

int blockX = this.getBlockX(i);

int blockY = this.getBlockY(i);

//  左旋转:交换x和y坐标,x坐标取反

//  右旋转:交换x和以坐标,y坐标取反

int dx = blockY - pivotY;

int dy = blockX - pivotX;

if(rotateDirection) {

// 如向左旋转

dx *= -1;

} else {

// 如向右旋转

dy *= -1;

}

int rotateX = pivotX + dx;

int rotateY = pivotY + dy;

this.setBlockCoords(i, rotateX, rotateY);//得到翻转后的新坐标

}

}

    选中敌机目标后,开始发射子弹。在TetrisBoard.Java中的checkRowCompleted()方法实现了此功能,其代码如下:

    public boolean checkRowCompleted(int rowY) {

for(int x = 0; x < TetrisConstants.WIDTH; x++) {

if(TetrisConstants.BLOCK_EMPTY == this.getBlockType(x, rowY)) {

// 选中目标,发射子弹

return false;

}

}

return true;

}

    当击中敌机后,积分就会有所变化,计算并显示出用户当前的分数。同时等待玩家键入数字,选择游戏难度开始新的游戏。其实现由init()方法控制,其代码如下:

\*

*   写于4月12日,主要目的:完成游戏的难度选择

*\

private void init() {

this.board = new TetrisBoard();

this.gameCanvas = new TetrisCanvas(this);

this.activePiece = new TetrisPiece();

this.completedRows = new boolean[TetrisConstants.HEIGHT]; //初始化数组

this.hiScore = this.openAndReadHiScore();

this.nextPieceType = TetrisConstants.UNINITIALIZED;

this.rand = new Random();

// 设置exit/pause/resume命令

this.setuPCommands();

this.gameCanvas.addCommand(this.exitCommand);

// 显示title屏

this.setGameState(TetrisConstants.TITLE_STATE);

}

5.6 积分模块的实现

5.6.1 界面的实现

 飞机大战积分模块界面如图1-8所示。

基于Java的飞机大战游戏的设计与实现_第9张图片

     

图1-8  积分模块

5.6.2 核心代码

    积分板实现代码如下:

\*

*   写于4月16日,主要目的:完成游戏的积分模块

*\

public void drawCount(Graphics g){

g.setColor(Color.white);

Font font = new Font("宋体", 1, 20);

g.setFont(font);

g.drawString("积分:" + this.score, 0, 470);

}

实现积分的增长:

if (burst != null)

burst.draw(g_off);

for (int i = 0; i < list.size(); i++) {

Role chara1 = (Role) list.get(i);

if (chara1.isDead()) {

if (chara1 instanceof Enemy)

{

chara1.drawBurst(g_off);

this.battle.score++;

}

list.remove(i);

}

}

全屏爆炸时,计算炸死几个敌人增长分数:

if(GamePanel.skillCount>0){

for (int i = 0; i < GamePanel.list.size(); i++) {

Role chara1 = (Role) GamePanel.list.get(i);

if(!(chara1 instanceof Battle) && chara1.x>0 && chara1.y>0     

          && !(chara1 instanceof BossA)  && !(chara1 instanceof BossB)  

          && !(chara1 instanceof BossC)){

GamePanel.list.remove(i);

if(chara1 instanceof Enemy){

this.score++;

}

实现积分的输出:

private void gameOver() {

GamePanel.skillCount = 10;

if (Key.enter) {

gameMode = 12;

stage = 1;

} else {

g_off.setColor(Color.white);

Font font = new Font("黑体", 1, 28);

g_off.setFont(font);

FontMetrics fontMetrics = getFontMetrics(font);

g_off.drawString("Game Over", (450 - fontMetrics

.stringWidth("Game Over")) / 2, (500 + fontMetrics

.getHeight()) / 2 - 50);

String score = "Score: " + this.battle.score;

g_off.drawString(score, (450 - fontMetrics

.stringWidth(score)) / 2, (500 + fontMetrics

.getHeight()) / 2 - 20);

if (15 <= current % 50)

g_off.drawString("请按 回车", (450 - fontMetrics

.stringWidth("请按 回车")) / 2,

(500 + fontMetrics.getHeight()) / 2 + 100);

}

}

5.7 防碰撞逻辑 

    判断飞机是否中弹的逻辑非常简单就是在绘制飞机与子弹的时候判断两个图片是否存在重合的部分,如果存在则玩家生命值减一,之后将中弹飞机从飞机队列中删除,子弹同样的处理。  

5.7.1 核心代码

防碰撞逻辑核心代码如下:

\*

*   写于4月24日,主要目的:完成游戏的防碰撞模块

*\

public boolean checkHit(Role chara) {

if ((chara instanceof EnemyA) || (chara instanceof EnemyB)|| (chara

         instanceof EnemyC) || (chara instanceof EnemyShot)) {

if ((x + WIDTH) - 14F > chara.x && x + 14F < chara.x +

               chara.WIDTH

&& (y + HEIGHT) - 12F > chara.y

&& y + 12F < chara.y + chara.HEIGHT) {

//如果碰到敌人,敌人死亡

chara.dead();

//如果碰到子弹血量减少

if (chara instanceof EnemyBeam){

power--;

}

power -= 50;

if (power <= 0) {

dead();

//绘制爆炸图片

GamePanel.burst = new Burst(x, y);

}

return true;

}

5.8 游戏操作的实现

本游戏操作采用鼠标/键盘的移动来实现玩家飞机的移动。

5.8.1 核心代码

游戏操作实现代码如下:

\*

*   写于4月23日,主要目的:完成游戏的游戏操作

*\

public void move() {

oldx = x;

oldy = y;

if (Key.left) {

if (Key.xkey)

x -= (double) speed / 4D;

else

x -= speed;

if (x <= 0.0F)

x = 0.0F;

}

if (Key.right) {

if (Key.xkey)

x += (double) speed / 4D;

else

x += speed;

if (x + WIDTH >= (float) app.getWidth())

x = (float) app.getWidth() - WIDTH;

}

if (Key.down) {

if (Key.xkey)

y += (double) speed / 4D;

else

y += speed;

if (y + HEIGHT >= (float) app.getHeight())

y = (float) app.getHeight() - HEIGHT;

}

if (Key.up) {

if (Key.xkey)

y -= (double) speed / 4D;

else

y -= speed;

if (y <= 0.0F)

y = 0.0F;

}

5.9  特殊NPC蜜蜂

\*

*   写于4月30日,主要目的:完成游戏的特殊NPC的添加

*\

package com.tarena.fly;

import Java.util.Random;

/**蜜蜂*/

public class Bee extends FlyingObject implements Award{

private int xSpeed=1;//x坐标移动速度

private int ySpeed=2;//y坐标移动速度

private int awardType;//奖励类型

/**初始化数据*/

public Bee(){

this.image=ShootGame.bee;

width=image.getWidth();

height=image.getHeight();

y=-height;

Random rand=new Random();

x=rand.nextInt(ShootGame.WIDTH-width);

awardType=rand.nextInt(2);//初始化时给奖励

}

/**获得奖励类型*/

public int getType(){

return awardType;

}

/**越界处理*/

@Override

public boolean outOfBounds(){

return y>ShootGame.HEIGHT;

}

/**移动,可斜着飞*/

@Override

public void step(){

x+=xSpeed;

y+=ySpeed;

if(x>ShootGame.WIDTH-width){

xSpeed=-1;

}

if(x<0){

xSpeed=1;

}

}

}

6  系统测试

测试是处在开发阶段的最后部分,是保证软件质量的重要手段。软件测试是一个软件应用程序或一个所谓的条件处理和评估在控制条件(包括正常条件和非正常条件)下操作并评价其结果的过程。软件测试过程中应当故意诱导程序发生错误,正常情况下它虽然不应该存在,但是不确定它有可能在任何时候出现。从本质上说,软件测试是“探测”发现“探针”的问题。

6.1 测试的定义及其重要性

6.1.1 测试的定义

软件测试是一项为了给利益相关方提供有关产品质量或者是正在测试的服务的信息而进行调查的过程。软件测试也可以提供一个客观,独立的视角来看待软件,以便让企业知晓并理解软件实现过程中可能存在的风险。软件测试技术是一种带着为了发现软件或者程序的BUG(错误或者其他的缺陷)的态度来运行一个程序或者应用的过程。

软件测试涉及一个软件组件或系统组件的执行,以评估所关注的对象的一个或多个属性。在一般情况下,这些属性表明该组件或系统被测试的程度:

1.满足其设计和发展的需要。

    2.对各种输入进行正确的相应。

3.在用户可容忍的时间内实现其功能。

4.所有功能都能满足使用。

5.可以在预定的环境中完美安装并运行。

6.可以实现如其利益相关者所期望的正常结果。

由于即使对简单的软件组件所进行的测试数量都是数量巨大的,所有的软件测试都运用一些策略去挑选那些无论在时间是对资源都是合适的测试用例。其造成的结果是,软件测试通常(但也不排除其他情况)尝试着带着为了发现软件BUG(错误或者其他的缺陷)的态度来运行一个程序或者应用。当BUG不被解决时,需要反复进行软件测试的工作。它可能解决其他更深层次的BUG,但也可能会使得程序出现新的BUG。

软件测试可以为用户和赞助商提供有关软件质量和可能存在的风险等级的信息。当然,这种信息是相对客观,独立的。

软件测试可以为用户和赞助商提供有关软件质量和可能存在的风险等级的信息。当然,这种信息是相对客观,独立的。例如,例如,在软件开发的不同阶段,大部分的测试工作总是在系统需求已经被明确定义时才开始的,然后在测试过程中实现。与此相反,Agile(敏捷开发,是一种对于经常被用于在线应用程序的开发模型的涵盖性术语)方法下,需求,分析,编程和测试经常同时进行。

6.1.2 测试的重要性

   尽管测试可以在某些特定假设的前提下,确定了软件的正确性,但是测试还是不能找出软件中所有的缺陷。相反,有些人也许可能会注意到这些问题,它对产品的申明和行为进行评论或与其他产品对照比较,看是否违反了Oracle公司的原则。这些Oracle的原则可能包括(但不限于)规范,合同,类似的产品,过去同一版本的产品,预期的计划或预期的目的,用户或客户的期望,相关标准,适用法律或其他标准。

测试的主要目的是检测软件故障,使得缺陷被发现并且纠正。测试不能证明在所有条件下,软件或者程序都能正常的运行,它只能检测到在某种特定情况下,软件或者程序不能正常工作。软件测试的范围通常包括代码的检查以及在各种环境和条件的代码的执行情况以及检查的代码功能:什么是它应该做的,如何让它做需要它做的。在软件开发的当前环境中,检测团队可以独立于开发团队之外。从软件测试得出的信息可被用来校正开发软件的过程,防止出现无法挽回的错误。

每个软件产品都有一些特定的用户。例如,用户对视频游戏软件和银行软件有完全不同的看法。因此,当一个组织开发或以其他方式投资一个软件产品时,软件测试可以评估它的最终用户,购买者或者其它利益相关者是否会接受该软件产品。软件测试是试图评估这一信息的过程。

并非所有的软件缺陷是由编码错误引起的。往往因为一些错误会付出巨额的代价,这些错误常见的原因之一就是出现在需求方面,例如,程序员没有完全理解需求,从而导程序设计开发时与用户出现分歧。需求的差距往往来自非功能性需求,如可测试性,可扩展性,可维护性,可用性,性能和安全性。

软件故障,在下述情况是发生:程序员犯了一个错误(失误),这将导致在本软件的源代码中出现一个缺陷(故障,错误),如果执行这种有缺陷的代码,在某些情况下,系统会产生提示出现错误,从而引起了故障。当然并非所有缺陷都将导致故障的发生。例如,死代码缺陷永远不会导致故障。当环境变化时的缺陷可以成为一个失败的关键。这些在环境变化的例子中包括软件在新的计算机硬件平台运行,源代码的改变,或用不同软件进行交互,一个简单的缺陷可能导致一个软件的失败。

软件测试的基本问题是:即使一个简单的产品,用所有的输入组合和先决条件(初始状态)进行测试是不可行的。这意味着一个软件产品的缺陷数量可以是非常巨大的,而且很多缺陷是难以在测试中发现的。更重要的是,非功能性的属性(它应该做什么与它如何做)如 可用性,可扩展性,性能,兼容性,可靠性是高度主观的; 一个人可能接受其中一个属性的价值却不能认同另外一个。

软件开发人员无法测试所有的东西(所有的输入组合和先决条件),但他们可以使用组合测试设计,来确定他们想要覆盖测试所需的最小数量。组合测试设计,使用户用很少的测试用例能够获得很大的测试覆盖率。他们可以使用组合测试设计的方法来构建他们的测试用例,是他们的测试速度与测试深度有很大的提升。

6.2 测试方法

软件测试可用许多方法。回归,演练,或校对被称为静态测试,而实际执行程序代码与给定的测试案例被称为动态测试。静态测试往往是隐含的,如校对,再加上编程工具/文本编辑器查看源代码结构或编译器(预编译器)检查语法和数据流的静态程序分析。当程序在运行时动态测试发生。动态测试可以在程序100%完成前开始测试,以便测试特定的代码,也可以应用于分散的功能或者模块中。这个典型的技术使用驱动程序或在调试环境下执行。

程序测试的主要方法分为两大类:白盒测试和黑盒测试。

白盒测试(也称为清晰盒测试,玻璃盒测试,透明盒测试和结构测试)可以观察源代码,测试内部结构或程序的运作,而不是暴露终端用户的功能。白盒测试系统,用于设计测试用例,以及透视内部编程的技巧。测试器通过选择路径输入代码来确定相应的输出。这类似于在测试一个电路节点,例如:电路测试(ICT)。

而白盒测试可以应用于单元测试,集成测试和系统测试的软件流程,但是它通常在单元级别进行的。它可以在集成单元和子系统之间的测试路径上进行系统级别的测试。虽然这种方法测试设计可以发现许多错误或问题,但是它可能无法规范检测到或遗漏需求分析未实现的部分。

在白盒测试中使用的技术包括:

  • API测试 -通过公共和私人的应用测试的API(应用程序编程接口)
  • 代码覆盖率 -创建测试,以满足代码覆盖率的一些标准(如:测试设计人员                                                                                    可以创建测试,以使程序中所有的语句至少执行一次)
  • 故障注入方法-有意引入故障来衡量测试策略的效果
  • 突变检测方法
  • 静态测试方法

代码覆盖工具可以评估任何方法,包括创建了一个完整的测试套件的黑盒测试方法。这允许软件团队可以很少对测试进行检查,只确保对最重要的一个系统的部分功能点进行检验即可。代码覆盖率常作为衡量测试好坏的指标,甚至用代码覆盖率来考核测试任务完成情况:

  • 功能覆盖,函数是否执行
  • 语句覆盖,语句是否执行
  • 判定覆盖,对程序中每个判定条件的真分支和假分支至少进行一次判定

100%的语句覆盖,确保所有的代码路径或分支(在以下方面控制流程)至少执行一次。这对于确保功能的正确有很大的帮助,但是对于相同代码有可能因为输入的不同而有不同的结果。

黑盒测试把软件作为一个“黑盒子”,具有审查的功能,而有关内部实现的任何细节都不清楚,也看不到其源代码。该测试人员只了解该软件的功能与作用,而不清楚它是如何具体实现的。黑盒测试方法包括:等价类划分,边界值分析,全局测试,状态表转移,决策表测试,模糊测试,基于模型的测试,用例测试,探索性测试和基于规范的测试。

基于规范型的测试旨在去测试软件关于适应性要求方面的功能。这种级别的测试通常需要测试人员提供全面的测试用例,然后只需验证其中一个给定的输入值,输出值(或行为),不管在测试用例中与期望结果是否相同。测试用例的选取是建立在规范和要求下的,也就是说,应用程序应该做什么。它使用的软件的外部描述,包括规格,要求,和设计以获取测试用例。这些测试虽然有时有用,有时无效,但是通常是有用的。

基于规范的测试可能只能检测其功能的有效性和正确性,但它不足以应对复杂或高风险的情况。

黑盒测试技术的一个优点是不需要专业的编程知识。即使编写程序的编程人员与测试人员有鸿沟一般的编程差距,但是测试人员总能从不同的方面给出相应的建设性意见。在另一方面,黑盒测试的过程可以被说成是“摸着石头过河。” 因为不需要检查程序的源代码,所以在某种情况下,测试人员需要写很多测试用例来检查程序,但是该程序只能被一种测试用例来测试或者只能测试程序的部分功能。

测试的这种方法可以应用到软件测试的各个方面,例如:单元测试,集成测试,系统测试和验收测试。它虽然不能包括测试过程中的所有流程,但是在单元测试中却保持着绝对的优势。

6.3 测试结果

软件评价是指软件在正式运行了一段时间之后,对它在功能上、技术上和经济上所进行的审核评价。针对本软件的评价如下:

(1)软件功能评价

根据这套软件开发前的目标,试运行完成后软件后,软件达到了预定的发展目标,在实际使用功能可满足用户的需求。

(2)软件技术评价

该软件设计合理,功能达到预期目标,软件后运行稳定,可靠,安全,实用。

(3)软件经济评价

在规定时间内,该软件完成后,软件分析,以确定软件的发展目标,符合设计要求,投入使用,为用户节省了大量的人力,物力和财力,提高科学管理水平。

7  结论

本次毕业设计到此已经顺利结束。通过这次毕业设计,我学习到了很多东西。在以前的三年课程中我学到了很多课程,从开始的计算机理论基础,到C语言,数据结构,C++,Java,数据库系统概论等。虽然通过学习对这些课程都是比较肤浅的了解,而且也只是停留在堆理论只是的理解阶段,对其掌握程度还不够前面和熟悉。这次毕业设计,使我将大学四年中所学的课程贯穿整合起来,同时在设计中还涉及到一些之前没有学习过的新知识。对这些新知识的学习培养了我快速自学和应用新知识的能力。本次毕业设计不仅仅是我对所学知识的一次综合应用,更是对我综合分析试剂问题、处理实际问题的能力的培养和锻炼。

本次设计运用了Java相关知识及软件工程的思路进行开发。在实现功能的同时更加侧重于对开发Java游戏的研究。由于时间、条件有限,经验不足等,本文所做的工作还有很多不足之处,还需要进一步学习和研究。

你可能感兴趣的:(java,游戏,intellij-idea)