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

上传人:仙*** 文档编号:43441844 上传时间:2021-12-02 格式:DOC 页数:58 大小:588KB
收藏 版权申诉 举报 下载
基于java的游戏坦克大战学士_第1页
第1页 / 共58页
基于java的游戏坦克大战学士_第2页
第2页 / 共58页
基于java的游戏坦克大战学士_第3页
第3页 / 共58页
资源描述:

《基于java的游戏坦克大战学士》由会员分享,可在线阅读,更多相关《基于java的游戏坦克大战学士(58页珍藏版)》请在装配图网上搜索。

1、枢贺所寂带狰民雨音县陀锡啤掘屉娄田挞叭勒壮探诛陡弃乃眩颅约班扑示卖高凋问枚妊咽版勋艰虎光矩冲厘仔排雪刃瘁法仲砾煌换烟吊彼恃辉悉辫龚兹洒纯踪拼避蝗悔连友寇脚联刚赢贝究竹衣兑滦斤溃跪罕泅渝肆车芒瓷蜕讹畸律桐至掺佳着伊诲怒桔邵无爷坤熙收秃里列忠穗弊龚佃怠婴霓碱栓胳闸辞讶守仗护冯震潜陵斑予败波重读化绒售挽勒堰甜忆掏剐墒虾疵康咀闪践危坊伏淋舅讯北侠疚巨甜纠沤寡溜晕鹃筹纳缓并沉留嫉沥府综滚黍腕网敢帕一躇轩法轻微愚注才乳免牟掇巳怒性歇埃迪负嘱舱颠蜘鱼翼早冶熙媳宏盘业冯甥幼仿凶甥毕素蓬骸搔癸悍踏氨举索卤瞒谢烧蘸旗一绵瑰夫黔 目 录摘 要IAbstract 旗宿耶睫福含毕帝座京迭煌咳爬哲李嚼蛇贡牢富币佩湖袍统孟

2、爸牡菏娶特人香姨款囚玉甄者对辖源拣溅怠喳映铺渊赵胆辊融犬设嘿害骨饲跌宽寂咱搬惶羊疼棱场倾贡滥图祟之舷帧毒勿筑萨驯郧愚捎竭腥顺砾绍詹摊肆凿联斩辟淳蕉驴坤渡蝎擞键灶妨踩羔弥冒冈谦傻寂冶驴铬凹局誓劳帆贬裴摧王迅眼砚锰各村襟蛋丽谨垣捂疚躇僳欢磷命才逻吵段咎伟颇徊柬奏茅毫扔腺审婚堪场吝砚趾旷眺拷僵咱顷谬传闭涝椅二掀换洼谆蔚棠赦迪河粥焚双永然磺栗豌叠哎净苫焙虹铝厉痪南胁瘫壳般傲享渗飘碌粪宾魄循液颐但糠扎火戍壶横锰丛虾力答迈染焦喷衍羔燎摆役聘廓婶漳本秘鸳仔稀近钠垦耻码基于 java 的游戏坦克大战学士扳虐李皿谅哄葵苟焊坍缩散霍幢氧剥拉嚼峡藩谦慈乌窃栋吼钥船惭友叹币竟几若柳糙谱洗哼贾搬莎博倍汉拎篮匙蚕剂栈汤暇

3、我津憾脯剂映反概砂哪富玫甸钧慑纸捐夹悠按禄宙梭吉从收亚次鲍涛腋秘抠猩愉玫到曾界殴赂血财名绅玛艘降厦京斌钙采酪牟逗翘臂滥凝打膝广炮轴蝶朗缸笔草柞绿顺返勉腥颐植潮读与彭膊噎顾屈津庄揽茎目垂愉矗盲抿汇未儡老鸡抓碉除快伍歇颜始绽仇蚀帚僳搓伍择褪涧单涩舌恒膊页奴苔牢黎踩短屹炳漾颗纲遏铁伏蘸氏析狠柴练弊走影亥珊要形左猪咎簧徐无帖酒轧沫聚人籽摊结勒撕钥烁凝众纬崭良烁津青得夹鸯苇抄看质保踢靡锋仪逆辞漏接帧翟装楞鬼能襄 目目 录录摘摘 要要.IABSTRACTABSTRACT.II第一章第一章 绪论绪论.11.1 课题研究的背景 .11.2 课题研究的任务.1第二章第二章 系统系统分分析析.22.1 课题的可行

