1、坦克大战,一个众所周知的小游戏,曾经在红白机时代风靡一时。其界面简单,耐玩,关卡多,可玩性高,没有局限的年龄层。Java是现在全球最时髦的开发工具之一,它拥有庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机,总之,Java的出现,确实给整个程序界带来了巨大的冲击,也许现在还无法准确评估Java为整个IT业带来的影响,但是有一点毋庸置疑Java将不可避免的影响一带程序员。使用Java作为开发工具,来做坦克大战这个小游戏,是一种很理性的选择。Java游戏可以在本地桌面系统下运行,也可以在Web浏览器下运行。我在大学四年中学到了很多计算机的知识,JAVA语言,软件
2、工程,数据结构,软件工程等课程。如今我将用我所学的知识来完成一个坦克大战游戏,来锻炼自己的动手能力,独立作出一个小程序。1.2 课题研究的任务本文中所做的主要工作如下:(1)介绍了制作坦克大战游戏的意义和目的。(2)设计坦克大战游戏各个类,实现各类效果和目标。(3)分析并解决游戏中的若干技术问题。(4)完成坦克大战游戏,进行测试并分析结果.第二章 系统分析2.1课题的可行性分析1、课题要求(1)与实践活动和相关的文件和资料由教师提供。(2)本课题要求学生有熟练的Java开发能力,有较强的自学能力。(3)具体问题再做详细调查研究并与指导老师面谈。2、可行性分析技术可行性:游戏对机器没有多大要求,
3、现在无论什么电脑,只要能安装J2SDK,就能在电脑上开发这款游戏。制作出来的游戏可以在本地桌面运行,也可在WEB上运行,现在JAVA语言非常成熟,完全能够完成这个游戏。经济可行性:开发这个游戏除了耗费自己的时间和精力以外,不需要其他的资金问题,完成后放到网上开放下载,无需任何费用,有兴趣的人可以自己下载来玩。2.2需求分析 在游戏中需要实现的功能:(1)能够通过键盘自由控制坦克移动和发射子弹;(2)敌方坦克能够随机移动和随机发射子弹;(3)子弹和不同阵营坦克碰撞后会产生爆炸;(4)消灭敌方坦克后会有个计分板记录玩家得分(5)游戏进行到一半时可以暂停退出,下次打开游戏时选继续游戏可以继续之前的游
4、戏。第三章 系统总体设计3.1 游戏总体流程设计开始新游戏时,先进行初始化,然后调用敌方坦克类和我方坦克类,实现键盘监听功能,战场显示所有坦克的移动,发射子弹。判断子弹和敌方坦克的碰撞,调用爆炸类,调用记录类,修改玩家总得分。图3.1 总体流程图3.2游戏界面设计(1)开始菜单界面左上角设置个游戏菜单,里面含有“开始新游戏”、“继续游戏”、“存盘退出”、“退出游戏”这几个下拉选项,玩家可通过这些选项控制游戏的开始,存盘,与结束。图3.2 开始菜单 (2)战场 窗口中间是坦克大战的战场,里面显示敌我双方坦克,以及各自发出的子弹,坦克的一切行为都会显示在战场上。图3.3 战场 (3)坦克剩余数 战
5、场正下方显示我方坦克剩余生命和敌方坦克剩余数量。图3.4 坦克剩余数 (4)玩家总成绩 战场右边显示玩家击毁敌方坦克所得到的的总成绩。图3.5 玩家总成绩第四章 游戏详细设计4.1各个类的设计(1) 坦克类是系统中最主要的一个类,坦克的属性:速度(X轴和Y轴速度),坦克的大小,坦克所在坐标,坦克的方向,坦克存活与否。这些属性都有一个初始化值,游戏一开始就可以运行。 设计过程中,坦克出现的位置是由坦克的坐标而定。玩家的位置由键盘监听方向,按照指定方向以一定的速度前进这个速度是全局静态变量,当没有键盘控制的时候,坦克就会保持静止。敌方的坦克是用随机数来控制方向和路径的。通过TouchotherEn
6、emy()来判断是否碰撞到别的敌方坦克。 我方坦克的方向和子弹发射都是由键盘来控制,所以在坦克类里用keypressed()方法来接受键盘的按键监听,接受到相应的信息后,例如接到X,则表示发射子弹,此时就要调用坦克类里的fire()方法。接受到方向键,则会对坦克坐标做出相应的变化。图3.1 坦克类图3.2红色我方坦克 黄色敌方坦克(2)子弹类需要依附坦克类,每个坦克都可以发射子弹,子弹的方向和速度都在子弹类里。当子弹碰到敌方坦克或跑出战场后,子弹线程便会结束。图3.3 子弹类图3.4 红色我方子弹 黄色敌方子弹(3)爆炸类是取决子弹类。每当子弹碰到敌方坦克时,子弹线程结束,并调用爆炸类,爆炸类
7、会读取坦克即时的坐标,并用连续的三张图片显示出爆炸效果。图3.5 爆炸类4.2 程序的其他设计(1)图形用户界面要用抽象窗口工具AWT和Swing来实现,在选择开始新游戏前,实现屏幕中央关数的闪屏效果。class StartPanel extends JPanel implements Runnable int time=0; public void paint(Graphics g) super.paint(g); g.fillRect(0, 0, 900, 600); if(time%2=0) g.setColor(Color.yellow); g.setFont(new Font(宋体,
8、Font.BOLD,30); g.drawString(stage:1, 400, 250); Override public void run() / TODO Auto-generated method stub while(true) try Thread.sleep(100); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); time+; /重画 this.repaint();(2)游戏开始时播放经典坦克大战的游戏音。 AePlayWave apw=new AeP
9、layWave(111.wav); apw.start();第五章 测试5.1 软件测试说明软件测试是对软件需求分析、设计和编码的审查,通过全面的测试,发现各阶段的问题。软件分析、设计、编码是为了建立一个系统结构,实现系统;而测试主要任务是实现软件开发问题,“破坏”已经做好的软件系统。都是为了能够做出一个好的软件系统。5.1.1 软件测试的目标如今对于软件大家都明白,不可能存在没有缺陷的软件。软件是人开发出来的,人不可避免的会产生错误,而产生软件缺陷。软件缺陷可能在项目初期就存在了。随着软件不断的开发,缺陷造成的影响不断扩大,可能造成无法弥补的损害。所以,软件测试的目标是:以最少的代价找出软件
10、存在的错误和缺陷。在软件系统的开发过程中,软件测试是保证软件质量的关键,它是需求分析、设计和编码的最后审核。确实做到尽可能的将软件中存在的问题找出来,以保证软件质量。5.1.2 软件测试的原则软件测试需要一些原则,Myers提出了以下几个测试原则:1. 程序不能由其程序员来测试。测试是为了找错。从心理学角度上讲,程序员对自己做的程序会觉得不会有多少错误。而且如果程序员的理解错误,程序员自己测试肯定是查不出错误的。2. 在程序测试时,测试人员应有正确的输入和明确的输出结果。3. 程序测试需要合理的输入数据,也要不合理的输入数据。保留素有的测试案例,并作为一个软件组件。花费相当多的精力来射击测试用
11、例。不加以保存,一旦程序错误修正或改进需要重新测试,就要重复上述工作。这是不是太浪费了,人们一般不愿重新设计测试用例,测试时难免会没有第一次测试那么认真。这往往无法发现因修改而产生的缺陷。程序中有错误的概率和在那段程序中已经发现的错误成比例。程序中的错误总是一起出现,对这种现象,现在还没有令人满意的解释。但这样的现象表明,为了提高测试的效率,应当特别对待那些容易出错的程序段。5.2 测试计划5.2.1 进行通过测试在软件测试过程中,我们要明白软件能够做什么,不会去测试额外的功能。因此用最简单的测试计划,来检测软件基本功能的运行。5.2.2 进行有效类测试在保证软件能够正确运行之后,就能用各种“
12、非正常”操作和数据来暴露缺陷。纯粹是为了破坏软件而设计的测试。5.3 测试用例打开坦克大战的运行文件,可看到新开启的窗口如下。图5.1 开始窗口打开游戏下拉选框,可看到“开始新游戏”、“退出游戏”、“存盘退出”、“继续游戏”这几个选项。图5.2 开始选项框点击开始新游戏即可开始游戏,并且能听到游戏开始的声音,能看到界面上显示出来的信息,通过上下左右可以操作我方坦克的移动,按住方向键不动,坦克会不停的向那个方向移动。图5.3 坦克的移动按X键可以发射子弹,子弹会击毁地方坦克,图为敌方坦克爆炸。图5.4 坦克的爆炸我方坦克最多发射5发子弹,必须等子弹消失后才能再次发射子弹。图5.5 坦克的子弹系统
13、可以保存退出,记录坦克的坐标,玩家总成绩。图5.6 存盘退出总 结 经过这两个月的学习,研究和开发,坦克大战游戏的基本功能已经实现出来。玩家可以通过操作坦克去击毁敌方坦克,游戏开始有游戏音效,坦克被击毁时有爆炸效果,可以存盘和读档。因为自己知识上的欠缺,最开始设想的一些内容无法实现,但还是可以基本完成坦克大战的功能。通过这次坦克大战的毕业设计我学到了许多知识,第一次独立完成了一个小项目,过程中碰到了一些麻烦和不足,都在同学和老师的帮助下一一找到了解决的方法。从碰到难题,到自己查书,到与同学讨论,再到向老师请教,使得我的毕业设计不断的完善,并且学到了宝贵的知识。参考文献1 Java语言编程基础教
14、程宋振会 编著,清华大学出版社20052 Java 语言程序设计郎波 编著,清华大学出版社 20053 Java 核心技术卷:基础知识 Cay S.Horstmann、Gary Cornell 编著,机械工业出版社 20084 Java游戏设计2荣钦科技 编著,清华大学出版社5 Java JDK实例宝典夏先波 编著,电子工业出版社20076 Java面向对象编程孙卫琴 编著,电子工业出版社 20067 Java编程思想(第4版)(美)埃克尔 编著,陈昊鹏 译,机械工业出版社 20078 Java编程模式与范例严桂兰 刘波 刘甲 编著,机械工业出版社 20029 优秀动漫游戏系列教材交互式漫游动
15、画-Virtools+3ds Max虚拟罗建勤 张明 编著 201010 锐风行技法 3ds Max/After Effects 电视品牌形象包装完全解码肖艺 孙春星 雷荣祖 编著, 人民邮电出版社 2010.11 Java 典型应用彻查1000例-图形与网络游戏开发(DVD)贾蓉生 胡大源 林金池 编著,科学出版社 2009致谢经过两个多月的辛苦忙碌,本次毕业设计完成了,由于经验匮乏和业务逻辑不熟悉,难免会有很多考虑不周到和不完善的地方,但在指导老师和同学的帮助下许多问题都得以解决,在此本人要特别感谢他们对我的帮助。首先我的毕业设计能够顺利完成,和李林老师的全力指导和热心帮助是分不开的,无论
16、是在初期的设计阶段还是后期的运行阶段都得到了李林老师的鼓励和帮助,在毕业设计过程中,给我提示游戏设计的逻辑思路;给我提供参考书籍;给我提供了很多技术资料。在碰到问题时,总是鼓励我迎难而上。特别是论文格式的修改,让我明白了一个标准的论文,其格式的重要性,哪怕是一个标点符号都要严格要求。没有李林老师的帮助,我是做不出这次毕业设计的。其次我还要感谢大学四年来的所有老师,为我们打下的基础。以前总觉得学习的课程用处不大,但当自己真正去完成一个设计的时候,才发觉每门课程的重要性。然后我要感谢我的几位同学,在毕业设计的开发过程中,但我遇到难题时,他们给予我支持,鼓励和帮助,帮忙查阅资料,与我共同解决难题。通
17、过这次毕业设计,不仅完成了我的学业,更重要的是让我从开始的需求分析到具体功能的实现,再到最终的测试和维护的软件工程有了进一步的的理解,这种思维方法对我的思想产生了极大的影响。我的动手能力和独立解决问题的能力得到了很大的锻炼和提高。我还要感谢学校提供这次毕业设计的机会,让我在学业即将结束的时候有认识自己的机会,意识到自己的优势和不足,在这次毕业设计中明白了责任的重要性,从而提高了自己的责任心。最后,感谢答辩组对我的毕业设计的考核,如能够得到答辩老师们的认可,即是对我的学习和工作最大的鼓励。你们的客观评价和建议一定牢记于心,在今后的工作中,更加严格要求自己。附录一 坦克大战中的类敌人坦克类pack
18、age myTankGame;import java.util.*;import java.io.*;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;class AePlayWave extends Thread private String fi
19、lename; public AePlayWave(String wavfile) filename = wavfile; File soundFile = new File(filename); AudioInputStream audioInputStream = null; try audioInputStream = AudioSystem.getAudioInputStream(soundFile); catch (Exception e1) e1.printStackTrace(); return; AudioFormat format = audioInputStream.get
20、Format(); SourceDataLine auline = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); auline = (SourceDataLine) AudioSystem.getLine(info); auline.open(format); catch (Exception e) e.printStackTrace(); auline.start(); int nBytesRead = 0; byte abData = new byte512; while (nByte
21、sRead != -1) nBytesRead = audioInputStream.read(abData, 0, abData.length); if (nBytesRead = 0) auline.write(abData, 0, nBytesRead); catch (IOException e) finally auline.drain(); auline.close(); /敌人坦克点和方向构成的对象类(记录点)class Node int x; int y; int direct; public Node(int x,int y,int direct) this.x=x; thi
22、s.y=y; this.direct=direct;/记录类,同时可以保存玩家的设置class Recorder /记录没关有多少敌人 private static int enNum=20; /设置我有多少生命值 private static int myLife=3; /记录总共消灭多少敌人 private static int allEnNum=0; private static Vector ets=new Vector(); public static Vector getEts() return ets; public static void setEts(Vector nodes
23、=new Vector /完成读取任务 getNidesAndEnNums() fr=new FileReader(d:TankGame.txt br=new BufferedReader(fr); String n=br.readLine(); /将字符串转换成int型 allEnNum=Integer.parseInt(n); while(n=br.readLine()!=null) String xyz=n.split( Node node=new Node(Integer.parseInt(xyz0), Integer.parseInt(xyz1), Integer.parseInt(
24、xyz2); nodes.add(node); / TODO Auto-generated catch block finally br.close(); fr.close(); catch (IOException e) return nodes; /把玩家击毁敌人坦克的数量保存到文件中 private static FileWriter fw=null; private static BufferedWriter bw=null; private static FileReader fr=null; private static BufferedReader br=null; /把玩家击毁敌人坦克数量保存到文件中 public static void keepRecording() fw=new FileWriter( bw=new BufferedWriter(fw); bw.write(allEnNum+rn/+是要换行 bw.close(); fw.close(); /从文件中读取记录 public static void getRecoring() /存盘退出后保存敌人坦克坐标 public static void keepRecAndEnemTank() fw=new Fi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1