资源描述
摘 要面向对象方法是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,它吸取了结构化程序设计的精华,以更接近人们通常思维的方式来处理问题,是一种全新的软件开发技术。作为一种新的的编程语言,Java很大程度推广了面向对象的思想。随着计算机技术的发展,Java的强大展现出它不可替代的作用。Java的功能不仅体现在它网络方面的应用,对于应用程序设计、游戏设计等Java都能满足需求。本文针对Java 的具体应用,设计了一个小游戏。根据游戏的规则,用户将可以和计算机进行简单对战。程序实现了友好的用户交互界面,让用户能很好地对游戏进行操作。关键字:JAVA GUI 游戏 ABSTRACTThe Object-Oriented Method is a method which apllies the Object-Oriented Design to the process of the software exploiture and directs the ploy of development. It extracts the prime of the Structured Design for Computer Programmers, deals matters with afolksy fashion, which is considered to be a grand new software-develop technique.As a new programming language, Java spread the Object-Oriented Design in a certain degree. With the development of the technique of computer, the insurmountable function of JAVA is exhibited for its mightiness. Not only applies in network, JAVA also can fulfill the requirement of the Application-Design and Game-Design.In this paper, to use the idiographic application of JAVA , I design a game called . Following the regular of the game, user can play a simple revalry with computer. This programme actualizes a folksy GUI mode, which will make user master game easily. Keywords: JAVA GUI Game目 录一、 背景与意义- 1-二、坦克大战小游戏应用程序-2-三、 坦克大战小游戏系统的设计-2-3.1系统需求分析-2-3.2系统开发及运行环境-2-3.3系统主要功能要求-3- 3.4坦克大战系统总体结构-3-3.5系统数据流图-4-4、 设计原理及方案-4-5、 系统具体实现-6-六、详细设计过程与算法实现-8-七、程序运行结果截图-16-八、 总结-20-九、 参考文献-21-一、 背景与意义 1背景 游戏是全球最大的娱乐经济项目之一,已经被命名为“第九艺术”。而由“游戏”派生出来的职业,除了软件开发外,游戏包装宣传推广、攻略指导、网络游戏管理员和职业游戏玩家等,已成为了一系列专门的岗位。面对游戏产业如此巨大的市场空间,国内各大城市纷纷加大了这方面的人才培养,中国的游戏人才培训已随着游戏行业的总体发展开始逐步迈入了正轨。 虽然说中国的游戏行业开始逐步的迈入了正轨,但是现今,游戏人才出现严重的瓶颈时期,高校的扩招、金融危机的侵袭直接影响着我们最关心的就业问题,但是另一方面游戏人才的缺乏又直接制约着行业的发展,这就更加严格了对社会培训机构的稳定性和正规性的要求。在我国,游戏人才培养体系还未健全,部分开设了相关专业的高校,游由于理论和实践的脱离无法完全满足网游公司对人才的需求。 所以,就中国目前的市场分析来看,加强游戏产业必须在多渠道人才培养体系上加快突破,尽快建立起多渠道人才培养体系,来满足社会对游戏人才的需求。 坦克大战(BattleCity)是1985年日本南梦宫Namco游戏公司在任天堂FC(FamilyComputer)平台上,推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题。大部分80后的青年人曾经都玩过这款FC平台上的经典游戏,FC平台上的坦克大战只能两个人协同作战。本系统运用Java这个跨平台的编程语言,在PC上重新实现这一款经典游戏,探究曾经这一款经典游戏的大概设计与实现,并且加入坦克八个方向的行走,多人的局域网对战模式,使游戏的玩法更丰富。2 课程设计内容坦克大战游戏是一种动作电子游戏的名称。坦克大战游戏是一种动作电子游戏的名称。玩家操作一辆己方坦克,消灭屏幕中不断出现敌方坦克。己方坦克有血量限制,被敌方坦克的炮弹击中会减少血量,当血量为0时,任务失败。(1)基本的游戏操作用户可以通过键盘来操作自己的坦克,尽量不让敌方坦克的炮弹击中自己(2)计分,记时功能用户在游戏的过程中,系统将记录游戏的成绩二、坦克大战小游戏应用程序 2.1 坦克大战小游戏应用程序概述此程序设计是一个小游戏(坦克大战)的实现,主要运用了用户图形界面,程序接口和基本函数绘制来实现,事件监听(包括鼠标事件,键盘事件,响应时间)也是这个程序的特色。总之,本游戏在用户界面的可操作性、游戏的美观度、计分计时存储结果方便都基本完善,有一定的可玩性。 2.1.1 坦克大战小游戏系统任务及目的此小程序是为群众闲暇消遣之用,玩家在进入游戏后按游戏规则击毁敌方坦克获得相应的分数,进入下一关,直到全部过关。 2.2 主要特色系统介绍 玩家在使用此程序时更加能体验到乐趣。当玩家死亡以后,可以原地复活是本游戏的特色,可以激发玩家的游戏兴趣。 2.3小结 虽然游戏在功能和界面上不能算的上很棒,但是麻雀虽小,五脏俱全,游戏具备了坦克大战这个经典游戏锁应该具有的基本雏形。通过这一章,我们对这个游戏应该有了比较宏观的了解,我们将在这一基础上探究游戏更完美的改变。三 坦克大战小游戏系统的设计这一章是坦克大战游戏系统的设计,从系统需求分析开始,介绍开发环境和用到的开发工具,系统主要的功能设计,系统的数据流程图。3.1 系统需求分析坦克大战的设计目标为:(1)实现坦克大战游戏功能,用键盘控制坦克(2)实现游戏难度和游戏模型的选择,通过本关后可以选择进入下一关。(3)加强游戏可玩性。3.2 系统开发及运行环境硬件平台:CPU:INTEL-I5。 内存:1024MB以上。软件平台:操作系统:Windows XP。 数据库:TXT文档。开发工具包:JDK Version1.6.2。最佳分辨率:800 X 6003.3 系统主要功能要求本系统为了实现游戏坦克大战。主要实现如下功能: 系统界面美观大方舒适; 实现游戏一些基础信息的保存和读取; 画面流畅,具有可玩性 没有较大的游戏BUG; 显示游戏者的游戏时间和积分; 系统最大限度地实现了易维护性和易操作性; 系统运行稳定、安全可靠; 玩家死亡以后如不想从新开始可以继续游戏。3.4 坦克大战系统总体结构坦克大战游戏是基于基本的软件和普通硬件基础上的传统优秀游戏,一个游戏应该包括以下几大功能,如图: 游戏开始 图(1) 总体结构3.5 系统数据流图游戏信息的流向,即系统数据流图如图2.3所示 图(2) 系统数据流图四、设计原理及方案 本系统的坦克大战是基于Java语言设计开发的,具有高超的人工智能,精美的图形处理,支持单机运行和网络对战的坦克射击游戏。比之前网络上实现的游戏更加方便,快捷,智能。游戏基本玩法较简单,游戏可一人电脑作战,每次电脑方有坦克10辆,游戏以消灭全部敌方坦克过关为目的。在这过程中,坦克有机会得到血块来添加生命值,从而变得更加强大,也能利用各种有利地形来阻击敌人。游戏设置了墙面,电脑方坦克不能穿越墙面射击玩家坦克,而玩家坦克可随意穿越墙面打击电脑方坦克,这一游戏特权。还有给玩家坦克设置超级炮弹,当电脑方坦克数量过多时,玩家坦克可以发射超级炮弹打击敌方。 主要新增的功能简单罗列如下:4.1屏幕左上方显示游戏状态,当玩家方坦克数全为零时则游戏结束;4.2一般坦克只可在空地中或草丛中行走,不可通过墙面等障碍物;4.3游戏中打坏敌方坦克后,可能会在随机位置随机出现血块奖励,坦克经过该位置可获得相应加生命值奖励;4.4玩家坦克的游戏资格和电脑坦克不同。 4.5工作流程图:程序开始连接服务器连接成功?YN新线程刷屏(间接调用paint)延迟25ms初始化游戏元素根据游戏元素的属性,对其经行操作和绘出其图形Paint方法战斗结束?Y键盘监听器判断按下的是那个键改变相应游戏元素的属性 图(3) 工作流程图五、系统具体实现界面是系统和玩家之间最直接的交互界面,界面的友好性体现了程序设计的质量,界面是否便捷易懂也是程序所基本的要求。5.1界面设计5.1.1 用户登录界面图 图(4) 用户登录界面图5.1.2 游戏主界面图(5) 进入游戏后的界面5.2程序设计及调试运行 编写12个CLASS文件,装入一个包中,各个模块的程序代码都完成后,进行编译连接运行,经过反复调试,找出错误和不足,以达到游戏所需的基本功能和基本界面。这个过程比较繁琐,我们参考网络上现有的资源,并加以改进,对各个模块仔细分析备注并进行调试,做到程序简洁易懂,可读性好。尽量避免因代码不完善而导致的游戏运行中可能出现的错误。5.2.1自动计血量 游戏的自动计血量功能是非常有必要的,可以让玩家很直观地看到自己所玩的剩余血量。下面是自动计血量功能的部分关键代码: private class BloodBar public void draw(Graphics g) Color c = g.getColor(); g.setColor(Color.RED); g.drawRect(x, y-10, WIDTH, 10); int w = WIDTH * life/100; g.fillRect(x, y-10, w, 10); g.setColor(c); 5.2.2对坦克方向的控制 通过上下左右四个键,可以控制坦克向八个方向灵活的移动void localDirection() if(bL & !bU & !bR & !bD) dir = Direction.L; else if(bL & bU & !bR & !bD) dir = Direction.LU; else if(bL & !bU & !bR & bD) dir = Direction.LD; else if(!bL & bU & !bR & !bD) dir = Direction.U; else if(!bL & !bU & !bR & bD) dir = Direction.D; else if(!bL & !bU & bR & bD) dir = Direction.RD; else if(!bL & bU & bR & !bD) dir = Direction.RU; else if(!bL & !bU & bR & !bD) dir = Direction.R; else dir = Direction.STOP; 六、详细设计过程与算法实现6.1游戏主窗口游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道,并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据的输入、输出。在程序中须创建一个类TankClient,继承自Frame来创建一个窗口。6.2游戏数据的输入 游戏中坦克需要能往上、下、左、右四个方向运动,故须设立4个按键,使其能作坦克,另须设一个键控制坦克开火。为方便操作,本游戏设置WSAD分别表示上下左右,小键盘数字键4,表示开火。 具体实现为,为窗口添加KeyListener(键盘监听器),监听键盘的按下和抬起。在TankClient类中添加内部的适配器类,由于不需要其它类访问,将其设计为private的,以保证面向对象设计的封装性。代码如下:/* * 移动按键键盘监听器 */private class MoveKeyL extends KeyAdapter public void keyPressed(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_A:myTank.keyDownToDir(Direction.L);break;case KeyEvent.VK_W:myTank.keyDownToDir(Direction.U);break;case KeyEvent.VK_D:myTank.keyDownToDir(Direction.R);break;case KeyEvent.VK_S:myTank.keyDownToDir(Direction.D);break;public void keyReleased(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_A:myTank.keyUpToDir(Direction.L);break;case KeyEvent.VK_W:myTank.keyUpToDir(Direction.U);break;case KeyEvent.VK_D:myTank.keyUpToDir(Direction.R);break;case KeyEvent.VK_S:myTank.keyUpToDir(Direction.D);break;/* * 开火按键键盘监听器 */private class FireKeyL extends KeyAdapter public void keyReleased(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_NUMPAD4:myTank.fire();new TankFireMsg().send();break;6.3游戏数据的输出 玩家需要从游戏输出数据中获得游戏信息,如坦克在往上行驶、坦克发了颗子弹、坦克爆炸等,这些均需要通过游戏数据的输出来告知玩家。 由于TankClient继承自Frame,Frame类中的方法paint,可以在窗口中绘制图形,即满足了游戏需要图形界面的需求;另有方法repaint可以刷新窗口,以及时提供游戏信息,故须创建线程,不断地刷新窗口,来获取最新的游戏信息。代码如下:public void paint(Graphice g) for (int i = 0; i allGE.size(); i+) int allGEOldSize = allGE.size();GameElement ge = allGE.get(i);if (ge instanceof Moveable) Moveable moveable = (Moveable) ge;moveable.move();ge.draw(g);/* * 如果容器数量减少,则减少相应的遍历索引i */if (0 allGEOldSize - allGE.size() i -= allGEOldSize - allGE.size();/* * 刷屏线程,负责画面的刷新以及游戏时间的推进 */private class MyTh implements Runnable public void run() while (true) repaint();try Thread.sleep(25); catch (InterruptedException e) e.printStackTrace(); 为使游戏主窗口效率更高、更容易被引用,且游戏主窗口只有一个,故TankClient类使用单例模式来设计:private static final TankClient tc = new TankClient();private TankClient() .public static TankClient getTc() return tc;6.4网络管理 游戏需要对局域网对战的支持,所以需要对网络数据进行管理,使游戏能有条不紊地运行,网络管理部分主要负责输入游戏数据后发往其它游戏客户端,以及接收其它客户端发来的游戏数据。需要发送的游戏数据有:坦克创建消息(TankCreateMsg)、坦克开火消息(TankFireMsg)等6.5客户端游戏数据的收发 由于每个游戏消息都有共同的特性,即发送、接受,故将其抽象出一个父类Msg,所有的消息类都继承自Msg类。public abstract class Msg public static final TankClient tc = TankClient.getTc();public static final int TANK_CREATE_MSG = 1;public static final int TANK_CHANGEDIR_MSG = 2;public static final int TANK_CALIBRATION_MSG = 3;public static final int TANK_FIRE_MSG = 4;public static final int CHAT_WORD_MSG = 5;public static final int TANK_READY_MSG = 6;public static final int GAME_START_MSG = 7;public static final int GAME_OVER_MSG = 8;public static final int GAME_EXIT_MSG = 9;public static final int GAME_CHANGEMASTER_MSG = 10;public abstract void send();public abstract void receive(DataInputStream dis); 在需要向每个游戏客户端发送游戏消息时只需实例化一个相应的对象,在调用send方法即可,接收时调用receive方法。6.6服务器端游戏数据的收发 服务器端的设计,只需将所有接收到的包转发给所有游戏客户端即可。接收:public class UDPThread implements Runnable public void run() byte buf = new byte1024;DatagramSocket ds = null;try ds = new DatagramSocket(ServerMain.SERVER_UDP_PORT); catch (SocketException e) e.printStackTrace();while(true)DatagramPacket dp = new DatagramPacket(buf, buf.length);try ds.receive(dp);ServerMain.sendToEveryone(ds, dp); catch (IOException e) e.printStackTrace();转发:public static void sendToEveryone(DatagramSocket ds, DatagramPacket dp)for (int i = 0; i ServerMain.clients.size(); i+) try Client c = ServerMain.clients.get(i);String IP = c.IP;int port = c.udpPort;dp.setSocketAddress(new InetSocketAddress(IP, port);ds.send(dp); catch (IOException e) e.printStackTrace();6.7封装的游戏元素 将游戏元素(坦克、子弹、墙等)封装成一个一个的类,将大大地降低游戏设计、实现难度,且符合面向对象的设计方法。 由于这些游戏元素都有一些相同的属性、方法,故将其抽象为父类GameElement。public abstract class GameElement /* * 持有游戏主窗口的引用 */public static final TankClient tc = TankClient.getTc();/* * 元素的坐标 */public Rectangle rect;/* * 元素的类型(队伍) */public GameElementKind kind = GameElementKind.DEMON;/* * 由游戏主窗口自动调用,将决定该元素的在游戏中的表现形式 */public abstract void draw(Graphics g);程序中共有如下游戏元素:Blast:爆炸效果Bullet:子弹ChatWord:群聊的内容Tank:坦克Wall:墙七、程序运行结果截图 图(6) 图(7) 图(8) 图(9) 图(10) 图(11)7.1发现的BUG及不足1)由于没有添加操作说明,使玩家不知如何操作,大大地影响了游戏的可操作性。2)在测试环境测试时,出现画面抖动现象,严重地影响了游戏的进行,必须找到原因并改正。7.2解决方法1)在程序启动时告知玩家游戏该如何操作,使玩家能清楚、正确地开始游戏。2)经过反复测试、论证,得知画面抖动现象原因为测试环境JRE安装问题,在重新安装JRE后,游戏画面恢复正常。八、总结该游戏定位在小型局域网休闲游戏,是一款免费、绿色、开源的一款软件。本软件是使用JAVA开发的局域网对战游戏,其不仅实现了基本的功能需求,而且设计灵活、拓展方便、界面生动,多处使用了各种设计模式,是程序的编写效率更高,运行效率更高。由于程序中多数是面向父类或者面向接口的编程,以后如果要更换某些模块、元素的功能,以及添加功能,是非常容易的。现在软件还无收入,但随着玩家的逐渐增多,随时可以利用本软件优良的可拓展性,添加相关内容,从而开始盈利;即便本游戏未得到玩家的喜爱,而需要再次设计游戏或者另行开发新游戏,其内部使用的各个模块、封装的游戏元素,均可以复用,这也是本软件优良的可重用性的体现。九、参考文献
展开阅读全文