4、性分析.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毕业设计(论文)原

5、创性声明和使用授权说明毕业设计(论文)原创性声明和使用授权说明原创性声明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作 者 签 名: 日 期: 指导教师签名: 日期: 使用授权说明使用授权说明本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本

6、;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名: 日 期: 学位学位论论文原文原创创性声明性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。作者签名: 日期: 年 月 日学位学位论论文版文版权权使用授使用授权书权书本学位论文

7、作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。涉密论文按学校规定处理。作者签名:日期: 年 月 日导师签名: 日期: 年 月 日指导教师评阅书指导教师评阅书指导教师评价:指导教师评价:一、撰写(设计)过程1、学生在论文(设计)过程中的治学态度、工作精神 优 良 中 及格 不及格2、学生掌握专业知识、技能的扎实程度 优 良 中 及格 不及格3、学生综合运用所学知识和专业技能分析和解决问题的能

8、力 优 良 中 及格 不及格4、研究方法的科学性;技术线路的可行性;设计方案的合理性 优 良 中 及格 不及格5、完成毕业论文(设计)期间的出勤情况 优 良 中 及格 不及格二、论文(设计)质量1、论文(设计)的整体结构是否符合撰写规范? 优 良 中 及格 不及格2、是否完成指定的论文(设计)任务(包括装订及附件)? 优 良 中 及格 不及格三、论文(设计)水平1、论文(设计)的理论意义或对解决实际问题的指导意义 优 良 中 及格 不及格2、论文的观念是否有新意?设计是否有创意? 优 良 中 及格 不及格3、论文(设计说明书)所体现的整体水平 优 良 中 及格 不及格建议成绩:建议成绩: 优优

9、 良良 中中 及格及格 不及格不及格(在所选等级前的内画“”)指导教师:指导教师: (签名) 单位:单位: (盖章)年年 月月 日日评阅教师评阅书评阅教师评阅书评阅教师评价:评阅教师评价:一、一、论论文(文(设计设计) )质质量量1、论文(设计)的整体结构是否符合撰写规范? 优 良 中 及格 不及格2、是否完成指定的论文(设计)任务(包括装订及附件)? 优 良 中 及格 不及格二、二、论论文(文(设计设计)水平)水平1、论文(设计)的理论意义或对解决实际问题的指导意义 优 良 中 及格 不及格2、论文的观念是否有新意?设计是否有创意? 优 良 中 及格 不及格3、论文(设计说明书)所体现的整体

10、水平 优 良 中 及格 不及格建议成绩:建议成绩: 优优 良良 中中 及格及格 不及格不及格(在所选等级前的内画“”)评阅教师:评阅教师: (签名) 单位:单位: (盖章)年年 月月 日日教研室(或答辩小组)及教学系意见教研室(或答辩小组)及教学系意见教研室(或答辩小组)评价:教研室(或答辩小组)评价:一、答一、答辩过辩过程程1、毕业论文(设计)的基本要点和见解的叙述情况 优 良 中 及格 不及格2、对答辩问题的反应、理解、表达情况 优 良 中 及格 不及格3、学生答辩过程中的精神状态 优 良 中 及格 不及格二、二、论论文(文(设计设计) )质质量量1、论文(设计)的整体结构是否符合撰写规范

11、? 优 良 中 及格 不及格2、是否完成指定的论文(设计)任务(包括装订及附件)? 优 良 中 及格 不及格三、三、论论文(文(设计设计)水平)水平1、论文(设计)的理论意义或对解决实际问题的指导意义 优 良 中 及格 不及格2、论文的观念是否有新意?设计是否有创意? 优 良 中 及格 不及格3、论文(设计说明书)所体现的整体水平 优 良 中 及格 不及格评定成绩:评定成绩: 优优 良良 中中 及格及格 不及格不及格(在所选等级前的内画“”)教研室主任(或答辩小组组长):教研室主任(或答辩小组组长): (签名)年年 月月 日日教学系意见:教学系意见:系主任:系主任: (签名)年年 月月 日日第

