-1-华中科技大学文华学院基于Java的坦克大战游戏软件程序设计题目:基于Java的坦克大战游戏的设计与实现学生姓名:秦光睿学号:110102011111学部(系):_信息科学与技术学部_专业年级:_11级电子信息工程_指导教师:田笛职称或学位:_硕士_2015年5月2日-2-摘要随着网络时代的到来及发展,游戏产业方兴未艾,出现了前所未有的繁荣。“贪吃蛇”、“俄罗斯方块”这些简单的游戏曾为一代接一代的游戏玩家所熟悉。并且随着网络通信技术的迅速发展,更加有趣、更为生动的游戏层出不穷。由于Java技术的不断发展,Java良好的跨平台特性在移动平台的开发中显示出了巨大的威力。Java语言面向对象的优势也使得开发游戏变得非常容易,同时eclipse平台的优越性也给了这类游戏程序的设计带来了很多的优点和方便。本论文主要介绍了坦克大战游戏的设计思路和实现过程。这种设计主要是利用函数对背景的所有物体进行绘图,然后利用线程以及事件监听机制对物体进行控制,例如坦克,从而实现各种功能,最后就可以构成一个活生生的坦克大战游戏了。Java功能在移动设备上的实现,Java应用程序产生的服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本论文着眼于java语言的优点,开发一款可可供娱乐的游戏程序——坦克大战。[关键字]:eclipse平台,游戏,Java,坦克大战目录摘要.......................................................-I-Abstract......................................................-I-第一章程序结构、思想和相关技术................................-4-1.1本程序需解决的有关技术问题.............................-4-1.2程序流程...............................................-4-1.3绘图与事件监听以及线程技术和IO流编程...................-5-1.3.1Graphics类................................................-5-1.3.2KeyListener监听机制...........................错误!未定义书签。1.3.3runnable实现线程.............................错误!未定义书签。1.3.4io流编程实现菜单功能.........................错误!未定义书签。第二章游戏的设计思路.........................................-7-2.1画出坦克...............................................-9-2.2坦克的控制和敌方的智能运行.............................-9--3-2.3子弹的运行和控制.......................................-17-2.4玩家成绩的记录...............................错误!未定义书签。2.5游戏面板与菜单的设计.........................错误!未定义书签。第三章程序分析和实现过程.....................................-19-3.1游戏进入前的面板设计分析..............................-19-3.2游戏逻辑函数及其涉及到的若干类........................-21-3.3坦克的共同行为........................................-22-3.4玩家坦克的功能属性....................................-23-3.5敌人坦克的功能属性....................................-24-3.6子弹击中坦克的爆炸....................................-25-3.7记分系统..............................................-27-3.8本章小结:.............................................-28-第四章总结.............................................-28-4.1本程序的总结和展望.....................................-28-4.2经验和感想............................................-29-参考文献......................................................-30--4-第一章程序结构、思想和相关技术1.1本程序需解决的有关技术问题1.坦克大战是一个可大可小的游戏,想法灵活可以编写出很多功能,所以需要对程序的要求量应该是巨大的,但是其代码利用率很高,因此实际编写时也不需要太多的绞尽脑汁,可以利用各模块程序的相近性灵活运用。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。2.游戏中为了美观,适用性强以及操作的简便性,我们主要利用draw函数画出矩形,圆及线构成一辆Tank,同时画出子弹,敌方坦克可以直接引用之前画出的坦克,这样画图的问题就基本解决了。3.己方坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定其一定的智能性;同时,出现在屏幕上的敌方可能会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。Java的多线程能力为实现这样的游戏提供了可能。敌人坦克的运行算法也需要进行适当的设置,以免游戏过于简单,单调。4.对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。敌方子弹仅需要扫描用户坦克,而用户坦克需要在每一步扫描所有的敌方坦克。这需要对所有的对象有较好的控制。另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。同时为了游戏的公平性,己方坦克发出的子弹数量必须控制,不能一下发出太多颗。5.对于敌我双方的坦克在运动的过程中也需要考虑会不会发生碰撞也就是重叠状况体,也要考虑坦克碰到边缘时不能继续前进,以免跑出有效范围,每前进一步都需要将所有的周围环境进行严格的控制。6.游戏的结束、开始、动态画面等信息是构成一个完美程序必不可少的环节。良好的用户界面更是吸引用户的硬实力,为此必须要加入坦克爆炸的效果图以及游戏进行时的音效。7.用户运行游戏时需要有分数记录的可能。如何采用合理的记分标准,需要进行适当的设计。记录分数的存储方式也需要有较好的解决方案,可以利用IO流编程来实现将数据存入电脑硬盘中的某个文件中。1.2程序流程本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属-5-性。运行程序后允许用户选择执行选项菜单,在开始游戏后将先对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。用户控制的坦克运行在主线程中,敌方坦克将在游戏开始时逐渐新增线程,每增加一个敌方坦克对象就新增加一条线程,一旦线程数满到最大值(本程序暂设置为20),就不允许敌人再继续出现。用户坦克自诞生之时起将拥有5发子弹的权利,子弹虽然开在单独的线程中,但运行结束后(比如撞到相关物体或敌方坦克时)并不结束子弹对象,只是将其线程终止。用户再次发射子弹时只是将终止的线程再次激活。在屏幕重绘的主程序中,将在每次的循环中判断若干事件。如:用户坦克的生命是否为0,敌方坦克数是否已经为零,屏幕上的坦克数量是否少于仍剩下的坦克数量等。以便程序进入相关的分支执行相关的反应代码,结束游戏或统计分数等。主程序流程如图所示:1.3绘图与事件监听以及线程技术和IO流编程1.3.1Graphics类Graphics类是所有图形上下文的抽象基类,允许应用程序可以在组件(已经在各种设备上实现),以及闭屏图像上,进行绘制。用fill3DRect画出矩形,fillOval画出圆,drawLine画出线,三个矩形,一个圆及一条线就可以构成一个坦克,如图:1.3.2KeyListener监听机制要想使坦克动起来,子弹运动起来,以及菜单模式下的各种功能能够控制坦克大战游戏的运行,比如继续游戏(continueGame),保存游戏并退出(saveExit),退出游戏(exit)以及开始新游戏(newgame)必须注册监听机制,例如程序如下:jm1.setMnemonic('G');jmil=newJMenuItem(开始新游戏(N));jmi2=newJMenuItem(退出游戏(E));jmi3=newJMenuItem(存盘退出游戏(C));Logo画面游戏选项主程序屏幕绘图本关记分统计显示结束显示历史记分表敌方需要出坦克时,生成坦克初始化参数死亡时符合结束条件时-6-jmi4=newJMenuItem(继续上局游戏(S));//注册监听jmi4.addActionListener(this);jmi4.setActionCommand(continueGame);//注册监听jmi3.addActionListener(this);jmi3.setActionCommand(saveExit);jmi2.addActionListener(this);jmi2.setActionCommand(exit);jmi2.setMnemonic('E');//对jmil相应jmil.addActionListener(this);jmil.setActionCommand(newgame);1.3.3runnable实现线程Java界曾流行这样一句话:不懂线程就不要说自己会Java,可见线程对Java的重要性是多么的大。那么线程的作用有哪些呢,最为典型的就是你在网络上放一个服务端,一个客户端访问时,就会新建一个线程处理这个客户端的事务,这样的话只要不断新建线程就可以处理多个用户的请求了。当然我们的这个坦克大战游戏的实现肯定离不开线程,例如己方坦克是必须要会移动的,那么敌人坦克也要移动,子弹呢?当然也要会移动,等等…。那么这么多的功能要实现就要用到线程了。1.3.4io流编程实现菜单功能IO包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到内存中所以也分为字符输入流和字节输入流。输出流指的是将内存中的数据写入外部媒介,也分为了字符输出流和字节输出流。我们的坦克大战游戏就是利用IO流来记录玩家的分数,成绩的。程序如下://把玩家击毁敌人坦克数量保存到文件中publicstaticvoidkeepRecording(){try{//创建fw=newFileWriter(d:\\myRecording.txt);bw=newBufferedWriter(fw);bw.write(allEnNum+\r\n);}catch(Exceptione){-7-e.printStackTrace();//TODO:handleexception}finally{//关闭流try{//后开先关闭bw.close();fw.close();}catch(Exceptione){e.printStackTrace();//TODO:handleexcepti