学位论文-基于java的坦克网战游戏的设计论文和实现_第1页
学位论文-基于java的坦克网战游戏的设计论文和实现_第2页
学位论文-基于java的坦克网战游戏的设计论文和实现_第3页
学位论文-基于java的坦克网战游戏的设计论文和实现_第4页
学位论文-基于java的坦克网战游戏的设计论文和实现_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四川师范大学成都学院本科毕业设计[1]。关于EclipseEclipse是跨平台的自由与集成的开发环境。起初主要用于Java语言的开发,但目前也有人利用插件将它用作其他计算机语言比如C++和Python的开发工具。Eclipse的原身仅是一个框架平台,但是越来越多插件的支持让Eclipse拥有其他功能相对稳定的IDE软件很难拥有灵活性。所以现在,许多程序员将Eclipse作为框架开发属于自己的IDE。Eclipse最初由OTI及IBM两家公司的IDE产品开发团队共同开发。IBM提供了最初的Eclipse代码基础,包括Platform、JDT和PDE。现在由IBM带领,围绕关于它的项目已发展成了一个庞大的Eclipse联盟,现目前有百余家软件公司和大量程序开发员参与到此项目中,其中包括Borland、RationalSoftware、RedHat及Sybase等。Eclipse是一个开发源码项目,它其实是VisualAgeforJava的替代品,其界面与以前的VisualAgeforJava差不多,但因为其开源,每个人都可以免费获取,以便程序开发人员在此源码的基础上进行创意修改开发出自己需要的产品,所以越来越多的开发公司和团队选择它。最近包括Oracle等许多大型程序开发公司相继研究该项目,经过一段时间的开发研究,他们一致认为Eclipse将来会形成可以进行多种语言开发的IDE集合体,使用者只需下载各种语言的插件即可。

系统分析可行性分析本款游戏的设计和开发是在C++语言开发的传统坦克游戏基础上进行改编,要实现它的相应基本功能。分析研究传统坦克游戏得知,本款游戏要实现的功能主要主窗口的实现以及相应功能按键的功能实现,画出坦克,可以控制键盘让坦克移动,可以发射子弹,坦克被子弹击中消失并产生爆炸效果,防止坦克重叠运动等。研究课题设计要求得知,需要实现局域网联网功能。在选择开发语言的时候,需要考虑到开发目标。然而本次设计的目的完全可以由Java语言来实现。因为Java语言具有面向对象的特性,可以很好的将游戏中各个元素进行封装管理,降低开发难度。游戏运行过程不是单一过程,是多态同时进行,然而Java具有多线程的特性,这样恰恰满足了开发的需要,所以选择Java语言进行开发是不二的选择。在玩家进行娱乐的时候,美观的界面是必不可少的,为了增强观赏性,可能在设计过程中需要从外部载入图片。玩家坦克可以通过监听玩家键盘响应事件控制。对于敌方坦克,在设计游戏过程中要考虑到不能同时出现太多,还能让敌方坦克自主进行移动和向目标开火。以此同时,因为敌方坦克是自主随机移动,需要考虑到坦克与坦克之间不能相互重叠和穿越,也不能同时做同意动作。那么利用Java语言的多线程能保证坦克有序运行。与传统单机坦克游戏不同,本款游戏需要实现局域网通信。然而通Java语言中有套接字Socket实现通信功能。综合以上分析可以得出,利用Java语言的各种优越特性能够实现本次设计的总体要求,也能实现相应功能。游戏规则和系统功能介绍在本款游戏中,玩家坦克受玩家键盘向东南西北方向移动,并由玩家控制开火键对目标进行打击,玩家双方坦克免受对方火力攻击。敌方坦克随机运动,并发射子弹。游戏中,坦克和子弹能够击毁普通砖墙,但不能击穿钢墙,坦克能够穿越草丛不能穿越河流,子弹能够穿越河流和草丛。游戏过程中,玩家除了保证自己免受伤害同时也要保障基地安全,玩家消灭敌方闪烁坦克可以获得额外辅助道具,两玩家在游戏过程中可以聊天,也可以请求暂停。每个关卡设置二十个敌方坦克,当坦克完全被消灭后,进入下一关卡,当玩家基地被毁或双方玩家生命耗尽,游戏结束,玩家可以选择重玩,但需要双方做出一致选择。