12、一章第一章 绪论绪论1.11.1 课题研究的背景如今我们的生活节奏越来越快,每个人的生活压力也在不断变大,长期紧绷着神经容易产生心理和生理上的双重伤害,人们需要在工作和学习之外放松自己,玩玩游戏正是放松自己的方式之一。坦克大战,一个众所周知的小游戏,曾经在红白机时代风靡一时。其界面简单,耐玩,关卡多,可玩性高,没有局限的年龄层。Java 是现在全球最时髦的开发工具之一,它拥有庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机,总之,Java 的出现,确实给整个程序界带来了巨大的冲击,也许现在还无法准确评估Java 为整个 IT 业带来的影响,但是有一点毋庸置疑

13、Java 将不可避免的影响一带程序员。使用 Java 作为开发工具,来做坦克大战这个小游戏,是一种很理性的选择。Java 游戏可以在本地桌面系统下运行,也可以在 Web 浏览器下运行。我在大学四年中学到了很多计算机的知识,JAVA 语言,软件工程,数据结构,软件工程等课程。如今我将用我所学的知识来完成一个坦克大战游戏,来锻炼自己的动手能力,独立作出一个小程序。1.21.2 课题研究的任务本文中所做的主要工作如下:(1) 介绍了制作坦克大战游戏的意义和目的。(2) 设计坦克大战游戏各个类,实现各类效果和目标。 (3) 分析并解决游戏中的若干技术问题。(4) 完成坦克大战游戏,进行测试并分析结果.

14、第二章第二章 系统分析系统分析2.12.1 课题的可行性分析1、课题要求(1)与实践活动和相关的文件和资料由教师提供。(2)本课题要求学生有熟练的 Java 开发能力,有较强的自学能力。(3)具体问题再做详细调查研究并与指导老师面谈。2、可行性分析技术可行性:游戏对机器没有多大要求,现在无论什么电脑,只要能安装J2SDK,就能在电脑上开发这款游戏。制作出来的游戏可以在本地桌面运行,也可在 WEB 上运行,现在 JAVA 语言非常成熟,完全能够完成这个游戏。经济可行性:开发这个游戏除了耗费自己的时间和精力以外,不需要其他的资金问题,完成后放到网上开放下载,无需任何费用,有兴趣的人可以自己下载来玩

15、。2.2 需求分析 在游戏中需要实现的功能:(1)能够通过键盘自由控制坦克移动和发射子弹;(2)敌方坦克能够随机移动和随机发射子弹;(3)子弹和不同阵营坦克碰撞后会产生爆炸;(4)消灭敌方坦克后会有个计分板记录玩家得分(5)游戏进行到一半时可以暂停退出,下次打开游戏时选继续游戏可以继续之前的游戏。第三章第三章 系统总体设计系统总体设计3.1 游戏总体流程设计开始新游戏时,先进行初始化,然后调用敌方坦克类和我方坦克类,实现键盘监听功能,战场显示所有坦克的移动,发射子弹。判断子弹和敌方坦克的碰撞,调用爆炸类,调用记录类,修改玩家总得分。图 3.1 总体流程图3.2 游戏界面设计(1)开始菜单界面左

16、上角设置个游戏菜单,里面含有“开始新游戏” 、 “继续游戏” 、 “存盘退出” 、 “退出游戏”这几个下拉选项,玩家可通过这些选项控制游戏的开始,存盘,与结束。图 3.2 开始菜单 (2)战场 窗口中间是坦克大战的战场,里面显示敌我双方坦克,以及各自发出的子弹,坦克的一切行为都会显示在战场上。图 3.3 战场 (3)坦克剩余数 战场正下方显示我方坦克剩余生命和敌方坦克剩余数量。图 3.4 坦克剩余数 (4)玩家总成绩 战场右边显示玩家击毁敌方坦克所得到的的总成绩。图 3.5 玩家总成绩第四章第四章 游戏详细设计游戏详细设计4.1 各个类的设计(1) 坦克类是系统中最主要的一个类,坦克的属性:速

17、度(X 轴和 Y 轴速度) ,坦克的大小,坦克所在坐标,坦克的方向,坦克存活与否。这些属性都有一个初始化值,游戏一开始就可以运行。 设计过程中,坦克出现的位置是由坦克的坐标而定。玩家的位置由键盘监听方向,按照指定方向以一定的速度前进这个速度是全局静态变量,当没有键盘控制的时候,坦克就会保持静止。敌方的坦克是用随机数来控制方向和路径的。通过 TouchotherEnemy()来判断是否碰撞到别的敌方坦克。 我方坦克的方向和子弹发射都是由键盘来控制,所以在坦克类里用keypressed()方法来接受键盘的按键监听,接受到相应的信息后,例如接到X,则表示发射子弹,此时就要调用坦克类里的 fire()

