基于java的游戏坦克大战学士论文

基于java的游戏坦克大战学士论文

ID:260830

大小:701.00 KB

页数:53页

时间:2017-07-15

上传者:chess95660
基于java的游戏坦克大战学士论文_第1页
基于java的游戏坦克大战学士论文_第2页
基于java的游戏坦克大战学士论文_第3页
基于java的游戏坦克大战学士论文_第4页
基于java的游戏坦克大战学士论文_第5页
资源描述:

《基于java的游戏坦克大战学士论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

目录摘要IABSTRACTII第一章绪论11.1课题研究的背景11.2课题研究的任务1第二章系统分析22.1课题的可行性分析22.2需求分析2第三章系统总体设计33.1游戏总体流程设计33.2游戏界面设计4第四章游戏详细设计64.1各个类的实现64.2程序的详细设计7第五章测试95.1软件测试说明95.1.1软件测试的目标95.1.2软件测试的原则95.2测试计划105.2.1进行通过测试105.2.2进行有效类测试105.3测试用例10总结10参考文献11致谢12附录一坦克大战中的类15附录二坦克大战程序31 毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作者签名:     日 期:     指导教师签名:     日  期:     使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名:     日 期:      学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权    大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。涉密论文按学校规定处理。作者签名:日期:年月日导师签名:日期:年月日 指导教师评阅书指导教师评价:一、撰写(设计)过程1、学生在论文(设计)过程中的治学态度、工作精神□优□良□中□及格□不及格2、学生掌握专业知识、技能的扎实程度□优□良□中□及格□不及格3、学生综合运用所学知识和专业技能分析和解决问题的能力□优□良□中□及格□不及格4、研究方法的科学性;技术线路的可行性;设计方案的合理性□优□良□中□及格□不及格5、完成毕业论文(设计)期间的出勤情况□优□良□中□及格□不及格二、论文(设计)质量1、论文(设计)的整体结构是否符合撰写规范?□优□良□中□及格□不及格2、是否完成指定的论文(设计)任务(包括装订及附件)?□优□良□中□及格□不及格三、论文(设计)水平1、论文(设计)的理论意义或对解决实际问题的指导意义□优□良□中□及格□不及格2、论文的观念是否有新意?设计是否有创意?□优□良□中□及格□不及格3、论文(设计说明书)所体现的整体水平□优□良□中□及格□不及格建议成绩:□优□良□中□及格□不及格(在所选等级前的□内画“√”)指导教师:(签名)单位:(盖章)年月日 评阅教师评阅书评阅教师评价:一、论文(设计)质量1、论文(设计)的整体结构是否符合撰写规范?□优□良□中□及格□不及格2、是否完成指定的论文(设计)任务(包括装订及附件)?□优□良□中□及格□不及格二、论文(设计)水平1、论文(设计)的理论意义或对解决实际问题的指导意义□优□良□中□及格□不及格2、论文的观念是否有新意?设计是否有创意?□优□良□中□及格□不及格3、论文(设计说明书)所体现的整体水平□优□良□中□及格□不及格建议成绩:□优□良□中□及格□不及格(在所选等级前的□内画“√”)评阅教师:(签名)单位:(盖章)年月日 教研室(或答辩小组)及教学系意见教研室(或答辩小组)评价:一、答辩过程1、毕业论文(设计)的基本要点和见解的叙述情况□优□良□中□及格□不及格2、对答辩问题的反应、理解、表达情况□优□良□中□及格□不及格3、学生答辩过程中的精神状态□优□良□中□及格□不及格二、论文(设计)质量1、论文(设计)的整体结构是否符合撰写规范?□优□良□中□及格□不及格2、是否完成指定的论文(设计)任务(包括装订及附件)?□优□良□中□及格□不及格三、论文(设计)水平1、论文(设计)的理论意义或对解决实际问题的指导意义□优□良□中□及格□不及格2、论文的观念是否有新意?设计是否有创意?□优□良□中□及格□不及格3、论文(设计说明书)所体现的整体水平□优□良□中□及格□不及格评定成绩:□优□良□中□及格□不及格(在所选等级前的□内画“√”)教研室主任(或答辩小组组长):(签名)年月日教学系意见:系主任:(签名)年月日 第一章绪论1.1课题研究的背景如今我们的生活节奏越来越快,每个人的生活压力也在不断变大,长期紧绷着神经容易产生心理和生理上的双重伤害,人们需要在工作和学习之外放松自己,玩玩游戏正是放松自己的方式之一。坦克大战,一个众所周知的小游戏,曾经在红白机时代风靡一时。其界面简单,耐玩,关卡多,可玩性高,没有局限的年龄层。Java是现在全球最时髦的开发工具之一,它拥有庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机,总之,Java的出现,确实给整个程序界带来了巨大的冲击,也许现在还无法准确评估Java为整个IT业带来的影响,但是有一点毋庸置疑—Java将不可避免的影响一带程序员。使用Java作为开发工具,来做坦克大战这个小游戏,是一种很理性的选择。Java游戏可以在本地桌面系统下运行,也可以在Web浏览器下运行。我在大学四年中学到了很多计算机的知识,JAVA语言,软件工程,数据结构,软件工程等课程。如今我将用我所学的知识来完成一个坦克大战游戏,来锻炼自己的动手能力,独立作出一个小程序。1.2课题研究的任务本文中所做的主要工作如下:(1)介绍了制作坦克大战游戏的意义和目的。(2)设计坦克大战游戏各个类,实现各类效果和目标。(3)分析并解决游戏中的若干技术问题。(4)完成坦克大战游戏,进行测试并分析结果. 第二章系统分析2.1课题的可行性分析1、课题要求(1)与实践活动和相关的文件和资料由教师提供。(2)本课题要求学生有熟练的Java开发能力,有较强的自学能力。(3)具体问题再做详细调查研究并与指导老师面谈。2、可行性分析技术可行性:游戏对机器没有多大要求,现在无论什么电脑,只要能安装J2SDK,就能在电脑上开发这款游戏。制作出来的游戏可以在本地桌面运行,也可在WEB上运行,现在JAVA语言非常成熟,完全能够完成这个游戏。经济可行性:开发这个游戏除了耗费自己的时间和精力以外,不需要其他的资金问题,完成后放到网上开放下载,无需任何费用,有兴趣的人可以自己下载来玩。2.2需求分析在游戏中需要实现的功能:(1)能够通过键盘自由控制坦克移动和发射子弹;(2)敌方坦克能够随机移动和随机发射子弹;(3)子弹和不同阵营坦克碰撞后会产生爆炸;(4)消灭敌方坦克后会有个计分板记录玩家得分(5)游戏进行到一半时可以暂停退出,下次打开游戏时选继续游戏可以继续之前的游戏。 第三章系统总体设计3.1游戏总体流程设计开始新游戏时,先进行初始化,然后调用敌方坦克类和我方坦克类,实现键盘监听功能,战场显示所有坦克的移动,发射子弹。判断子弹和敌方坦克的碰撞,调用爆炸类,调用记录类,修改玩家总得分。图3.1总体流程图 3.2游戏界面设计(1)开始菜单界面左上角设置个游戏菜单,里面含有“开始新游戏”、“继续游戏”、“存盘退出”、“退出游戏”这几个下拉选项,玩家可通过这些选项控制游戏的开始,存盘,与结束。图3.2开始菜单(2)战场窗口中间是坦克大战的战场,里面显示敌我双方坦克,以及各自发出的子弹,坦克的一切行为都会显示在战场上。图3.3战场(3)坦克剩余数战场正下方显示我方坦克剩余生命和敌方坦克剩余数量。图3.4坦克剩余数 (4)玩家总成绩战场右边显示玩家击毁敌方坦克所得到的的总成绩。图3.5玩家总成绩 第四章游戏详细设计4.1各个类的设计(1)坦克类是系统中最主要的一个类,坦克的属性:速度(X轴和Y轴速度),坦克的大小,坦克所在坐标,坦克的方向,坦克存活与否。这些属性都有一个初始化值,游戏一开始就可以运行。设计过程中,坦克出现的位置是由坦克的坐标而定。玩家的位置由键盘监听方向,按照指定方向以一定的速度前进——这个速度是全局静态变量,当没有键盘控制的时候,坦克就会保持静止。敌方的坦克是用随机数来控制方向和路径的。通过TouchotherEnemy()来判断是否碰撞到别的敌方坦克。我方坦克的方向和子弹发射都是由键盘来控制,所以在坦克类里用keypressed()方法来接受键盘的按键监听,接受到相应的信息后,例如接到X,则表示发射子弹,此时就要调用坦克类里的fire()方法。接受到方向键,则会对坦克坐标做出相应的变化。图3.1坦克类图3.2红色我方坦克黄色敌方坦克(2)子弹类需要依附坦克类,每个坦克都可以发射子弹,子弹的方向和速度都在子弹类里。当子弹碰到敌方坦克或跑出战场后,子弹线程便会结束。 图3.3子弹类图3.4红色我方子弹黄色敌方子弹(3)爆炸类是取决子弹类。每当子弹碰到敌方坦克时,子弹线程结束,并调用爆炸类,爆炸类会读取坦克即时的坐标,并用连续的三张图片显示出爆炸效果。图3.5爆炸类4.2程序的其他设计(1)图形用户界面要用抽象窗口工具AWT和Swing来实现,在选择开始新游戏前,实现屏幕中央关数的闪屏效果。classStartPanelextendsJPanelimplementsRunnable{inttime=0;publicvoidpaint(Graphicsg){super.paint(g);g.fillRect(0,0,900,600);if(time%2==0){g.setColor(Color.yellow); g.setFont(newFont("宋体",Font.BOLD,30));g.drawString("stage:1",400,250);}}@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){try{Thread.sleep(100);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}time++;//重画this.repaint();}}}(2)游戏开始时播放经典坦克大战的游戏音。AePlayWaveapw=newAePlayWave("111.wav");apw.start(); 第五章测试5.1软件测试说明软件测试是对软件需求分析、设计和编码的审查,通过全面的测试,发现各阶段的问题。软件分析、设计、编码是为了建立一个系统结构,实现系统;而测试主要任务是实现软件开发问题,“破坏”已经做好的软件系统。都是为了能够做出一个好的软件系统。5.1.1软件测试的目标如今对于软件大家都明白,不可能存在没有缺陷的软件。软件是人开发出来的,人不可避免的会产生错误,而产生软件缺陷。软件缺陷可能在项目初期就存在了。随着软件不断的开发,缺陷造成的影响不断扩大,可能造成无法弥补的损害。所以,软件测试的目标是:以最少的代价找出软件存在的错误和缺陷。在软件系统的开发过程中,软件测试是保证软件质量的关键,它是需求分析、设计和编码的最后审核。确实做到尽可能的将软件中存在的问题找出来,以保证软件质量。5.1.2软件测试的原则软件测试需要一些原则,Myers提出了以下几个测试原则:1.程序不能由其程序员来测试。测试是为了找错。从心理学角度上讲,程序员对自己做的程序会觉得不会有多少错误。而且如果程序员的理解错误,程序员自己测试肯定是查不出错误的。2.在程序测试时,测试人员应有正确的输入和明确的输出结果。3.程序测试需要合理的输入数据,也要不合理的输入数据。保留素有的测试案例,并作为一个软件组件。花费相当多的精力来射击测试用例。不加以保存,一旦程序错误修正或改进需要重新测试,就要重复上述工作。这是不是太浪费了,人们一般不愿重新设计测试用例,测试时难免会没有第一次测试那么认真。这往往无法发现因修改而产生的缺陷。程序中有错误的概率和在那段程序中已经发现的错误成比例。程序中的错误总是一起出现,对这种现象,现在还没有令人满意的解释。但这样的现象表明,为了提高测试的效率,应当特别对待那些容易出错的程序段。 5.2测试计划5.2.1进行通过测试在软件测试过程中,我们要明白软件能够做什么,不会去测试额外的功能。因此用最简单的测试计划,来检测软件基本功能的运行。5.2.2进行有效类测试在保证软件能够正确运行之后,就能用各种“非正常”操作和数据来暴露缺陷。纯粹是为了破坏软件而设计的测试。5.3测试用例打开坦克大战的运行文件,可看到新开启的窗口如下。图5.1开始窗口打开游戏下拉选框,可看到“开始新游戏”、“退出游戏”、“存盘退出”、“继续游戏”这几个选项。图5.2开始选项框 点击开始新游戏即可开始游戏,并且能听到游戏开始的声音,能看到界面上显示出来的信息,通过上下左右可以操作我方坦克的移动,按住方向键不动,坦克会不停的向那个方向移动。图5.3坦克的移动按X键可以发射子弹,子弹会击毁地方坦克,图为敌方坦克爆炸。图5.4坦克的爆炸我方坦克最多发射5发子弹,必须等子弹消失后才能再次发射子弹。图5.5坦克的子弹 系统可以保存退出,记录坦克的坐标,玩家总成绩。图5.6存盘退出总结经过这两个月的学习,研究和开发,坦克大战游戏的基本功能已经实现出来。玩家可以通过操作坦克去击毁敌方坦克,游戏开始有游戏音效,坦克被击毁时有爆炸效果,可以存盘和读档。因为自己知识上的欠缺,最开始设想的一些内容无法实现,但还是可以基本完成坦克大战的功能。通过这次坦克大战的毕业设计我学到了许多知识,第一次独立完成了一个小项目,过程中碰到了一些麻烦和不足,都在同学和老师的帮助下一一找到了解决的方法。从碰到难题,到自己查书,到与同学讨论,再到向老师请教,使得我的毕业设计不断的完善,并且学到了宝贵的知识。 参考文献[1]Java语言编程基础教程——宋振会编著,清华大学出版社2005[2]Java语言程序设计——郎波编著,清华大学出版社2005[3]Java核心技术卷Ⅰ:基础知识CayS.Horstmann、GaryCornell编著,机械工业出版社2008[4]Java游戏设计2——荣钦科技编著,清华大学出版社[5]JavaJDK实例宝典——夏先波编著,电子工业出版社2007[6]Java面向对象编程——孙卫琴编著,电子工业出版社2006[7]Java编程思想(第4版)——(美)埃克尔编著,陈昊鹏译,机械工业出版社2007[8]Java编程模式与范例——严桂兰刘波刘甲编著,机械工业出版社2002[9]优秀动漫游戏系列教材—交互式漫游动画--Virtools+3dsMax虚拟——罗建勤张明编著2010[10]锐风行技法3dsMax/AfterEffects电视品牌形象包装完全解码——肖艺孙春星雷荣祖编著,人民邮电出版社2010.[11]Java典型应用彻查1000例-图形与网络游戏开发(DVD)——贾蓉生胡大源林金池编著,科学出版社2009 致谢经过两个多月的辛苦忙碌,本次毕业设计完成了,由于经验匮乏和业务逻辑不熟悉,难免会有很多考虑不周到和不完善的地方,但在指导老师和同学的帮助下许多问题都得以解决,在此本人要特别感谢他们对我的帮助。首先我的毕业设计能够顺利完成,和李林老师的全力指导和热心帮助是分不开的,无论是在初期的设计阶段还是后期的运行阶段都得到了李林老师的鼓励和帮助,在毕业设计过程中,给我提示游戏设计的逻辑思路;给我提供参考书籍;给我提供了很多技术资料。在碰到问题时,总是鼓励我迎难而上。特别是论文格式的修改,让我明白了一个标准的论文,其格式的重要性,哪怕是一个标点符号都要严格要求。没有李林老师的帮助,我是做不出这次毕业设计的。其次我还要感谢大学四年来的所有老师,为我们打下的基础。以前总觉得学习的课程用处不大,但当自己真正去完成一个设计的时候,才发觉每门课程的重要性。然后我要感谢我的几位同学,在毕业设计的开发过程中,但我遇到难题时,他们给予我支持,鼓励和帮助,帮忙查阅资料,与我共同解决难题。通过这次毕业设计,不仅完成了我的学业,更重要的是让我从开始的需求分析到具体功能的实现,再到最终的测试和维护的软件工程有了进一步的的理解,这种思维方法对我的思想产生了极大的影响。我的动手能力和独立解决问题的能力得到了很大的锻炼和提高。我还要感谢学校提供这次毕业设计的机会,让我在学业即将结束的时候有认识自己的机会,意识到自己的优势和不足,在这次毕业设计中明白了责任的重要性,从而提高了自己的责任心。最后,感谢答辩组对我的毕业设计的考核,如能够得到答辩老师们的认可,即是对我的学习和工作最大的鼓励。你们的客观评价和建议一定牢记于心,在今后的工作中,更加严格要求自己。 附录一坦克大战中的类敌人坦克类packagemyTankGame;importjava.util.*;importjava.io.*;importjavax.sound.sampled.AudioFormat;importjavax.sound.sampled.AudioInputStream;importjavax.sound.sampled.AudioSystem;importjavax.sound.sampled.DataLine;importjavax.sound.sampled.SourceDataLine;classAePlayWaveextendsThread{privateStringfilename;publicAePlayWave(Stringwavfile){filename=wavfile;}publicvoidrun(){FilesoundFile=newFile(filename);AudioInputStreamaudioInputStream=null;try{audioInputStream=AudioSystem.getAudioInputStream(soundFile);}catch(Exceptione1){e1.printStackTrace();return;}AudioFormatformat=audioInputStream.getFormat();SourceDataLineauline=null;DataLine.Infoinfo=newDataLine.Info(SourceDataLine.class,format);try{auline=(SourceDataLine)AudioSystem.getLine(info);auline.open(format);}catch(Exceptione){e.printStackTrace();return;} auline.start();intnBytesRead=0;byte[]abData=newbyte[512];try{while(nBytesRead!=-1){nBytesRead=audioInputStream.read(abData,0,abData.length);if(nBytesRead>=0)auline.write(abData,0,nBytesRead);}}catch(IOExceptione){e.printStackTrace();return;}finally{auline.drain();auline.close();}}}//敌人坦克点和方向构成的对象类(记录点)classNode{intx;inty;intdirect;publicNode(intx,inty,intdirect){this.x=x;this.y=y;this.direct=direct;}}//记录类,同时可以保存玩家的设置classRecorder{//记录没关有多少敌人privatestaticintenNum=20;//设置我有多少生命值privatestaticintmyLife=3;//记录总共消灭多少敌人privatestaticintallEnNum=0;privatestaticVectorets=newVector(); publicstaticVectorgetEts(){returnets;}publicstaticvoidsetEts(Vectorets){Recorder.ets=ets;}//从文件中恢复记录点privatestaticVectornodes=newVector();//完成读取任务publicstaticVectorgetNidesAndEnNums(){try{fr=newFileReader("d:\TankGame.txt");br=newBufferedReader(fr);Stringn=br.readLine();//将字符串转换成int型allEnNum=Integer.parseInt(n);while((n=br.readLine())!=null){Stringxyz[]=n.split("");Nodenode=newNode(Integer.parseInt(xyz[0]),Integer.parseInt(xyz[1]),Integer.parseInt(xyz[2]));nodes.add(node);}}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{try{br.close();fr.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}returnnodes;}//把玩家击毁敌人坦克的数量保存到文件中privatestaticFileWriterfw=null;privatestaticBufferedWriterbw=null; privatestaticFileReaderfr=null;privatestaticBufferedReaderbr=null;//把玩家击毁敌人坦克数量保存到文件中publicstaticvoidkeepRecording(){try{fw=newFileWriter("d:\TankGame.txt");bw=newBufferedWriter(fw);bw.write(allEnNum+"r ");//+"r "是要换行}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{try{bw.close();fw.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}//从文件中读取记录publicstaticvoidgetRecoring(){try{fr=newFileReader("d:\TankGame.txt");br=newBufferedReader(fr);Stringn=br.readLine();//将字符串转换成int型allEnNum=Integer.parseInt(n);}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{try{br.close();fr.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}} //存盘退出后保存敌人坦克坐标publicstaticvoidkeepRecAndEnemTank(){try{fw=newFileWriter("d:\TankGame.txt");bw=newBufferedWriter(fw);bw.write(allEnNum+"r ");//+"r "是要换行//保存当前活着的敌人坦克坐标和方向for(inti=0;iets=newVector();//定义一个向量,可以存放敌人的子弹Vectorss=newVector();//敌人添加子弹,应在刚刚创建坦克和敌人的坦克死亡后publicEnemyTank(intx,inty){super(x,y);}//得到MyPanel的敌人坦克向量publicvoidsetEts(Vectorvv){this.ets=vv;}//判断是否碰到别的敌人坦克publicbooleanisTouchotherEnemy(){booleanb=false;switch(this.direct){case0: //我的坦克向上//取出所有敌人坦克for(inti=0;iet.x-40&&this.xet.y-60&&this.yet.x-10-40&&this.xet.y+14-60&&this.yet.x-60&&this.x-10et.y-40&&this.y+14et.x-60&&this.xet.y-40&&this.yet.x-40&&this.xet.y-60&&this.yet.x-10-40&&this.xet.y+14-60&&this.yet.x-60&&this.x-10et.y-40&&this.y+14et.x-60&&this.xet.y-40&&this.y0&&!this.isTouchotherEnemy())y-=speed;try{Thread.sleep(50);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}break;case1://向右for(inti=0;i10&&!this.isTouchotherEnemy())x-=speed;try{Thread.sleep(50);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblock e.printStackTrace();}}break;}//让坦克随机产生一个新的方向this.direct=(int)(Math.random()*4);//System.out.println("this.direct"+this.direct);//判断是否需要给敌人坦克加入新的子弹if(isLive){if(ss.size()<2){Shots=null;//没有子弹,添加switch(direct){case0:s=newShot(x+18,y,0);ss.add(s);break;case1:s=newShot(x-10+30+30,y+14+18,1);ss.add(s);break;case2:s=newShot(x+18,y+30+30,2);ss.add(s);break;case3:s=newShot(x-10,y+14+18,3);ss.add(s);break;}//启动子弹线程Threadt=newThread(s);t.start();}} //判断敌人是否死亡(避免僵尸线程)if(this.isLive==false){//让坦克死亡后退出线程break;}}}}//炸弹类classBomb{//定义炸弹的坐标intx,y;//炸弹的生命intlife=30;booleanisLive=true;publicBomb(intx,inty){this.x=x;this.y=y;}//减少生命publicvoidlifeDown(){if(life>0){life--;}else{this.isLive=false;}}}//子弹类classShotimplementsRunnable{intx;inty;intdirect;intspeed=7;booleanisLive=true;publicShot(intx,inty,intdirect) {this.x=x;this.y=y;this.direct=direct;}@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){try{Thread.sleep(50);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}switch(direct){case0://上y-=speed;break;case1:x+=speed;break;case2:y+=speed;break;case3:x-=speed;break;}//子弹(线程)死亡if(x<0||y<0||x>900||y>600){isLive=false;break;}}}}//我的坦克classHeroextendsTank{//声明一颗子弹//Shots=null;intspeed=7;Vectorss=newVector();Shots=null; publicHero(intx,inty){super(x,y);}//坦克向上移动publicvoidmoveUp(){if(y>2){y-=speed;}}//向右publicvoidmoveRight(){if(x<848){x+=speed;}}//向下publicvoidmoveDown(){if(y<540){y+=speed;}}//向左publicvoidmoveLeft(){if(x>10){x-=speed;}}//开火(子弹打出去)publicvoidShotEnemy(){switch(this.direct) {case0:s=newShot(x+18,y,0);ss.add(s);break;case1:s=newShot(x-10+30+30,y+14+18,1);ss.add(s);break;case2:s=newShot(x+18,y+30+30,2);ss.add(s);break;case3:s=newShot(x-10,y+14+18,3);ss.add(s);break;}//启动子弹线程Threadt=newThread(s);t.start();}} 附录二坦克大战程序importjava.awt.Graphics;importjava.awt.Image;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.io.File;importjava.util.Vector;importjavax.swing.JFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JPanel;publicclassTankgameextendsJFrameimplementsActionListener{MyPanelmp=null;StartPanelsp=null;//做出需要的菜单JMenuBarjmb=null;JMenujm1=null;JMenuItemjmi1=null;JMenuItemjmi2=null;JMenuItemjmi3=null;JMenuItemjmi4=null;publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubTankgametankgame=newTankgame();}//构造函数publicTankgame(){//mp=newMyPanel();//this.add(mp);//this.addKeyListener(mp);////启动mp线程//Threadt=newThread(mp);//t.start();jmb=newJMenuBar(); jm1=newJMenu("游戏(F)");jm1.setMnemonic('F');jmi1=newJMenuItem("开始新游戏(N)");jmi1.setMnemonic('N');jmi2=newJMenuItem("退出游戏");jmi3=newJMenuItem("存盘退出");jmi4=newJMenuItem("继续游戏");//对jmi1注册监听jmi1.addActionListener(this);//对jmi2注册监听jmi2.addActionListener(this);jmi3.addActionListener(this);jmi4.addActionListener(this);//添加this.setJMenuBar(jmb);jmb.add(jm1);jm1.add(jmi1);jm1.add(jmi2);jm1.add(jmi3);jm1.add(jmi4);sp=newStartPanel();this.add(sp);Threadt=newThread(sp);t.start();this.setSize(1050,750);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}@OverridepublicvoidactionPerformed(ActionEvente){//TODOAuto-generatedmethodstubif(e.getSource()==jmi1){//创建战场面板//先删除原来的开始面板this.remove(sp);if(mp!=null){this.remove(mp);} mp=newMyPanel("newGame");this.add(mp);this.addKeyListener(mp);//启动mp线程Threadt=newThread(mp);t.start();//刷新面板this.setVisible(true);}elseif(e.getSource()==jmi2){//玩家退出游戏//保存玩家总成绩Recorder.keepRecording();System.exit(0);}elseif(e.getSource()==jmi3){Recorder.setEts(mp.ets);Recorder.keepRecAndEnemTank();System.exit(0);}elseif(e.getSource()==jmi4){//创建战场面板//先删除原来的开始面板this.remove(sp);if(mp!=null){this.remove(mp);}mp=newMyPanel("conGame");this.add(mp);this.addKeyListener(mp);//启动mp线程Threadt=newThread(mp);t.start();//刷新面板this.setVisible(true);}}} //开始界面界面(字体闪烁效果(使用线程))classStartPanelextendsJPanelimplementsRunnable{inttime=0;publicvoidpaint(Graphicsg){super.paint(g);g.fillRect(0,0,900,600);if(time%2==0){g.setColor(Color.yellow);g.setFont(newFont("宋体",Font.BOLD,30));g.drawString("stage:1",400,250);}}@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){try{Thread.sleep(100);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}time++;//重画this.repaint();}}}//我的面板classMyPanelextendsJPanelimplementsKeyListener,Runnable{//定义一个我的坦克Herohero=null;//定义敌人的坦克Vectorets=newVector();intetSize=5; //定义三张图片,三张图片才能组成一颗炸弹Imageimage1=null;Imageimage2=null;Imageimage3=null;//定义炸弹的集合Vectorbombs=newVector();Vectornodes=newVector();//构造函数publicMyPanel(Stringflag){//恢复记录//创建文件Filef=newFile("d:\TankGame.txt");if(f.exists()){Recorder.getRecoring();}hero=newHero(400,540);//初始化敌人的坦克if(flag.equals("newGame")){for(inti=0;i20){g.drawImage(image1,b.x,b.y,40,40,this);}elseif(b.life>10){g.drawImage(image2,b.x,b.y,40,40,this);}else{g.drawImage(image3,b.x,b.y,40,40,this);}//让b的生命值减小b.lifeDown();//如果炸弹生命值为0.就把该炸弹从bombs向量中去掉if(b.life==0){bombs.remove(b);}}//画出敌人的坦克for(inti=0;iet.x&&s.xet.y&&s.yet.x-10&&s.xet.y+14&&s.y

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