总体设计程序运行流程本游戏程序运行需要玩家双方在局域网内建立通信,也可在同一电脑上建立通信,但只能操作一个玩家。具体运行流程如图3.1-1所示:开始开始服务器建立主机建立成功客服端连接主机运行服务器运行客服端连接成功游戏结束载入游戏结束重玩游戏否是否是是否图3.1-1程序运行流程如图总体构架本游戏在设计过程中,为了降低设计难度,将整个程序按模块进行单独编写,包括主类、通信类、坦克类、子弹类、墙类、辅助类、服务器类、客服端类、敌人坦克类、关卡类以及时钟类。各个类和实现的功能表如表3.2-1所示:表3.2-1各个类和实现的功能表类实现功能主类实现游戏窗口的显示提供公共接口通信类实现玩家间建立游戏使玩家间可以进行信息交流坦克类添加坦克图片控制坦克移动让坦克可以发出子弹让玩家坦克死亡后重置使坦克不能穿墙和其他坦克使坦克可以穿草丛不能穿河子弹类画出子弹控制子弹让普通子弹可以击毁普通砖墙不能击毁钢墙让子弹可以穿越草丛和河流墙类添加砖墙图片添加钢墙图片添加草丛图片添加河流图片显示图片辅助类添加辅助图片敌方闪烁坦克阵亡后随机显示辅助图片玩家获得辅助图片后得到相应辅助功能服务器类建立主机控制游戏进程客服端类输入主机IP连接主机控制游戏进程关卡类添加墙类图片并进行排版编辑显示添加图片时钟类刷新线程对玩家事件进行监听控制游戏运行与休眠程序模块本游戏程序由多个模块同时运行而实现,也体现了Java语言的优越性。通过各个模块的相互调用,它能完成游戏显示,通信建立,控制进程等一系列操作,使游戏规范化,易于操作。主体模块主体模块首先构建接口,因为Java不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口的声明和接口体。其次是画出游戏面板和游戏窗口的显示,在游戏窗口中添加了几个功能按键,主要进行联机操作,游戏进程操作等。游戏过程中,游戏版面显示当前关卡数,敌人剩余数,玩家生命数以及玩家获得的分数。通信模块通信模块通过Java语言中套接字Socket编写通信类,针对游戏中客户端和服务器的联机功能的实现,它的通信过程是基于TCP/IP协议中传输层接口socket实现。通过通信模块玩家可以进行信息传递以便协同作战,为本游戏添加乐趣。坦克模块坦克模块部分主要由玩家坦克和敌人坦克组成,敌方坦克随机出现,并随机移动,玩家通过键盘操作来控制坦克的移动和对敌方坦克进行攻击。玩家坦克可以对敌方闪烁坦克进行攻击,并得到额外辅助道具,获得道具后玩家坦克具备相应功能。敌方坦克由游戏窗口上方按照左中右依次出现,敌方在移动过程中随机发出子弹,如遇见障碍则随机改变运动方向。玩家在第一关卡时,最多同时出现三辆敌方坦克,随着游戏的进行敌方坦克数量随之增加且敌方坦克运动速度加快,和经典单机坦克游戏十分相似,将玩家带入童年回忆。子弹模块在该模块中,初始玩家一次只能发射一颗子弹,且只对敌方坦克和普通砖墙有效,当子弹消失后才能接着发射。子弹击毁时出现爆炸效果,玩家子弹和敌方坦克发出的子弹可以撞毁,敌方坦克向四个方向随机移动并发射子弹。游戏工程中玩家获得相应辅助道具后,子弹速度加快且可以进行连续射击。墙模块墙模块是由四个类共同组成,包括砖墙、钢墙、草丛和河流。通过这四个类的组合,编辑成游戏地图。游戏地图中,玩家基地周围是由砖墙包围,在墙模块中,砖墙是最基本的组成,玩家或敌方坦克都能将其摧毁,钢墙只有玩家获得特殊辅助后才能摧毁,玩家和敌方发出的子弹都能穿越草丛和河流。关卡模块为了增加游戏的趣味性,游戏中设计了九个循环关卡。在游戏过程中,玩家双方各有3条生命,当玩家双方均把生命耗尽时,通关失败,只有双方选择重玩时才重新开始游戏。在关卡进行时,任一玩家可以选择暂停游戏,在每个关卡中设置了玩家基地,当玩家基地被毁,则通关失败。每个关卡设计20辆敌方坦克,当敌方坦克均被消灭,游戏自动进入下一关卡。游戏玩家具体游戏流程如图4.6-1所示:载入游戏载入游戏开始失败重玩结束进入下一关是否否是图4.6-1玩家游戏流程图程序实现游戏窗口界面设计游戏窗口使用Frame类,Frame类是Container类的间接子类。当需要一个窗口时,可使用Frame或其子类创建一个对象。窗口也是一个容器,可以向窗口添加组件。该游戏界面包括文本输入框和按钮,因为服务器端和客户端窗口相似,以下提供客服端游戏窗口设计代码:publicclassServerViewextendsJFrame{ publicdrawingPanelmainPanel; publicJButtoncreateServer,exit,pauseAndResume,help,hiddenButton; publicJTextFieldmessageField; publicJButtonsendMessage; publicServerControlercontroler; publicServerModelmodel; publicServerView(){ super("基于Java的坦克网战游戏"); try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(Exceptione){} getContentPane().setLayout(null); mainPanel=newdrawingPanel(); mainPanel.setLayout(null); mainPanel.setBounds(0,22,679,605); mainPanel.setBackground(newColor(128,64,128)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(150,130,640,590); setVisible(true); setResizable(false); model=newServerModel(this); controler=newServerControler(this,model); /* *添加按键和文本框并实现相应功能 */messageField=newJTextField(); messageField.setBounds(0,519,560,22); messageField.setEnabled(false); sendMessage=newJButton("发送"); sendMessage.setBounds(570,518,62,24); sendMessage.setFocusable(false); mainPanel.add(messageField); mainPanel.add(sendMessage); getContentPane().add(mainPanel); mainPanel.setFocusable(true); createServer=newJButton("建立主机"); createServer.setBounds(0,0,120,22); getContentPane().add(createServer); createServer.setFocusable(false); pauseAndResume=newJButton("暂停/继续"); pauseAndResume.setBounds(120,0,120,22); getContentPane().add(pauseAndResume); pauseAndResume.setFocusable(false); help=newJButton("帮助"); help.setBounds(240,0,120,22); getContentPane().add(help); help.setFocusable(false); exit=newJButton("退出"); exit.setBounds(360,0,120,22); getContentPane().add(exit); exit.setFocusable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(150,130,640,590); setVisible(true); setResizable(false); model=newServerModel(this); controler=newServerControler(this,model); } publicstaticvoidmain(String[]args){ newServerView(); }}游戏运行界面使用JPanel创建一个面板,再向这个面板添加组件。主要分为游戏界面和玩家信息界面,如图5.1-1所示:游戏按键和文本框区域游戏按键和文本框区域玩家得分玩家生命游戏界面游戏进度聊天信息编写区域图5.1-1游戏运行界面图游戏界面显示游戏实时画面,玩家信息界面主要显示玩家生命值,玩家得分情况,关卡进读,和剩余敌方坦克数量。部分代码如下:publicclassdrawingPanelextendsJPanel{ publicImageoffScreenImage; publicString[]messageQueue; publicActor[]drawingList; publicbooleangameStarted; publicintgreen,red,blue; publicintP1Life,P2Life,P1Score,P2Score,EnemyLeft,LevelIndex; publicImageP1Image,P2Image;游戏控制这款游戏设计过程中,主要使用键盘进行操作,为了让玩家对坦克进行有效操作,游戏程序窗口添加KeyListener(键盘监听器)。事件源描述事件对象中事件的性质。玩家的每个操作将产生一个事件源对应一个或多个事件监听器,当发生事件就将调用相关事件监听器。此后事件源便将该事件对象发送给相应监听器接口类的方法,监听器接口则会接收到相应的事件信息。此时监听器开始分析事件对象并找出事件内容,然后作出相应反应。在java.awt.event包中定义的接口可以用来创建监听器。只有在事件发生时,监视器定义的方法才会被事件源所调用。有兴趣接收事件的任何监听器类都必须实现监听器接口。代码如下:/* *移动按键键盘监听器 */temp.addKeyListener(newKeyAdapter(){ publicvoidkeyPressed(KeyEvente){ if(model.P1!=null){ if(e.getKeyCode()==KeyEvent.VK_UP){ model.P1.moveUp=true; model.P1.moveDown=false; model.P1.moveLeft=false; model.P1.moveRight=false; } if(e.getKeyCode()==KeyEvent.VK_DOWN){ model.P1.moveDown=true; model.P1.moveUp=false; model.P1.moveLeft=false; model.P1.moveRight=false; } if(e.getKeyCode()==KeyEvent.VK_LEFT){ model.P1.moveLeft=true; model.P1.moveUp=false; model.P1.moveDown=false; model.P1.moveRight=false; } if(e.getKeyCode()==KeyEvent.VK_RIGHT){ model.P1.moveLeft=false; model.P1.moveUp=false; model.P1.moveDown=false; model.P1.moveRight=true; }游戏网络通信在JAVA语言中,利用TCP通信,通常有一个明确的服务器端(Server端),一个或多个客户端(Client端)。分别使用ServerSocket类建立一个服务器端标识,负责监听客户端的连接请求。使用Socket类建立服务器端与客户端一对通信实体标识。套接字通常由三个部分构成:在计算机进程之间利用TCP/IP进行通信时,需要通过IP地址来定位通信双方的计算机,通过TCP/UDP来明确通信软件所采用的通信协议,通过端口号来确定通信软件进程。所以,通信协议、网络地址和端口号三个部分组合在一起可确定通信实体,表达方法为: SOCKET=(TCP/UDP,IPAddress,Port)本游戏程序通过套接字实现了服务器端主机建立后响应客户端的连接请求,在游戏进行时,获得对方玩家实时画面,任意一方暂停或继续游戏,以及联机成功后玩家双方的信息传递等功能,具体代码如下:/**服务器建立主机*/ publicvoidcreateServer(){ addMessage("正在建立主机(端口4321)"); try{ serverSocket=newServerSocket(4321); serverCreated=true;}catch(Exceptione){ addMessage("无法建立主机,请确认端口4321没有被别的程序使用"); System.out.println(e); t.stop(); return;}/**客户端连接主机*/ publicvoidconnectServer(){ addMessage("正在连接主机"); try{ serverIP=view.IPfield.getText(); InetAddressaddr=InetAddress.getByName(serverIP); clientSocket=newSocket(addr,4321); serverConnected=true; addMessage("已成功连接到主机,开始载入游戏");以上就是游戏中玩家建立主机和连接主机的实现过程。在本款游戏中,玩家建立通信后还可以进行信息共享和消息传递功能。代码如下:if(perInstruction.substring(0,1).equals("m")){ gameModel.addMessage("主机端玩家说:"+perInstruction.substring(1,perInstruction.length())); }以上是玩家游戏过程中聊天通信实现的部分代码。if(perInstruction.substring(0,1).equals("x")){ inttemp=Integer.parseInt(perInstruction.substring(1,2)); if(temp==0){ if(gameModel.gamePaused){ gameModel.addMessage("主机端玩家取消了暂停"); gameModel.gamePaused=false; } }else{ if(!gameModel.gamePaused){ gameModel.addMessage("主机端玩家暂停了游戏"); gameModel.gamePaused=true; }以上是玩家在游戏过程中对游戏进程的信息共享功能部分代码。游戏元素本款游戏在设计时避免了图形绘制的麻烦,更多的采用了直接引入外部图片来作为游戏中的元素,如坦克和游戏墙。这大大的减少了游戏设计时的繁琐更多的节省时间。坦克在游戏设计过程中,游戏中坦克采用载入已经排好顺序的外部图片的方式来实现,如图5.4.1-1所示:图5.4.1-1在实现坦克向四个方向移动时,采用的是朝向不同的四张图片。在游戏过程中,玩家坦克如果获得辅助道具,坦克将具备辅助功能,如穿墙和连发子弹等。游戏开始时,玩家坦克有免疫攻击时间,玩家坦克朝上,只具备初级攻击力,通过以下代码实现:direction=UP; status=1; health=1; numberOfBullet=1; InvulnerableTime=150; if(type.equals("1P")){ xPos=198; yPos=498; border=newRectangle(xPos-size,yPos-size,25,25); xVPos=xPos;yVPos=yPos; for(inti=0;i<4;i++) textures[i]=gameModel.textures[54+i]; }else{ xPos=323; yPos=498; border=newRectangle(xPos-size,yPos-size,25,25); xVPos=xPos;yVPos=yPos; for(inti=0;i<4;i++) textures[i]=gameModel.textures[72+i]; } }在游戏过程中,玩家获得相应辅助后会有战力提升,根据坦克攻击力大小,载入不同的坦克图片,提升画面效果,部分代码如下:inttextureIndex=0; if(type.equals("1P")){ if(status==1) textureIndex=54+direction; elseif(status==2) textureIndex=58+direction; elseif(status==3) textureIndex=62+direction; else textureIndex=66+direction; }else{ if(status==1) textureIndex=72+direction; elseif(status==2) textureIndex=76+direction; elseif(status==3) textureIndex=80+direction; else textureIndex=84+direction; }游戏中敌方坦克有不同类型,在游戏过程中,敌方坦克将由左中右三个方向同时出现,在移动过程中会发射子弹,当遇见阻挡时会随机改变运动方向,其部分代码如下:interval=(int)(Math.random()*200); direction=(int)(Math.random()*4); numberOfBullet=1; xVPos=xPos; yVPos=yPos; border=newRectangle(xPos-size,yPos-size,25,25);以上是敌方坦克的共同属性,不同坦克具备不同特性,如运动速度、抗击子弹能力、消灭后会产生辅助道具等,代码如下:if(type==1){ firePosibility=0.95; speed=2; textures=newImage[8]; for(inti=0;i<8;i++) textures[i]=gameModel.textures[38+i]; }elseif(type==2){ firePosibility=0.95; speed=4; textures=newImage[8]; for(inti=0;i<8;i++) textures[i]=gameModel.textures[2+i]; }elseif(type==3){ firePosibility=0.9; speed=2; textures=newImage[8]; for(inti=0;i<8;i++) textures[i]=gameModel.textures[10+i]; }else{ firePosibility=0.95; health=3; speed=2; textures=newImage[20]; for(inti=0;i<20;i++) textures[i]=gameModel.textures[18+i]; }游戏墙游戏墙和坦克设计如出一辙,主要是通过引入外部编序图片实现。游戏墙由四个类实现,分别是wall.java、steelwall.java、river.java和grass.java。其中前三者是直接载入图片,grass.java则是采用Java语言的绘图功能实现。游戏中每个关卡设置由游戏墙模块编辑而成,不同的墙具有不同的性质,如图5.4.2-1所示:图5.4.2游戏中子弹和爆炸效果在本款游戏设计过程中,游戏中子弹和爆炸效果均是采用Java语言中publicvoiddraw(Graphicsg)画出。子弹在发射过后,实现判断是否击毁,击毁则产生爆炸效果。部分代码如下:/**画出子弹*/ publicvoiddraw(Graphicsg){ g.setColor(Color.lightGray); if(direction==0||direction==1) g.fillRect(border.x+1,border.y+1,3,9); if(direction==2||direction==3) g.fillRect(border.x+1,border.y+1,9,3); }/**画出爆炸效果*/ publicvoiddraw(Graphicsg){ g.setColor(Color.red); g.fillOval(xPos-outer,yPos-outer,2*outer,2*outer); g.setColor(Color.orange); g.fillOval(xPos-middle,yPos-middle,2*middle,2*middle); g.setColor(Color.yellow); g.fillOval(xPos-inner,yPos-inner,2*inner,2*inner); }/**检测子弹是否与边界发生碰撞*/ if(!ersects(map)){ gameModel.removeActor(this); notifiyOwner(); makeBomb(); writeToOutputLine(); return; }游戏整体实现效果本游戏设计的实现由32个类组成,一共编写4000余行代码,外部引用89张图片。为了降低游戏设计、实现难度,把游戏元素:坦克、子弹、墙等封装成单独的类。在游戏设计时考虑到新玩家不熟悉操作规则,特此在游戏窗口添加帮助按钮,玩家单击帮助按钮则对游戏规则进行显示说明。游戏窗口设置暂停/停止按钮来控制程序进程。运行程序时,玩家输入对方玩家IP地址即可实现联机,联机成功后程序自动导入游戏,玩家通过键盘方向键控制坦克移动,S键实现开火。程序运行时,玩家可以

温馨提示

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

评论

0/150

提交评论