收藏 分销(赏)

基于JME的坦克大战的设计与实现样本.docx

上传人:精*** 文档编号:4655729 上传时间:2024-10-08 格式:DOCX 页数:26 大小:214.64KB
下载 相关 举报
基于JME的坦克大战的设计与实现样本.docx_第1页
第1页 / 共26页
基于JME的坦克大战的设计与实现样本.docx_第2页
第2页 / 共26页
点击查看更多>>
资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 目 录 第一章 引言 1 第二章 开发环境、 相关理论和可行性分析 2 2.1游戏的开发环境 2 2.2 相关理论与技术 2 2.3 可行性分析 2 第三章 需求分析 3 3.1系统的主要功能 3 3.2功能上需解决的技术问题 3 第四章 概要设计 5 第五章 游戏的详细设计与实现 6 5.1游戏所包含的类及类与类之间的关系 6 5.2游戏中关键类的详细设计 9 第六章 游戏的运行与测试 14 6.1 测试方案 14 6.2 测试项目 14 参考文献 18 基于J2ME的坦克大战的设计与实现 摘 要: 随着手机的日益普及, Java在移动设备上的实现、 Java程序产生的手机增值服务逐渐体现出其影响力。Java对丰富人们的生活内容、 提供快捷的资讯起着不可忽视的作用。本论文基于J2ME技术的基础上, 开发了一款可商用的手机游戏程序——坦克大战。程序的界面和运行方式继承了日本任天堂公司20世纪80年代开发的游戏Battle City。 关键词: J2ME, 手机游戏, Java, 坦克大战 第一章 引言 J2ME是一种程序语言, 是一种高度优化的Java运行环境, 是为移动电话和PDA之类的嵌入式消费电子设备提供的Java语言平台。其利用的开发工具主要有Eclipse和Net Beans两种, 同时也是最常见的两种, 由于其适用平台从以前的电视机、 PC等转换到如今十分流行的手机中来, 使以手机为平台的应用类软件拥有巨大的市场空间, 随着3G的开通和应用, 使得手机类应用程序迎来新的热潮, 使其发展前景十分的可观。 随着移动通讯技术的发展和无线数据业务的进步, 手机游戏已经不再是一个无关紧要的附属品了。从文本信息到多媒体内容, 从2.5G网络到呼之欲出的3G时代, 全新的手机游戏领域已逐渐聚焦了众多软件开发商的目光, 使得游戏开发者和游戏玩家共同面临着一个令人振奋的游戏新世界。 Java良好的跨平台特性在移动平台的开发中显示出了巨大的威力。Java语言面向对象的优势也使得开发游戏变得非常容易。手机在当今社会上的地位已经不再是普及的问题, 同时Android继承java的同时发挥了拓展了大量自身的优势, 其开源性更是使其在手机市场上迅猛的占据着绝对优势, 在这样的恶劣环境中, java以其跨平台、 面向对象、 健壮性、 良好的稳定性能、 开发周期短等等优势捍卫者自己的市场, 因此不论是在传统的手机还是在现在风靡全球的Android手机上都少不了java的运行环境和大量的java程序。 第二章 开发环境、 相关理论和可行性分析 2.1游戏的开发环境 操作系统: Microsoft Windows XP 程序语言: Java 2 开发包: JDK5.0 Java(TM) 2 Standard Edition sun_java_wireless_toolkit-2.5.2_01 IDE: Eclipse eclipse-SDK-3.7 ( 插件: eclipseme.feature_1.7.9_site) 2.2 相关理论与技术 本系统在设计方面做了很大的改观, 为未来的长久安全的使用做了大量的准备工作, 对于任意一款软件的开发, 应用才是重中之重, 因此本着实用的基本原则, 本系统以J2ME语言为基础在手机等支持Java语言的电子设备平台上实现主要功能, 以eclipse为开发平台主要以MIDLet、 Canvas和RMS等主要技术为支持, 该查询系统不但用到了上述方面的知识同时对RMS数据库的知识也要有一些比较清晰的了解, 增加系统完成的可能性。 2.3 可行性分析 技术可行性: 本游戏对画图、 屏幕刷新的要求, 对运算的要求, 对线程的要求( 同时也只需要十个左右的线程) , 都算是处于手机移动平台能够处理的水平; 同时我们能看到很多的成功的例子, 就像经典版的坦克大战。很显然, 技术上是可行的。 经济可行性: 本游戏的开发主要在于完成毕业设计, 不注重直接的经济效益与其后的发展方向, 只在注重自身的水平提高, 对自身的经济要求也不高, 只需要有一台能运行相应J2ME程序的电脑便可, 因此基本不用考虑经济上的问题。 社会可行性: 本游戏的开发主要目的是为了完成毕业设计, 开发的主体是个人, 不存在法律上面的侵权行为, 也不会对社会造成影响, 在这方面也是完全可行的。 第三章 需求分析 3.1系统的主要功能 坦克大战是一款经典的游戏, 本游戏在学习继承前辈的同时, 尝试性的进行一些创新; 下面是对系统主要功能的简要概述。 整体上说, 本游戏分为敌我双方, 有八个关卡, 主战坦克有玩家控制, 敌方坦克能够智能化的运行。 1 玩家的控制 游戏打开的时候, 玩家能够选择关卡, 然后进入游戏, 玩家能够经过上下左右键控制坦克的运行, 能够经过中间的键控制坦克打出炮弹, 当坦克打中敌方坦克, 子弹和地方坦克都死亡。游戏过程中, 玩家能够暂停游戏, 然后开始游戏, 还能够退出到前面的界面。当一关的所有敌方坦克都死亡, 则进入下一个关卡。 2敌方坦克的智能运行 敌方坦克是有一系列的随机数控制的, 不但能够智能运行, 还能智能打出炮弹, 当打中主战坦克时, 主战坦克的生命值自动减一, 同时回到初始化是的位置。 3子弹的运行 主战坦克是有玩家控制打出的, 敌方坦克是随机打出的, 只有当子弹不属于同一方是子弹与坦克的碰撞才有效。当子弹打到墙壁和屏幕的边缘时, 子弹也会消失。 4关卡的设置 第一次玩游戏时, 只有第一关是被解锁的。也就是只有第一关能玩。其它的关卡需要玩家解锁。只有玩家过了前面的关卡, 随后的那个关卡才会被自动解锁。这种实现是用RMS完成的, 因此退出游戏, 下次进入游戏时已经被解锁的关卡依然处于被解锁的状态。 3.2功能上需解决的技术问题 1. 游戏程序是一项精度要求很高的程序系统, 因为其代码利用率很高。一个实时运行的最终作品, 每秒都会运行成千上万行程序, 绘图事件、 键盘事件都会以极高的频率在后台等待响应, 若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误, 甚至死循环。因此, 其逻辑设计应当相当严谨, 需将所有可能发生的事件及意外情况考虑在设计中。 2. 游戏中为了美观和适用性强, 就需要采用外部文件引入的png图片, 有关贴图, 在MIDP2.0中提供了用于增强游戏功能的game包, 使得解决静态或动态、 画面背景、 屏幕刷新的双缓冲等都有较好的解决方案。这里应当减少手工画图, 从而是程序能更高效的运行。 3. 己方坦克的运行能够经过监听键盘控制, 但由于敌方是自动运行, 就需要有较强的智能性; 同时, 屏幕上的敌方可能会有较多的数量, 这需要为每个敌方开辟一个线程以便能让其独立运行。还需要在坦克死亡的时候终止线程。Java的多线程能力为实现这样的游戏提供了可能。敌人坦克的运行算法也需要进行适当的设置, 以免游戏过于简单, 单调, 或者过于繁杂。 4. 对于双方坦克发出的子弹的控制也需要对其跟踪控制, 为了避免子线程太多的现象, 子弹不应当成为独立的线程。这里就需要一个单独的线程来控制子弹, 或者是由子弹所属的坦克来控制子弹。这需要对所有的对象有较好的控制。另外, 子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。 如果子弹由产生自己的坦克控制, 就需要特别这一子弹类和坦克类之间的关系。 5. 碰撞检测是坦克大战的最重要的环节之一。双方的坦克在运动过程中需要考虑到是否碰撞到墙壁、 屏幕边缘、 子弹或对方坦克, 以免重叠运行, 造成许多逻辑上不可能的情况。每一次刷新页面、 每一次的移动都要考虑整体以及个体与个体的变化。 6. 游戏的结束、 开始、 动态信息画面作为构成一个完美程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标, 相关的美术构图也需要有一定的考虑。 7. 游戏地图放在一个专门的类中, 这个类中存储代表地图的二维数组。地图的选择也就是对这个类中的二维数组的选择。 8. 用户运行游戏时需要有分数记录的可能。如何采用合理的记分标准, 需要进行适当的设计。记录分数的存储方式也需要有较好的解决方案。手机中由于处理器和内存空间、 存储空间都十分有限, 其数据库系统与普通PC大相径庭。其数据库结构较为简单, 被称之为RMS系统。 9. Java是基于虚拟机的半解释型编译系统, 其执行效率较C++等完全编译后的程序会低很多, 程序如果不进行精简和优化, 将可能导致运行的不流畅。除开发过程中对结构上的控制、 变量的使用、 算法的优化等优化外, 还能够使用混淆器(Obfuscator)进行程序打包后的优化。 第四章 概要设计 程序的入口是继承了MIDlet类的TankMIDlet类, 运行后会进入一个List, 也就是一个选择界面。有两个选项, 一个选项是对游戏操作的详细说明, 另一个是一个选择关卡的List。玩家能够选择查看游戏说明, 然后确定返回到上层的选择界面, 玩家也也能够直接选择关卡。当玩家选择了已破解的关卡后就能够顺利的进入游戏的主界面开始游戏了, 如果关卡未破解, 屏幕的上方会有提示信息显示此关未破解, 这时就需要玩家重新选择了。主程序中, 系统会自动的收集变化的参数, 不停地重新初始化, 重新绘制屏幕, 这些都是有MIDlet和线程完成的。玩游戏的过程中, 玩家能够选择暂停游戏, 然后能够继续游戏, 玩家还能够返回选择界面。 TankCanvas主管着类之间的协调, 决定何时死亡, 合适打出炮弹, 何时显示游戏结束后的Gameover字样。它运行于独立的线程中, 以恒定的频率刷新画面。 为了是程序更清晰, 程序中将主战坦克与敌方坦克作为一个类, 用一个变量isEnemy来区别是主战坦克还是敌方坦克。所有的坦克类均在TankCanvas中建立了对象, 初始化由initialTanks()方法完成, 也便于统一调度。TankCanvas中有一个drawAll()方法, 这样所有的屏幕绘制都只需调用这个方法。 如图4.1是整个游戏程序的流程图: 图4.1 设计流程图 第五章 游戏的详细设计与实现 5.1游戏所包含的类及类与类之间的关系 本程序采用面向对象的设计模式, 对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单, 在开始游戏后将先从外部文件载入地图文件, 对背景的所有物体进行绘图。在主程序运行的线程中, 画面刷新将以一定的频率采用双缓冲技术对屏幕重绘, 实时反映整个游戏的进行状态。用户控制的坦克运行在主线程中, 随屏幕刷新的频率而步进。敌方坦克将在游戏开始时逐渐新增线程, 每增加一个敌方对象就新增加一条线程, 当敌方坦克的数量为零, 下一个关卡被自动解锁, 程序自动进入到下一个关卡。所有的子弹都放在一个定制的Vector的子类MyVector容器中。在屏幕重绘的主程序中, 将在每次的循环中判断若干事件。如: 用户坦克的生命是否已完全用尽, 敌方坦克数是否已经为零, 屏幕上的坦克数量是否少于仍剩下的坦克数量等。以便程序进入相关的分支执行相关的反应代码, 结束游戏或统计分数等。主程序流程如图5.1所示: 开始 选择界面 确定 游戏说明 选择关卡 此关已破解? N 显示此关未破解 Y 游戏主程序 初始化参数 绘制屏幕 事件 显示GAMEOVER 结束 图5.1 总体流程图 1.游戏所包含的包及其说明如表5.1 表5.1 各包说明表 包名 包的说明 包含的类 default package 游戏中主要的类 Tank, Bullet, Music, Map, Rms, TankCanvas, TankMIDlet myVector 为了方便遍历和装载子弹坦克而定制的包 Iterator, MyVector 2.游戏所包含的类及其说明如表5.2 表5.2 类说明表 类名 类的说明 与其它类的关系 体现类关系的域 包含的主要方法 TankMIDlet 游戏的入口, 大管家 MIdletde 子类, 拥有Canvas, Music, Rms的实例 TankCanvas的实例canvas 响应事件的方法commandAction(Command c, Displayable d) TankCanvas 绘制屏幕 Canvas的子类, 实现Runnable接口, 拥有所有Tank类的实例, 拿到管家TankMIDlet的引用 装载Tank的容器MyVector的实例vector 绘制屏幕的Paint(Graphics)方法,线程的run()方法,相应键盘的keyRepeated( int key) 方法 Tank Tank类 实现了Rannable接口, 继承GameCanvas类, 拿到管家TankCanvas的引用 管家TankCanvas引用提出, 子弹装载器bullets, 精灵的实例imgSprite 独立线程的run()方法, 移动和碰撞的crackWalls()、 crashOneAnother()、 crackDir()等方法 Bullet 子弹类 拥有管家Tank的引用t 自己所属坦克的引用Tank t 绘制精灵的draw()方法, 碰撞检测的crackWalls()方法 Map 地图类, 存放地图数组 所有的静态域和方法能够随时被任何类使用 7个静态的map二维数组, 一个静态的装在二维map数据的三维数组 返回相应关卡的二维map数组的getMap(int n)的静态方法 Rms RecordStore实例recordStore 增加数据add(int g,Sting playerName)和修改数据的modifier(int g,String playerName()方法 Music 音乐播放类 类的实例在TankMIDlet中被创立 Player对象player 控制播放的start()、 start(String name)、 stop()方法 Iterator 用于遍历的接口 在MyVector中被实现 没有域 hasNext(), next() MyVector 容器类 实现了有一个实现了Iterator的内部类 继承Vector中的域 返回一个Iterator对象的iterator()方法 5.2游戏中关键类的详细设计 1.Tank类的详细设计 Tank被设计为独立的线程类。同时继承了GameCanvas。作为一个独立的线程类, Tank类有自己run()方法。这个方法中, 它会进行各种碰撞检测, 会在屏幕是绘制自己的imgSprite精灵, 如果是敌方坦克, 是否能够自动的打出炮弹, 是否能够智能的变向。如果是主站坦克, 是否接收到了键盘的事件, 是否发生了碰撞。这些都由相应的方法来实现: controlMove()方法, 利用Random类的实例产生一个随机的方向; crackWalls()方法检测与屏幕的边缘的碰撞并作出相应的反应, 也就是调用ControlMove()方法。最核心的方法是crackOneAnother()方法, 这个方法检测Tank与Tank的碰撞, Tank与Bullet的碰撞, 而且作出一系列的反应, 例如Tank的死亡, 子弹的移除等。代码如下: public void crashOneAnother() { Iterator it = getTc().tanks.iterator(); while (it.hasNext()) { Tank t = (Tank) (it.next()); if (!this.equals(t)) { if (imgSprite.collidesWith(t.imgSprite, false)) { this.imgSprite.move(-xDir * SPEED, -yDir * SPEED); if (this.isEnemy()) { crackDir(); } } } } it = Tank.bullets.iterator(); while (it.hasNext()) { Bullet b = (Bullet) (it.next()); if ((this.isEnemy() == true && b.isEnemy() == false) || (this.isEnemy() == false && b.isEnemy() == true)) { if (imgSprite.collidesWith(b.getImgSprite(), false)) { this.halt();// 终止线程 if(this.isEnemy() == false) { TankCanvas.setLife(TankCanvas.getLife() - 1); if(TankCanvas.getLife() == 0) { this.getTc().tanks.removeElement(this); this.getTc().setGameOver(true); }else { this.imgSprite.setPosition(px, py); } }else { this.getTc().tanks.removeElement(this); if(((Vector)(this.getTc().tanks)).size() == 1) { if(TankCanvas.getMapNum() < TankMIDlet.getRms().valley()) { }else { TankMIDlet.getRms().modifier(TankMIDlet.getRms().valley() + 1, TankMIDlet.getRms().name()); System.out.println("valley" + TankMIDlet.getRms().valley()); } TankCanvas.setMapNum(TankMIDlet.getRms().valley()); this.getTc().setMap(); this.getTc().tanks.removeAllElements(); this.getTc().o = false; } } this.getTc().setKilledEnemy( this.getTc().getKilledEnemy() + 1); Tank.bullets.removeElement((Bullet) b); } } } } 首先, Tank类的实例需要拿到TankCanvas的引用, 以便在必要的时候拿到TankCanvas的域或者方法。 TankCanvas tc = null, 这个值在构造方法中拿到。 程序中不论是主战坦克还是敌方坦克都是Tank类的实例, 在类中, 用一个布尔变量enemy来区分, 当enemy的值为true是, 表明坦克实例为敌方坦克, 当enemy的值为false时, 实例为主战坦克。 Boolean enemy = true, 这个值在构造方法中拿到。 构造方法如下: public Tank(TankCanvas m, int x, int y, int xDir, int yDir, boolean enemy) { super(false); this.px = x; this.py = y; this.setxDir(xDir); this.setyDir(yDir); setTc(m); this.setEnemy(enemy); try { img = Image.createImage("/tank1.png"); tankWidth = img.getWidth() / 4; tankHeight = img.getHeight(); imgSprite = new Sprite(img, tankWidth, tankHeight); } catch (IOException e) { System.out.println("can't find the picture!"); } this.imgSprite.setPosition(x, y); thread = new Thread(this); thread.start(); } 2. Bullet类的详细设计 Bullet的所有实例都装在Tank类中的一个MyVector的静态实例中。Bullet和Tank一样, 不论Bullet的实例是产生于主战坦克还是敌方坦克, 她么都是一个类的实例, 只是在实例化这个实例的时候给了它一个enemy的值, 这个值和产生它的Tank对象时相等的。 我们能够经过Bullet的构造函数看到Bullet类的一些属性, 包括颜色、 速度、 半径、 隶属于哪个坦克、 自己的精灵等。 public Bullet(Tank t) { this.t = t ; this.setEnemy(t .isEnemy());//子弹也分好坏 this.xDir = t .getxDir(); this.yDir = t .getyDir(); img = Image.createImage(DIAMETER, DIAMETER); Graphics imgG = img.getGraphics(); imgG.setColor(GREEN, RED, BLUE); imgG.fillArc(0, 0, DIAMETER, DIAMETER, 0, 360); setImgSprite(new Sprite(img)); bulletStar(t.imgSprite.getX(), t.imgSprite.getY(), xDir, yDir); } Bullet的工作很少, 与坦克的碰撞在Tank类中实现了。只有一个与屏幕边缘的碰撞检测, 也就是crackWalls()方法。当检测到碰撞时, 将这个Bullet实例从MyVector的实例中移除。 Tank.getBullets().removeElement(this); 3.Music类的详细设计 Music类有三个方法, 是用来打开音乐和关闭音乐的。这个音乐文件必须是mid格式的文件。Start(string name)方法用来打开指定文件名的音乐文件, start()方法打开Music实例的音乐文件。Stop()方法暂停音乐的播放。 4. Map类的详细设计 Map类中的变量和方法都是静态的, 这样只需要直接经过类名类使用。程序中设置了8个关卡, 因此这里有8个用于绘制地图的静态的二维数组。 为了将相应的数组与相应的关卡对应起来, Map类中有一个专门用来存放二维数组的三维数组, 如下: Private static int[][][]= maps={map0,map1,map2,map3,map4,map5,map6,map7};然后我们用一个public的get方法得到相应关卡的表示地图的二维数组: public static int[][] getMap(int n) { return maps[n]; } 5.数据库RMS的详细设计 本程序中, RMS的作用是存储游戏的那些关卡已经被破解。实际上, 数据库中至存储了一个记录, 就是当前的关卡一经被破解到的关卡数量加上一( 实际上, 这个数字和Map中的变量相对应的, 也就是它是从0开始的) 和破解这个关卡的玩家姓名。这里为了简化程序, 玩家的统一为system。本游戏初始化只有第一关是被破解的。 程序中的数据库的操作放在了类Rms中, 这个类中的一个主要方法就是modifier(ing g,String playerName),她修改数据库中的数据, g为修改后的被破解的地图下标, 对应关卡加一。 6.容器和遍历 在整个程序中用到了Vector容器来装坦克和子弹, 在绘图, 碰撞检测等很多地方都需要对这个容器中的对象进行遍历, 但j2me中不提供这种功能, 为了简化大量的遍历带来的麻烦, 我在这里拓展了Vector类而创立了一个Vector的子类MyVector。它里面有一个方法叫Iterator(), 它的功能和用法和j2me中的Iterator()完全一样。 在这个包中, 定义了一个Iterator接口: public interface Iterator { public boolean hasNext(); public Object next(); } MyVector继承Vector, 拓展了一个新的方法iterator(),它返回一个Iterator接口对象, 拥有上面的两个方法。同时, 在MyVector中定义了一个实现了Iterator接口的内部类, 它实现了Iterator的两个方法。 public class MyVector extends Vector { public Iterator iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator { int currentIndex = 0; public boolean hasNext() { if(currentIndex >= elementCount) { }else return true; } public Object next() { return elementAt(currentIndex++); } } 第六章 游戏的运行与测试 6.1 测试方案 测试方式主要有两种: 静态测试和动态测试, 我们主要采用的是动态测试。由于动态测试是经过运行程序来检验软件的动态特性和结果的正确性, 同时也是对程序运行进行评价的过程, 动态测试包括运行、 解释和模拟。 本系统主要是在WIN XP上的测试, 主要依靠系统和运行结果与预期结果进行比较, 看是否实现预期的功能, 以达到系统的全面行、 可行性等。 6.2 测试项目 本程序包括如下的几个测试模块: (1) MIDlet中相应按钮事件的测试; (2) 关卡的测试( 数据库功能的测试) ; (3) Canvas中的暂停开始等按钮事件的测试; (4) Canvas中双方交战的各种测试; 1. MIDlet中相应按钮事件的测试; 在正确的运行程序后, 将进入选择界面, 如图6.1。当经过上下键选择游戏说明并按下确定键时, 程序会跳向图6.2的界面。在6.2所示的界面中, 键盘按下”收到! ”, 程序会返回到6.1所示的界面。当经过上下键选择开始并按下确定键时, 程序会跳向图6.3所示选择关卡的界面。 图6.1 图6.2 图6.3 2.关卡的测试( 数据库功能的测试) 当程序显示在图6.3所示的界面是, 当经过上下键选择游戏说明并按下确定键时, 程序会自动进入相应的关卡。这里抽样出前三个关卡的截图, 图6.4、 6.5、 6.6非别为为第一关、 第二关和第三关的关卡。 图6.4 图6.5 图6.6 当关卡未被破解时, 我们能够看到”此关未解锁”的提示, 见图6.7: 图6.7 3. Canvas中的暂停开始等按钮事件的测试 当双方处在如上面的三个图所示的交战状态时, 我们能够经过下面的按钮控制游戏。当我们按下stop时, 游戏会暂停, 同时, stop会变成start, 如图6.8所示。当游戏处于暂停状态, 当我们按下move时, 游戏又会继续进行, 同时, move又会变回到stop, 如图6.9。 图6.8 图6.9 当程序处在Cavas界面时, 我们按下了back, 程序会返回到选择关卡的界面, 如图6.10。玩家能够经过确定键和move来跳回到游戏对打界面, 可是这时的选择关卡是没有意义的。也就是说, 无论玩家是选择哪个关卡, 用的是确定键还是move键, 程序都会跳回到如图6.11所示的状态, 而且, 点击move以后游戏才会开始, 进入图6.12的状态。 图6.10 图6.11 图6.12 4. Canvas中双方交战的各种测试 无论是坦克双方的移动, 子弹的打出, 还是子弹、 坦克、 地图和屏幕边缘的碰撞检测等的测试经过单独的图片是不能证明问题的, 必须在实际的操作中才能测试出来, 可是经过上面的那些截图也能看出这个程序所必须具备的功能的大概的正确性。下面对游戏的屏幕左上角所显示的字符串信息与程序的逻辑之间的正确性。 游戏初始化时, 玩家有十条生、 杀敌数为0, 关卡为当前所在关卡。游戏过程中这三个字符串分别表示当时玩家的生命值、 玩家杀掉的敌方坦克的总数量和当前所在关卡。如图6.13为初始化时的状态。图6.14为刚刚进入第二关时的状态。当玩家的生命值减少到0时, 游戏结束。这时, 玩家能够看到屏幕中间显示的GAMEOVER的字符串, 如图6.15. 图6.13 图6.14 图6.15 第七章 结论 这是一个小游戏, 但对于我来说却是一个不小的工程。从开始到将游戏写到现在的这个样子的过程, 实际上就是遇到问题然后再解决问题的过程、 是一个学习的过程。最开始的时候, 我并没有将这个游戏的所有功能和所有的细节都考虑在其内。而是在原有内容的基础上添加功能。从软件工程的角度讲是自上而下、 逐步求精的软件工程方法。但这对框架的可拓展性又极高的要求, 因此作为初学者的我在写代码的过程中深深地体会到了java框架和软件工程学的方法的重要性。 游戏运行起来还有许许多多的问题, 还有很多地方需要优化。 1. 游戏缺少开始部分的画面, 能够是一个很酷的背景图片。这一点实现起来其实挺简单, 但作为一个细节方面的不影响大局的部分, 我将其省略了。 2. 游戏能够设置更多更复杂的关卡, 但这不是编程以内的问题, 同时也是一个比较耗时的工作, 这个能够留到以后慢慢优化。 3. 在真正对战的工程中, 主战坦克可能会出现即使与敌方坦克发生了碰撞也没有检测到的问题。敌方坦克可能会纠结在屏幕的角上不停地变向而无法离开。这是程序的两个小bug, 当前还没有找到问题的根由。 4. 程序中, 无论是子弹的速度, 主战坦克的速度, 都是不变的。程序需要拓展, 让它们的速度可变, 这样能够提高程序的可玩性。 总体上讲, 这个程序只能算是坦克大战的雏形, 还有很多需要添加改进和优化的地方。虽然这个游戏作为毕业论文已经结束, 但我还是会在它的基础上继续修改和优化, 将其完善。这只是一个小小的开始。 参考文献 [1] 陈立伟,张克非.精通Java手机游戏与应用程序设计[M]. . [2] KimTopley.张伶,林琪译.J2ME技术手册[M].北京:中国电力出版社, .13-16. [3] 印旻.java语言与面向对象程序设计[J].北京:清华大学出版社. . [4] 吴延昌,冯萍,苏聪.基于J2ME技术的应用开发与研究[J].微电子学与计算机, ,22(9):73. [5] 魏永红.基于J2ME技术的手机信息查询系统的设计与实现[J].微计算机信息, (12). [6] 仵博,张立涓.J2ME无线开发实用教程[M].北京清华大学出版社, . [7] Michael Morrison.J2ME手机游戏编程入门[M].人民邮电出版社, . [8] 朱福喜.Java 程序设计技巧与开发实例[J].北京:人民邮电出版社. . [9] 严雪萍.基于GPRS的远程数据采集系统设计[J].微计算机信息, .
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服