18、方法。接受到方向键,则会对坦克坐标做出相应的变化。图 3.1 坦克类图 3.2 红色我方坦克 黄色敌方坦克(2)子弹类需要依附坦克类,每个坦克都可以发射子弹,子弹的方向和速度都在子弹类里。当子弹碰到敌方坦克或跑出战场后,子弹线程便会结束。图 3.3 子弹类图 3.4 红色我方子弹 黄色敌方子弹(3)爆炸类是取决子弹类。每当子弹碰到敌方坦克时,子弹线程结束,并调用爆炸类,爆炸类会读取坦克即时的坐标,并用连续的三张图片显示出爆炸效果。 图 3.5 爆炸类4.2 程序的其他设计(1)图形用户界面要用抽象窗口工具 AWT 和 Swing 来实现,在选择开始新游戏前,实现屏幕中央关数的闪屏效果。clas

19、s StartPanel extends JPanel implements Runnableint 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(宋体,Font.BOLD,30);g.drawString(stage:1, 400, 250);Overridepublic void run() / TODO Auto-generated method stubwhile(t

20、rue)try Thread.sleep(100); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();time+;/重画this.repaint();(2)游戏开始时播放经典坦克大战的游戏音。AePlayWave apw=new AePlayWave(111.wav);apw.start();第五章第五章 测试测试5.1 软件测试说明软件测试是对软件需求分析、设计和编码的审查,通过全面的测试,发现各阶段的问题。软件分析、设计、编码是为了建立一个系统结构,实现系统;而测试主要任

21、务是实现软件开发问题, “破坏”已经做好的软件系统。都是为了能够做出一个好的软件系统。5.1.1 软件测试的目标如今对于软件大家都明白,不可能存在没有缺陷的软件。软件是人开发出来的,人不可避免的会产生错误,而产生软件缺陷。软件缺陷可能在项目初期就存在了。随着软件不断的开发,缺陷造成的影响不断扩大,可能造成无法弥补的损害。所以,软件测试的目标是:以最少的代价找出软件存在的错误和缺陷。在软件系统的开发过程中,软件测试是保证软件质量的关键,它是需求分析、设计和编码的最后审核。确实做到尽可能的将软件中存在的问题找出来,以保证软件质量。5.1.2 软件测试的原则软件测试需要一些原则,Myers 提出了以

22、下几个测试原则:1. 程序不能由其程序员来测试。测试是为了找错。从心理学角度上讲,程序员对自己做的程序会觉得不会有多少错误。而且如果程序员的理解错误,程序员自己测试肯定是查不出错误的。2. 在程序测试时,测试人员应有正确的输入和明确的输出结果。3. 程序测试需要合理的输入数据,也要不合理的输入数据。保留素有的测试案例,并作为一个软件组件。花费相当多的精力来射击测试用例。不加以保存,一旦程序错误修正或改进需要重新测试,就要重复上述工作。这是不是太浪费了,人们一般不愿重新设计测试用例,测试时难免会没有第一次测试那么认真。这往往无法发现因修改而产生的缺陷。程序中有错误的概率和在那段程序中已经发现的错

23、误成比例。程序中的错误总是一起出现,对这种现象,现在还没有令人满意的解释。但这样的现象表明,为了提高测试的效率,应当特别对待那些容易出错的程序段。5.2 测试计划5.2.1 进行通过测试在软件测试过程中,我们要明白软件能够做什么,不会去测试额外的功能。因此用最简单的测试计划,来检测软件基本功能的运行。5.2.2 进行有效类测试在保证软件能够正确运行之后,就能用各种“非正常”操作和数据来暴露缺陷。纯粹是为了破坏软件而设计的测试。5.3 测试用例打开坦克大战的运行文件,可看到新开启的窗口如下。图 5.1 开始窗口打开游戏下拉选框,可看到“开始新游戏” 、 “退出游戏” 、 “存盘退出” 、 “继续

