欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    毕业设计(论文)-基于Java的坦克大战软件程序设计.doc

    • 资源ID:93227744       资源大小:191.04KB        全文页数:30页
    • 资源格式: DOC        下载积分:9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    毕业设计(论文)-基于Java的坦克大战软件程序设计.doc

    华中科技大学文华学院基于Java的坦克大战游戏软件程序设计题目: 基于Java的坦克大战游戏的设计与实现学 生 姓 名: 学号:学 部 (系):_信息科学与技术学部_专 业 年 级: _11级电子信息工程_指 导 教 师: 职称或学位:_硕士_2015年5月2日摘 要 随着网络时代的到来及发展,游戏产业方兴未艾,出现了前所未有的繁荣。“贪吃蛇”、“俄罗斯方块”这些简单的游戏曾为一代接一代的游戏玩家所熟悉。并且随着网络通信技术的迅速发展,更加有趣、更为生动的游戏层出不穷。由于Java技术的不断发展,Java良好的跨平台特性在移动平台的开发中显示出了巨大的威力。Java语言面向对象的优势也使得开发游戏变得非常容易,同时eclipse平台的优越性也给了这类游戏程序的设计带来了很多的优点和方便。本论文主要介绍了坦克大战游戏的设计思路和实现过程。这种设计主要是利用函数对背景的所有物体进行绘图,然后利用线程以及事件监听机制对物体进行控制,例如坦克,从而实现各种功能,最后就可以构成一个活生生的坦克大战游戏了。Java功能在移动设备上的实现,Java应用程序产生的服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本论文着眼于java语言的优点,开发一款可可供娱乐的游戏程序坦克大战。关键字:eclipse平台,游戏,Java,坦克大战目 录摘 要- I -Abstract - I -第一章 程序结构、思想和相关技术- 3 -1.1 本程序需解决的有关技术问题- 3 -1.2 程序流程- 4 -1.3 绘图与事件监听以及线程技术和IO流编程- 6 -1.3.1 Graphics类- 6 -1.3.2 KeyListener监听机制- 6 -1.3.3 runnable实现线程- 7 -1.3.4 io流编程实现菜单功能- 7 -第二章 游戏的设计思路- 8 -2.1 画出坦克- 8 -2.2 坦克的控制和敌方的智能运行- 8 -2.3 子弹的运行和控制- 9 -2.4玩家成绩的记录- 10 -2.5游戏面板与菜单的设计- 11 -第三章 程序分析和实现过程- 12 -3.1 游戏进入前的面板设计分析- 12 -3.2 游戏逻辑函数及其涉及到的若干类- 13 -3.3 坦克的共同行为- 15 -3.4 玩家坦克的功能属性- 16 -3.5 敌人坦克的功能属性- 16 -3.6 子弹击中坦克的爆炸- 18 -3.7 记分系统- 19 -3.8 本章小结:- 21 -第四章 总 结- 21 -4.1 本程序的总结和展望- 21 -4.2 经验和感想- 22 -参考文献- 23 -第一章 程序结构、思想和相关技术1.1 本程序需解决的有关技术问题1. 坦克大战是一个可大可小的游戏,想法灵活可以编写出很多功能,所以需要对程序的要求量应该是巨大的,但是其代码利用率很高,因此实际编写时也不需要太多的绞尽脑汁,可以利用各模块程序的相近性灵活运用。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。2. 游戏中为了美观,适用性强以及操作的简便性,我们主要利用draw函数画出矩形,圆及线构成一辆Tank,同时画出子弹,敌方坦克可以直接引用之前画出的坦克,这样画图的问题就基本解决了。 3. 己方坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定其一定的智能性;同时,出现在屏幕上的敌方可能会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。Java的多线程能力为实现这样的游戏提供了可能。敌人坦克的运行算法也需要进行适当的设置,以免游戏过于简单,单调。4. 对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。敌方子弹仅需要扫描用户坦克,而用户坦克需要在每一步扫描所有的敌方坦克。这需要对所有的对象有较好的控制。另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。同时为了游戏的公平性,己方坦克发出的子弹数量必须控制,不能一下发出太多颗。5. 对于敌我双方的坦克在运动的过程中也需要考虑会不会发生碰撞也就是重叠状况体,也要考虑坦克碰到边缘时不能继续前进,以免跑出有效范围,每前进一步都需要将所有的周围环境进行严格的控制。6. 游戏的结束、开始、动态画面等信息是构成一个完美程序必不可少的环节。良好的用户界面更是吸引用户的硬实力,为此必须要加入坦克爆炸的效果图以及游戏进行时的音效。7. 用户运行游戏时需要有分数记录的可能。如何采用合理的记分标准,需要进行适当的设计。记录分数的存储方式也需要有较好的解决方案,可以利用IO流编程来实现将数据存入电脑硬盘中的某个文件中。1.2 程序流程本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单,在开始游戏后将先对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。用户控制的坦克运行在主线程中,敌方坦克将在游戏开始时逐渐新增线程,每增加一个敌方坦克对象就新增加一条线程,一旦线程数满到最大值(本程序暂设置为20),就不允许敌人再继续出现。用户坦克自诞生之时起将拥有5发子弹的权利,子弹虽然开在单独的线程中,但运行结束后(比如撞到相关物体或敌方坦克时)并不结束子弹对象,只是将其线程终止。用户再次发射子弹时只是将终止的线程再次激活。在屏幕重绘的主程序中,将在每次的循环中判断若干事件。如:用户坦克的生命是否为0,敌方坦克数是否已经为零,屏幕上的坦克数量是否少于仍剩下的坦克数量等。以便程序进入相关的分支执行相关的反应代码,结束游戏或统计分数等。主程序流程如图所示:Logo 画面游戏选项主程序屏幕绘图本关记分统计显示结束显示历史记分表敌方需要出坦克时,生成坦克初始化参数死亡时符合结束条件时1.3 绘图与事件监听以及线程技术和IO流编程1.3.1 Graphics类Graphics类是所有图形上下文的抽象基类,允许应用程序可 以在组件(已经在各种设备上实现),以及闭屏图像上,进行绘制。用fill3DRect画出矩形,fillOval画出圆,drawLine画出线,三个矩形,一个圆及一条线就可以构成一个坦克,如图:1.3.2 KeyListener监听机制要想使坦克动起来,子弹运动起来,以及菜单模式下的各种功能能够控制坦克大战游戏的运行,比如继续游戏(continueGame),保存游戏并退出(saveExit),退出游戏(exit)以及开始新游戏(newgame)必须注册监听机制,例如程序如下:jm1.setMnemonic('G');jmil =new JMenuItem("开始新游戏(N)");jmi2 =new JMenuItem("退出游戏(E)");jmi3 =new JMenuItem("存盘退出游戏(C)");jmi4 =new JMenuItem("继续上局游戏(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.3 runnable实现线程Java界曾流行这样一句话:不懂线程就不要说自己会Java,可见线程对Java的重要性是多么的大。那么线程的作用有哪些呢,最为典型的就是你在网络上放一个服务端,一个客户端访问时,就会新建一个线程处理这个客户端的事务,这样的话只要不断新建线程就可以处理多个用户的请求了。当然我们的这个坦克大战游戏的实现肯定离不开线程,例如己方坦克是必须要会移动的,那么敌人坦克也要移动,子弹呢?当然也要会移动,等等。那么这么多的功能要实现就要用到线程了。1.3.4 io流编程实现菜单功能IO包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到内存中所以也分为字符输入流和字节输入流。输出流指的是将内存中的数据写入外部媒介,也分为了字符输出流和字节输出流。我们的坦克大战游戏 就是利用IO流来记录玩家的分数,成绩的。程序如下:/把玩家击毁敌人坦克数量保存到文件中public static void keepRecording()try /创建fw=new FileWriter("d:myRecording.txt");bw=new BufferedWriter(fw);bw.write(allEnNum+"rn"); catch (Exception e) e.printStackTrace();/ TODO: handle exceptionfinally/关闭流try /后开先关闭bw.close();fw.close(); catch (Exception e) e.printStackTrace();/ TODO: handle exception 第二章 游戏的设计思路2.1 画出坦克坦克大战游戏中坦克当然得分两类,自己的坦克和敌人的坦克,在游戏中我们就将两类坦克分成两种颜色,以示区分。当然坦克画在面板中肯定不能自己变化方向,所以就需要画出四个方向的坦克,程序如下:/画出坦克的函数(扩展)public void drawTank(int x,int y,Graphics g,int direct,int type)/判断是什么类型的坦克switch(type)case 0:g.setColor(Color.cyan);break;case 1:g.setColor(Color.yellow);break;/判断方向switch(direct)/向上case 0:/画出我的坦克(到时再封装成一个函数)/1.画出左边的矩形g.fill3DRect(x, y, 5, 30,false);/2.画出右边矩形g.fill3DRect(x+15,y , 5, 30,false);/3.画出中间矩形g.fill3DRect(x+5,y+5 , 10, 20,false);/4.画出圆形g.fillOval(x+5, y+10, 10, 10);/5.画出线g.drawLine(x+10, y+15, x+10, y);break;case 1:/炮筒向右/画出上面矩形g.fill3DRect(x, y, 30, 5,false);/画出下面的矩形g.fill3DRect(x, y+15, 30, 5, false);/画出中间的矩形g.fill3DRect(x+5, y+5, 20, 10, false);/画出圆形g.fillOval(x+10, y+5, 10, 10);/画出线g.drawLine(x+15, y+10, x+30, y+10);break;case 2:/向下/画出我的坦克(到时再封装成一个函数)/1.画出左边的矩形g.fill3DRect(x, y, 5, 30,false);/2.画出右边矩形g.fill3DRect(x+15,y , 5, 30,false);/3.画出中间矩形g.fill3DRect(x+5,y+5 , 10, 20,false);/4.画出圆形g.fillOval(x+5, y+10, 10, 10);/5.画出线g.drawLine(x+10, y+15, x+10, y+30);break;case 3:/向左/画出上面矩形g.fill3DRect(x, y, 30, 5,false);/画出下面的矩形g.fill3DRect(x, y+15, 30, 5, false);/画出中间的矩形g.fill3DRect(x+5, y+5, 20, 10, false);/画出圆形g.fillOval(x+10, y+5, 10, 10);/画出线g.drawLine(x+15, y+10, x, y+10);break;2.2 坦克的控制和敌方的智能运行坦克分为两种,己方坦克和敌方坦克。己方坦克在玩家的控制下运行,敌方坦克随机运行。敌方坦克由于需要具有一定的智能性,以便对玩家攻击,使之具有一定的可玩性。所以在程序中我们试用random函数来控制敌方坦克的方向,给出0123四个数字,0代表向上运动,1代表右,2代表下,3代表左。并且敌人可以自动行走自如,但是应当在以下适当的情况下转向:第一是坦克是否超出界面的边界,第二是坦克是否与地图障碍物发生了碰撞,第三是坦克是否与用户坦克发生了碰撞。需要指出的是,当发生阻碍不能在不变方向的情况下继续行走时,并不一定立即需要采取转向的对策。如果一定发生转向,试想,当敌方碰到玩家时,如果它立即转向,将不会对玩家发射射向他的子弹,就不构成任何威胁,当然,也不能永远不转向。所以本次程序是这样安排的:当碰撞到障碍物或边界时立即转向,但碰到玩家坦克时需要有一个等待的时间,这个时间由碰撞前随机取得的在某方向上的持续行走步数决定(程序规定坦克走一定的路程后必须转向其他方向,不然就不一直按照之前的方向一直走下去),当发生坦克间碰撞时,此随机数将在下一次循环前减少为原来的2/3,这样就实现了加快转向的时间,避免死锁在一个方向上静止的停留过长的时间。另外,坦克的转后具体方向都由随机数决定。为了防止坦克运动过程中出现互相重叠的事情出现,我们必须对坦克的坐标进行判断,坦克与坦克之间的坐标以及边界互相不能侵犯,但是如果某坦克正从上方生成而正好有另一辆阻碍在该地方生成,这将导致不可避免的重叠。这是允许的,但需要对他们标注状态,即当坦克刚出现时暂时允许重合,一旦在某个时间他们脱离了重合状态,就不能在允许重合,如果不设置这样的判断,刚出现的坦克将会因为受到阻塞而永远不能前进,坦克将混成一团。本次程序中并未使用过多复杂的人工智能算法,如有时间,将可能再此方面加以完善。具体实现程序如下:1:/键按下处理 a 表示向左 s 表示 下 w 表示向上 d表示右public void keyPressed(KeyEvent arg0) / TODO Auto-generated method stubif(arg0.getKeyCode()=KeyEvent.VK_W)/设置我的坦克的方向this.hero.setDirect(0);this.hero.moveUp();else if(arg0.getKeyCode()=KeyEvent.VK_D)/向右this.hero.setDirect(1);this.hero.moveRight();else if(arg0.getKeyCode()=KeyEvent.VK_S)/向下this.hero.setDirect(2);this.hero.moveDown();else if(arg0.getKeyCode()=KeyEvent.VK_A)/向左this.hero.setDirect(3);this.hero.moveLeft();2:class Tank/表示坦克的横坐标int x=0;/坦克纵坐标int y=0;/坦克方向/0表示上 1表示 右 2表示下 3表示左int direct=0;int color;boolean isLive=true;/坦克的速度int speed=1;public Tank(int x,int y)this.x=x;this.y=y;public int getX() return x;public void setX(int x) this.x = x;public int getY() return y;public void setY(int y) this.y = y;public int getDirect() return direct;public void setDirect(int direct) this.direct = direct;public int getSpeed() return speed;public void setSpeed(int speed) this.speed = speed;public int getColor() return color;public void setColor(int color) this.color = color;3:/判断是否碰到了别的敌人坦克public boolean isTouchOtherEnemy()boolean b=false;switch(this.direct)case 0:/我的坦克向上/取出所有的敌人坦克for(int i=0;i<ets.size();i+)/取出第一个坦克EnemyTank et=ets.get(i);/如果不是自己if(et!=this)/如果敌人的方向是向下或者向上if(et.direct=0|et.direct=2)/左点if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)return true;if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)return true;if(et.direct=3|et.direct=1)if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)return true;if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)return true;break;case 1:/坦克向右/取出所有的敌人坦克for(int i=0;i<ets.size();i+)/取出第一个坦克EnemyTank et=ets.get(i);/如果不是自己if(et!=this)/如果敌人的方向是向下或者向上if(et.direct=0|et.direct=2)/上点if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)return true;/下点 if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30)return true;if(et.direct=3|et.direct=1)if(this.x+30>=et.x&&this.x+30<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)return true;if(this.x+30>=et.x&&this.x+30<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20)return true;break;case 2:/坦克向下/取出所有的敌人坦克for(int i=0;i<ets.size();i+)/取出第一个坦克EnemyTank et=ets.get(i);/如果不是自己if(et!=this)/如果敌人的方向是向下或者向上if(et.direct=0|et.direct=2)/我的左点if(this.x>=et.x&&this.x<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30)return true;/我的右点if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30)return true;if(et.direct=3|et.direct=1)if(this.x>=et.x&&this.x<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20)return true;if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20)return true;break;case 3:/向左/取出所有的敌人坦克for(int i=0;i<ets.size();i+)/取出第一个坦克EnemyTank et=ets.get(i);/如果不是自己if(et!=this)/如果敌人的方向是向下或者向上if(et.direct=0|et.direct=2)/我的上一点if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)return true;/下一点if(this.x>=et.x&&this.x<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30)return true;if(et.direct=3|et.direct=1)/上一点if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)return true;if(this.x>=et.x&&this.x<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20)return true;break;return b;2.3 子弹的运行和控制每一个坦克都有他自己的一颗子弹,这颗子弹在任何一辆坦克被画出时就一直存在,直至此坦克生命结束时也随着结束,它是一个继承了Runnable类的可运行单独线程的对象。在其出现在屏幕上的运行周期中,每一步都需要循环检测以下条件:是否与某坦克发生了碰撞,即击中了这辆坦克。子弹的击中又分为两种情况,如果此子弹来自于敌方,将只检测玩家坦克,因为敌方之间的子弹必须允许可以透明的穿过,以保证不会在敌人之间发生子弹的消减。如果来自玩家,则每一步需扫描所有的敌方坦克,检查是否发生碰撞,以便使击中的坦克消失。其次,子弹之间需要检测是否碰撞。敌人之间显然,上面已经提过,不需要检测,但敌人与玩家之间应当可以互相消除子弹,以便在狭窄的路口中仍有存活的机会。玩家的子弹需要在每一步检测所有敌人的子弹的运行状态。最后子弹对不同障碍物将有不同的反映。对砖墙将有能力将其击毁,使之在画面上消失;对水泥钢筋将不能发生作用,子弹也不能通过;对于河流,坦克不可以通过,但子弹可以;对于草丛,子弹和坦克都可以通过。2.4玩家成绩的记录任何一个游戏都会对玩家的玩耍记录有所保存,坦克大战也不例外,我们既需要记录下玩家消灭的坦克数量,还要对游戏的进程进行存档,假如玩家突然有事情需要去处理但又不想放弃该局游戏,那就必须有存档的功能。具体程序如下: else if(arg0.getActionCommand().equals("exit")/用户点击了退出系统的菜单/保存击毁敌人数量.Recorder.keepRecording();System.exit(0);/对存盘退出做处理else if(arg0.getActionCommand().equals("saveExit")System.out.println("111");System.out.println("mp.ets.size="+mp.ets.size();/工作Recorder rd=new Recorder();rd.setEts(mp.ets);/保存击毁敌人的数量和敌人的坐标rd.keepRecAndEnemyTank();/退出System.exit(0);2.5游戏面板与菜单的设计一个基本的游戏必须要有自己的运行菜单,最起码的功能要有开始新游戏,退出游戏,存盘退出游戏,继续上局游戏。具体程序如下:/创建菜单及菜单选项jmb=new JMenuBar();jm1 =new JMenu("游戏(G)");/设置快捷方式jm1.setMnemonic('G');jmil =new JMenuItem("开始新游戏(N)");jmi2 =new JMenuItem("退出游戏(E)");jmi3 =new JMenuItem("存盘退出游戏(C)");jmi4 =new JMenuItem("继续上局游戏(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");jm1.add(jmil);jm1.add(jmi2);jm1.add(jmi3);jm1.add(jmi4);jmb.add(jm1);msp=new MyStartPanel();Thread t=new Thread(msp);t.start();第三章 程序分析和具体实现3.1 游戏进入前的面板设计分析每个MIDlet程序都必须有一个主类,该类必须继承自MIDlet。它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。该类中拥有可以管理程序的创建、开始、暂停、结束的函数。游戏运行时,首先载入画面的不是游戏运行状态,而是提供选项,当再次选择开始新游戏时才正式运行。运行画面如图所示。因此,在TankMain的构造函数中分配了StartChoice类,即选项画面的内存空间。在startApp()函数中,随即调用了Displable的setCurrent()函数将当前屏幕设置为startChoice。在显示高级用户界面前,建造了一个Alert类。Alert对象用于显示提示、警告等告之用户信息的临时闪现的屏幕,它可作为setCurrent的参数,提前显示在最终需要显示的屏幕前。当将FOREVER作为Alert的参数时,将永久显示,直到用户点击相应按钮手动结束。但是当显示的画面元素超过一屏大小时,将自动转换为永久状态。在此,由于贴在Alert上的图片大小超出了其范围,故已成为永久状态。效果如图3-2所示。startChoice继承了接口commandListener,这样,就可以使用高级界面的Command按钮。继承了commandListener的类必须拥有commandAction(),以决定对按键采取什么样的行为。即按钮事件触发后需执行的函数。在设置好commandlistener后,需要调用setCommandListener()以将按钮事件激活。键盘事件中,可用getCommandType()返回的Command类型来确定选择的是什么按钮。startChoice继承了List类,用于显示列表选项,使用其append()函数可将选项加入到列表中。getSelectIndex()可检测到选择的项目的序号,序号从0开始递增。其中,当选择第一项时将载入正式游戏画面BattleCanvas类,第二项将显示帮助信息,第三项则是重新显示与作品和作者相关的logo画面。3.2 主游戏逻辑及其涉及到的若干类 BattleCanvas主管着所有类之间的协调,决定何时死亡,何时分配新的敌人,及控制敌人出现处的闪光图标、游戏结束后的动态Gameover字样。它运行在独立的线程中,以恒定的频率刷新画面。刷新速度需大于30/秒才能使画面显示因人眼的暂时停留效应流畅运行。本程序设置为20毫秒。其主逻辑如图4-4所示。程序中建立了另外的两个类,分别表述了敌人坦克和玩家坦克的功能。它们分别为:EnemySprite和UserSprite。这两个类均在BattleCanvas中建立了对象,以便进行统一调度。BattleCanvas包括了LayerManager,这样所有静态和动态的图象都不需要手动刷新,只需要在LayerManager中加入所有的需控制的元素,再统一由LayerManager刷新即可。因此,有必要在其中创立一个LayerManager的对象。 其他,如Sprite类的gameover字样、记分统计画面也都需在此主逻辑中建立相应对象。还需保存的变量有,游戏开始

    注意事项

    本文(毕业设计(论文)-基于Java的坦克大战软件程序设计.doc)为本站会员(知****量)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开