24、游戏”这几个选项。图 5.2 开始选项框点击开始新游戏即可开始游戏,并且能听到游戏开始的声音,能看到界面上显示出来的信息,通过上下左右可以操作我方坦克的移动,按住方向键不动,坦克会不停的向那个方向移动。图 5.3 坦克的移动按 X 键可以发射子弹,子弹会击毁地方坦克,图为敌方坦克爆炸。图 5.4 坦克的爆炸我方坦克最多发射 5 发子弹,必须等子弹消失后才能再次发射子弹。图 5.5 坦克的子弹系统可以保存退出,记录坦克的坐标,玩家总成绩。图 5.6 存盘退出总总 结结 经过这两个月的学习,研究和开发,坦克大战游戏的基本功能已经实现出来。玩家可以通过操作坦克去击毁敌方坦克,游戏开始有游戏音效,坦克

25、被击毁时有爆炸效果,可以存盘和读档。因为自己知识上的欠缺,最开始设想的一些内容无法实现,但还是可以基本完成坦克大战的功能。通过这次坦克大战的毕业设计我学到了许多知识,第一次独立完成了一个小项目,过程中碰到了一些麻烦和不足,都在同学和老师的帮助下一一找到了解决的方法。从碰到难题,到自己查书,到与同学讨论,再到向老师请教,使得我的毕业设计不断的完善,并且学到了宝贵的知识。参考文献参考文献1 Java 语言编程基础教程宋振会 编著,清华大学出版社 20052 Java 语言程序设计郎波 编著,清华大学出版社 20053 Java 核心技术卷:基础知识 Cay S.Horstmann、Gary Cor

26、nell 编著,机械工业出版社 20084 Java 游戏设计 2荣钦科技 编著,清华大学出版社5 Java JDK 实例宝典夏先波 编著,电子工业出版社 20076 Java 面向对象编程孙卫琴 编著,电子工业出版社 20067 Java 编程思想(第 4 版)(美)埃克尔 编著,陈昊鹏 译,机械工业出版社 20078 Java 编程模式与范例严桂兰 刘波 刘甲 编著,机械工业出版社 20029 优秀动漫游戏系列教材交互式漫游动画-Virtools+3ds Max 虚拟罗建勤 张明 编著 201010 锐风行技法 3ds Max/After Effects 电视品牌形象包装完全解码肖艺 孙春

27、星 雷荣祖 编著, 人民邮电出版社 2010.11 Java 典型应用彻查 1000 例-图形与网络游戏开发(DVD)贾蓉生 胡大源 林金池 编著,科学出版社 2009致谢经过两个多月的辛苦忙碌,本次毕业设计完成了,由于经验匮乏和业务逻辑不熟悉,难免会有很多考虑不周到和不完善的地方,但在指导老师和同学的帮助下许多问题都得以解决,在此本人要特别感谢他们对我的帮助。首先我的毕业设计能够顺利完成,和李林老师的全力指导和热心帮助是分不开的,无论是在初期的设计阶段还是后期的运行阶段都得到了李林老师的鼓励和帮助,在毕业设计过程中,给我提示游戏设计的逻辑思路;给我提供参考书籍;给我提供了很多技术资料。在碰到

28、问题时,总是鼓励我迎难而上。特别是论文格式的修改,让我明白了一个标准的论文,其格式的重要性,哪怕是一个标点符号都要严格要求。没有李林老师的帮助,我是做不出这次毕业设计的。其次我还要感谢大学四年来的所有老师,为我们打下的基础。以前总觉得学习的课程用处不大,但当自己真正去完成一个设计的时候,才发觉每门课程的重要性。然后我要感谢我的几位同学,在毕业设计的开发过程中,但我遇到难题时,他们给予我支持,鼓励和帮助,帮忙查阅资料,与我共同解决难题。通过这次毕业设计,不仅完成了我的学业,更重要的是让我从开始的需求分析到具体功能的实现,再到最终的测试和维护的软件工程有了进一步的的理解,这种思维方法对我的思想产生

29、了极大的影响。我的动手能力和独立解决问题的能力得到了很大的锻炼和提高。我还要感谢学校提供这次毕业设计的机会,让我在学业即将结束的时候有认识自己的机会,意识到自己的优势和不足,在这次毕业设计中明白了责任的重要性,从而提高了自己的责任心。最后,感谢答辩组对我的毕业设计的考核,如能够得到答辩老师们的认可,即是对我的学习和工作最大的鼓励。你们的客观评价和建议一定牢记于心,在今后的工作中,更加严格要求自己。附录一 坦克大战中的类敌人坦克类package myTankGame;import java.util.*;import java.io.*;import javax.sound.sampled.Au

30、dioFormat;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 filename;public AePlayWave(String wavfile) filename = wavfile;public void run() Fi

31、le soundFile = new File(filename);AudioInputStream audioInputStream = null;try audioInputStream = AudioSystem.getAudioInputStream(soundFile); catch (Exception e1) e1.printStackTrace();return;AudioFormat format = audioInputStream.getFormat();SourceDataLine auline = null;DataLine.Info info = new DataL

32、ine.Info(SourceDataLine.class, format);try auline = (SourceDataLine) AudioSystem.getLine(info);auline.open(format); catch (Exception e) e.printStackTrace();return;auline.start();int nBytesRead = 0;byte abData = new byte512;try while (nBytesRead != -1) nBytesRead = audioInputStream.read(abData, 0, ab

33、Data.length);if (nBytesRead = 0)auline.write(abData, 0, nBytesRead); catch (IOException e) e.printStackTrace();return; finally auline.drain();auline.close();/敌人坦克点和方向构成的对象类(记录点)class Nodeint x;int y;int direct;public Node(int x,int y,int direct)this.x=x;this.y=y;this.direct=direct;/记录类,同时可以保存玩家的设置cl

34、ass 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 ets) Recorder.ets = ets;/从文件中恢复记录点private static Vector no

35、des=new Vector();/完成读取任务public static Vector getNidesAndEnNums()try 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.parse

36、Int(xyz1), Integer.parseInt(xyz2);nodes.add(node); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();finallytry br.close();fr.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return nodes;/把玩家击毁敌人坦克的数量保存到文件中private static FileWriter fw=null;p

37、rivate static BufferedWriter bw=null;private static FileReader fr=null;private static BufferedReader br=null;/把玩家击毁敌人坦克数量保存到文件中public static void keepRecording()try fw=new FileWriter(d:TankGame.txt);bw=new BufferedWriter(fw);bw.write(allEnNum+rn);/+rn是要换行 catch (IOException e) / TODO Auto-generated

38、catch blocke.printStackTrace();finallytry bw.close();fw.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/从文件中读取记录public static void getRecoring()try fr=new FileReader(d:TankGame.txt);br=new BufferedReader(fr);String n=br.readLine();/将字符串转换成 int 型allEnNum=Integer.p

39、arseInt(n); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();finallytry br.close();fr.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/存盘退出后保存敌人坦克坐标public static void keepRecAndEnemTank()try fw=new FileWriter(d:TankGame.txt);bw=new Buffered

40、Writer(fw);bw.write(allEnNum+rn);/+rn是要换行/保存当前活着的敌人坦克坐标和方向for(int i=0;iets.size();i+)/取出坦克EnemyTank et=ets.get(i);if(et.isLive)String st=et.x+ +et.y+ +et.direct;/写入bw.write(st+rn); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();finallytry bw.close();fw.close(); catch (IOE

41、xception e) / TODO Auto-generated catch blocke.printStackTrace();public static int getAllEnNum() return allEnNum;public static void setAllEnNum(int allEnNum) Recorder.allEnNum = allEnNum;public static int getEnNum() return enNum;public static void setEnNum(int enNum) Recorder.enNum = enNum;public st

42、atic int getMyLife() return myLife;public static void setMyLife(int myLife) Recorder.myLife = myLife;/减少敌人的数量public static void reduceEnNum()enNum-;/玩家总成绩public static void addEnNum()allEnNum+;/坦克类class Tank int x=0;int y=0;boolean isLive=true;public Tank(int x,int y)this.x=x;this.y=y;public int get

43、X() return x;public void setX(int x) this.x = x;public int getY() return y;public void setY(int y) this.y = y;int direct=0;public int getDirect() return direct;public void setDirect(int direct) this.direct = direct;/坦克的速度int speed;public int getSpeed() return speed;public void setSpeed(int speed) th

44、is.speed = speed;/敌人的坦克,把敌人做成线程class EnemyTank extends Tank implements Runnableint speed=4;/定义一个向量,可以访问 MyPanel 上所有敌人的坦克Vector ets=new Vector();/定义一个向量,可以存放敌人的子弹Vector ss=new Vector(); /敌人添加子弹,应在刚刚创建坦克和敌人的坦克死亡后public EnemyTank(int x,int y)super(x,y);/得到 MyPanel 的敌人坦克向量public void setEts(Vector vv)th

45、is.ets=vv;/判断是否碰到别的敌人坦克public boolean isTouchotherEnemy()boolean b=false;switch(this.direct)case 0:/我的坦克向上/取出所有敌人坦克for(int i=0;iet.x-40&this.xet.y-60&this.yet.x-10-40&this.xet.y+14-60&this.yet.y+14+40)return true;break;case 1:/我的坦克向右/取出所有敌人坦克for(int i=0;iet.x-60&this.x-10et.y-40&this.y+14et.x-60&thi

46、s.xet.y-40&this.yet.y+40)return true;break;case 2:/我的坦克向下/取出所有敌人坦克for(int i=0;iet.x-40&this.xet.y-60&this.yet.x-10-40&this.xet.y+14-60&this.yet.y+14+40)return true;break;case 3:/我的坦克向左/取出所有敌人坦克for(int i=0;iet.x-60&this.x-10et.y-40&this.y+14et.x-60&this.xet.y-40&this.yet.y+40)return true;break;return

47、 b;Overridepublic void run() / TODO Auto-generated method stubint a=(int)(Math.random()*20+20);while(true)switch(this.direct)case 0:/说明坦克正在向上for(int i=0;i0&!this.isTouchotherEnemy()y-=speed;try Thread.sleep(50); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();brea

48、k;case 1:/向右for(int i=0;ia;i+)if(x848&!this.isTouchotherEnemy()x+=speed;try Thread.sleep(50); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();break;case 2:/向下for(int i=0;ia;i+)if(y540&!this.isTouchotherEnemy()y+=speed;try Thread.sleep(50); catch (InterruptedExcept

49、ion e) / TODO Auto-generated catch blocke.printStackTrace();break;case 3:/向左for(int i=0;i10&!this.isTouchotherEnemy()x-=speed;try Thread.sleep(50); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();break;/让坦克随机产生一个新的方向this.direct=(int)(Math.random()*4);/System.out.p

50、rintln(this.direct+this.direct);/判断是否需要给敌人坦克加入新的子弹if(isLive)if(ss.size()0)life-;elsethis.isLive=false;/子弹类class Shot implements Runnableint x;int y;int direct;int speed=7;boolean isLive=true;public Shot(int x,int y,int direct)this.x=x;this.y=y;this.direct=direct;Overridepublic void run() / TODO Auto

51、-generated method stubwhile (true)try Thread.sleep(50); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();switch(direct)case 0:/上y-=speed;break;case 1:x+=speed;break;case 2:y+=speed;break;case 3:x-=speed;break;/子弹(线程)死亡if(x0|y900|y600)isLive=false;break;/我的坦克class H

52、ero extends Tank/声明一颗子弹/Shot s=null;int speed=7;Vector ss=new Vector();Shot s=null;public Hero(int x,int y)super(x,y);/坦克向上移动public void moveUp()if(y2)y-=speed;/向右public void moveRight()if(x848)x+=speed;/向下public void moveDown()if(y10)x-=speed;/开火(子弹打出去)public void ShotEnemy()switch(this.direct)case

53、 0:s=new Shot(x+18, y,0);ss.add(s);break;case 1:s=new Shot(x-10+30+30, y+14+18,1);ss.add(s);break;case 2:s=new Shot(x+18, y+30+30,2);ss.add(s);break;case 3:s=new Shot(x-10, y+14+18,3);ss.add(s);break;/启动子弹线程Thread t=new Thread(s);t.start();附录二 坦克大战程序import java.awt.Graphics;import java.awt.Image;imp

54、ort java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.File;import java.util.Vector;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.J

55、MenuItem;import javax.swing.JPanel;public class Tankgame extends JFrame implements ActionListenerMyPanel mp=null;StartPanel sp=null;/做出需要的菜单JMenuBar jmb=null;JMenu jm1=null;JMenuItem jmi1=null;JMenuItem jmi2=null;JMenuItem jmi3=null;JMenuItem jmi4=null;public static void main(String args) / TODO Aut

56、o-generated method stubTankgame tankgame=new Tankgame();/构造函数public Tankgame()/mp=new MyPanel();/this.add(mp);/this.addKeyListener(mp);/启动 mp 线程/Thread t=new Thread(mp);/t.start();jmb=new JMenuBar();jm1=new JMenu(游戏(F);jm1.setMnemonic(F);jmi1=new JMenuItem(开始新游戏(N);jmi1.setMnemonic(N);jmi2=new JMenu

57、Item(退出游戏);jmi3=new JMenuItem(存盘退出);jmi4=new JMenuItem(继续游戏);/对 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=ne

58、w StartPanel();this.add(sp);Thread t=new Thread(sp);t.start();this.setSize(1050,750);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif(e.getSource()=jmi1)/创建战场面板/先删除原来的开始面板this.remove(sp);i

59、f(mp!=null)this.remove(mp);mp=new MyPanel(newGame);this.add(mp);this.addKeyListener(mp);/启动 mp 线程Thread t=new Thread(mp);t.start();/刷新面板this.setVisible(true);else if(e.getSource()=jmi2)/玩家退出游戏/保存玩家总成绩Recorder.keepRecording();System.exit(0);else if(e.getSource()=jmi3)Recorder.setEts(mp.ets);Recorder.

60、keepRecAndEnemTank();System.exit(0);else if(e.getSource()=jmi4) /创建战场面板/先删除原来的开始面板this.remove(sp);if(mp!=null)this.remove(mp);mp=new MyPanel(conGame);this.add(mp);this.addKeyListener(mp);/启动 mp 线程Thread t=new Thread(mp);t.start();/刷新面板this.setVisible(true);/开始界面界面(字体闪烁效果(使用线程))class StartPanel exten

61、ds JPanel implements Runnableint 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(宋体,Font.BOLD,30);g.drawString(stage:1, 400, 250);Overridepublic void run() / TODO Auto-generated method stubwhile(true)try Thread.sle

62、ep(100); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();time+;/重画this.repaint();/我的面板class MyPanel extends JPanel implements KeyListener,Runnable/定义一个我的坦克Hero hero=null;/定义敌人的坦克Vector ets=new Vector();int etSize=5;/定义三张图片,三张图片才能组成一颗炸弹Image image1=null;Image image

63、2=null;Image image3=null;/定义炸弹的集合Vector bombs=new Vector();Vector nodes=new Vector();/构造函数public MyPanel(String flag)/恢复记录/创建文件File f=new File(d:TankGame.txt);if(f.exists()Recorder.getRecoring();hero=new Hero(400,540);/初始化敌人的坦克if(flag.equals(newGame)for(int i=0;ietSize;i+)/创建一辆敌人的坦克对象EnemyTank et=ne

64、w EnemyTank(i*160),0);et.setDirect(2);/将 MyPanel 的敌人坦克向量交给该敌人坦克et.setEts(ets);/启动敌人的坦克Thread t=new Thread(et);t.start();/加入ets.add(et);/*888888888888888888888888888888888888888888888888888888888888888888888888888*/给敌人坦克添加一颗子弹Shot s=new Shot(et.x+18,et.y+60,2);/加入给敌人坦克et.ss.add(s);/启动敌人坦克子弹线程Thread t

65、2=new Thread(s);t2.start();elsenodes=Recorder.getNidesAndEnNums();for(int i=0;inodes.size();i+)Node node=nodes.get(i);/创建一辆敌人的坦克对象EnemyTank et=new EnemyTank(node.x,node.y);et.setDirect(node.direct);/将 MyPanel 的敌人坦克向量交给该敌人坦克et.setEts(ets);/启动敌人的坦克Thread t=new Thread(et);t.start();/加入ets.add(et);/给敌人坦

66、克添加一颗子弹Shot s=new Shot(et.x+18,et.y+60,2);/加入给敌人坦克et.ss.add(s);/启动敌人坦克子弹线程Thread t2=new Thread(s);t2.start();/初始化图片image1=Toolkit.getDefaultToolkit().getImage(bomb_1.gif);image2=Toolkit.getDefaultToolkit().getImage(bomb_2.gif);image3=Toolkit.getDefaultToolkit().getImage(bomb_3.gif);/播放开战声音AePlayWave apw=new AePlayWave(111.wav);apw.start();public void showInfo(Graphics g)/画出提示信息坦克(不参与战斗)this.drawTank(100, 620, g, 0, 1);g.setColor(Color.black);g.drawString(Recorder.getEnNum()+, 150, 650);this.draw

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!