虚拟分组课程设计报告_第1页
虚拟分组课程设计报告_第2页
虚拟分组课程设计报告_第3页
虚拟分组课程设计报告_第4页
虚拟分组课程设计报告_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、学号2013-2014学年 第二学期软件开发课程设计报告题 目:虚拟分组坦克程序设计专 业:计算机科学与技术班 级:10(2)姓 名:院 系:计算机与信息工程系指导教师:成 绩:2014年 6 月 8日目录1 开发技术概述12 相关技术理论13 系统分析13.1 系统可行性分析13.1.1 技术可行性13.1.2 操作可行性13.2 功能分析23.2.1 TankClient类基本功能分析23.2.2 Tank类基本功能分析34系统实现.44.1 游戏主窗体实现44.2 分组游戏的实现54.2.1 分组54.2.2 获取敌人64.2.3 消灭敌人74.2.4 显示敌人的距离85 功能测试86

2、总结10致 谢10参考文献10源代码111 开发技术概述Java 语言是一种跨平台,适合于分布式计算环境的面向对象编程语言。JAVA现在主要用在WEB开发,手机游戏及一些平台游戏的开发,因为它具有很好的跨平台性,在手机等各种电子产品上应用非常广泛。C语言是一种面向过程编程,这就使得Java具有重用的特性,在开发速度上比C语言更快,但是在运行速度上却是C更快,因为C属于底层语言,它比JAVA更加亲近机器,所以在许多系统开发上一般是用C语言,比如我们常用的XP系统、LINUX系统,都是C语言开发的。跨平台的服务器端的嵌入式脚本语言。C+多用于游戏引擎、反病毒、硬件驱动以及一些对运行效率要求比较高的

3、应用程序,比如数据库管理系统。 C+语言在提供强大的功能的同时也提高了程序含BUG的可能性。 C+为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性。2 相关技术理论 系统运行环境(1)网络服务器操作系统:Windows XP;(2)开发工具:eclipse3.2;(3)运行环境:J2SDK 1.5;(4)编程语言:Java语言;3 系统分析3.1 系统可行性分析3.1.1 技术可行性Java语言自Sun公司于1995年5月正式发布以来,经历了出生、成长、成熟壮大的几个阶段,逐渐发展成为IT领域里的主流计算模式,使用Java开发工具方便,容

4、易实现。Java对开发网络产品有它自己独特的优势,网络游戏也是其开发产物之一。本系统开发过程是利用Java编程语言和eclipse集成开发环境配合使用来实现的,它是基于TCP/UDP协议和Socket编程技术,建立以C/S为结构模式的娱乐性游戏平台。3.1.2 操作可行性本设计是一个虚拟的游戏平台,只是模拟了现在社会上的一些多机游戏的部分功能,所以操作简易,玩家不需要了解内部流程,只是和一般其他的游戏一样的操作即可开始游戏。相对于开发者而言,整个系统形成主要由JDK5.0虚拟环境和eclipse3.2共同完成,无需更多复杂的工具和服务器支持。3.2 功能分析3.2.1 TankClient类基

5、本功能分析TankClient类是整个系统的核心部分,它承担整个系统的所有可实现功能的调度工作。 是整个游戏运行的场所。TankClient类设计流程图如图3.2所示:开始初始化坦克对战双方玩家坦克由键盘控制移动发射炮弹碰撞检测(坦克和子弹)不处理同角色坦克产生爆炸不同角 色坦克判断胜负结束TankClient类是主类,通过调用其他类中封装的方法来使整个系统运行起来,下面显示TankClient与各个类之间的关系如图3.3所示:TankClient类(主类)Tank类(我方)Tank类(敌方)New参数1New参数2调用Missile类打中调用Explode类产程爆炸判断胜负键盘控制移动键盘控

6、制移动打击图3.3 游戏系统类关联图3.2.2 Tank类基本功能分析Tank(坦克)类中,封装了一些变量属性,包括坦克自己的大小(WIDTH,HRIGHT),运动速度(SPRRD_X:在x轴方向的速度;SPEED_Y:在Y轴方向的速度)、生命值控制(life)、坦克编号(id)、坦克名(name)、方向控制(dir)、生死控制(live)、好坏控制(good)的变量等。Tank类中没有main函数,不是主类,它当中只封装一些变量属性和静态方法,被TankClient类调用来实现坦克的一系列动作。Tank类中的主要方法罗列如下:(1)getRect()方法public Rectangle ge

7、tRect() return new Rectangle(x, y, this.WIDTH, this.HEIGHT);Rectangle类是碰撞检测的辅助类,通过得到子弹的x,y坐标和宽高度,检测两个矩形是否碰撞(相交);(2)draw()方法:负责将所有的活动在屏幕上画出来;(3)move()方法:主要负责控制坦克的移动,包括8个方向(左,左上,上,右上,右,右下,下,左下)的控制以及给坦克一个移动的速度;(4)keyPressed()方法:设定使用键盘的“”“”“”“”键控制坦克移动;(5)keyReleased()方法:处理按键抬起事件,抬起“CTRL”键时,发射炮弹并加入新炮弹,能够

8、逐一发射每一发炮弹、抬起“A”键可以发射超级炮弹等功能;(6)locationDirection()方法:定义了炮筒方向,可以向八个方向发射炮弹;(7)fire()方法:处理发送子弹的方法;(8)bumpWithWall()方法:主要负责处理坦克撞墙事件;(9)bumpWithTank()方法:主要到负责处理坦克和坦克相撞事件;4 系统实现4.1 游戏主窗体实现TankClient类负责画出游戏主窗体,它是整个游戏运行和所有活动的场所。登陆主窗口后,主界面上包括两个下拉菜单条,“游戏”和“帮助”。 TankClient类是整个系统的“大管家”,当要执行某动作时,“大管家”只需要调用各个类中封装

9、好的方法,让被调用的类自己去执行它自己的方法,这更体现了面向对象的思想。游戏主窗体界面如图4.1所示:图4.1 游戏主窗口预览效果图实现虚拟屏幕消除闪烁的关键代码如下:public void update(Graphics g) /利用双缓冲消除闪烁的效果if(offScreenImage = null) offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);Graphics gOffScreen = offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOff

10、Screen.setColor(Color.BLACK);gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);gOffScreen.setColor(c);paint(gOffScreen);g.drawImage(offScreenImage,0,0,null);4.2 分组游戏的实现RoboCode的混战模式中,如何更好的掌握多个对手的情况,从而采取更好的策略,成为每一个玩家迫切需要解决的问题。4.2.1 分组游戏运行主界面,通过键盘控制坦克运动,相互对战,其效果图如图4.2所示:图4.2 代码如下:    &

11、#160; package mytest;     import robocode.*;     public class Track             public String Name; /敌人坦克的名称          public double Heading;      

12、;         /敌人的绝对角度,通过计算得出 public double Bearing; /敌人坦克相对于你车头方向的相对角度         public double Distance;/敌人坦克的距离         public double Energy; /能量         publi

13、c double Velocity; /速率         public double FaceHeading;/敌人坦克面向的方向         public double trackX,trackY;/敌人坦克的坐标         public double nextTrackX,nextTrackY; /下一个标准时间中敌人坦克所在的位置    

14、     public void update(ScannedRobotEvent e)         Name=e.getName();/敌人坦克的名称             Bearing=e.getBearing();/敌人坦克相对于你车头方向的相对角度          

15、60;  Distance=e.getDistance(); /敌人坦克的距离             Energy=e.getEnergy(); /能量             Velocity=e.getVelocity();/速率            

16、 FaceHeading=e.getHeading(); /敌人坦克面向的方向                 下一步就是如何把已经现身在雷达中的敌人抓到一个vector里去了,让我们回到我们的机器人主体中去:派生自AdvancedRobot 类的MyVector类中。     首先,声明一个vector类型,并在run中进行初始化。     public class MyVector extends Ad

17、vancedRobot     final double version=0.1;         private Vector trackVector;/声明我们的向量数组         /*         * run: MyVector's default behavior      

18、0;  */         public void run()         out.println("myVector Version is "+version);         trackVector=new Vector(); /初始化我们的向量数组         while

19、(true)             / Replace the next 4 lines with any behavior you would like             showTrack();             setTurnRadarRight(3

20、60);/让雷达不停转             execute();             4.2.2 获取敌人        只要雷达工作正常,我们就能获取每一个敌人的信息了。当敌人的信息源源不断地涌入我们的onScannedRobot中,我们的机器人要像一个优秀的指挥官一样去鉴别情报,哪些是已经有的,哪些是没有的。让我们去

21、 onScannedRobot事件里看一下吧。     * onScannedRobot: What to do when you see another robot     */     public void onScannedRobot(ScannedRobotEvent e)         if(!isInVector(e)         

22、60;      Track myTrack=new Track();                 myTrack.update(e);                 trackVector.add(myTrack);   

23、                  我的myVector机器人是靠自定义方法isInVector来判断该机器人是否存在于向量数组中的,如果 isInVector返回值为false,则初始化一个Track对象,调用它的update方法来初始化敌人的信息,然后调用Vector类型的add 方法,将该对象加入到向量数组中。   好了,让我们去isInVector里边看看吧。     /*  &

24、#160;  * isInVector:自定义方法,判断该机器人是否已存在于队列中     */     public boolean isInVector(ScannedRobotEvent e)     int i=0;         while(i)            Track myTrack=(Track)tra

25、ckVector.get(i);             if(myTrack.Name=e.getName()                myTrack.update(e);               

26、  return true;                         i+;                return false;         isInV

27、ector方法的基本思路是,通过传进来的ScannedRobotEvent中的getName来和vector中已经存在的对象的 Name来进行比较的。 4.2.3 消灭敌人    要消灭敌人,很简单,我们只需要在 onRobotDeath事件中调用Vector类型的remove方法。Remove方法是用来删除指定位置上的对象的。下面代码的基本思路和 isInVector是一样的。显示如下:        public void onRobotDeath(RobotDeathEvent event) 

28、60;   int i=0;         while(i)         Track myTrack=(Track)trackVector.get(i);             if(myTrack.Name=event.getName()       

29、0;     i+;             4.2.4 显示敌人的距离        我在run的while中调用了下面的函数,用来显示当前的时间、敌人的数量及每个敌人与我们的距离。对数量的计算用到了Vector 的size方法。        public void showTrack()     int

30、 i=0;         out.println("This Time is "+getTime();         out.println("Track's count is "+trackVector.size();         while(i)        

31、; Track myTrack=(Track)trackVector.get(i);             if(myTrack.Name=event.getName()             i+;         各个玩家游戏界面上都能显示实时动态,效果如图4.4所示:图4.4游戏对战实时显示图当玩家

32、被炮弹击中达到4次,而又没有及时吃到增长生命的血块时,提示游戏结束,可以选择重新开始或退出该模式,效果如图4.4 所示:图4.5 玩家死亡时游戏界面5 功能测试经过测试发现,游戏各个功能正常,坦克可以玩家控制的坦克能够四处移动,玩家控制的坦克能够打击敌人,敌人坦克能够任意移动,坦克被摧毁能够模拟爆炸,地图上存在障碍,玩家坦克能够增长生命。游戏画面如图所示:游戏主画面简单的数据统计玩家控制的坦克敌方坦克及障碍物6 总结本次设计是对大学所学专业知识的一次检验,同时也是我所做的工作量最大的一次作业,因此从一开始我对本次毕业设计就给予了高度重视。从选题、收集资料、学习相关技术到实际编程,我都一丝不苟的

33、对待了。当然其间我也走了不少弯路,有时甚至需要推倒重来,但同时我也多次体会过克服困难后的成就感。通过这次毕业设计,我学会了一些编程技巧,而且对调试的错误有进一步的认识,有时候就一个小小的语法错误就会导致程序调试不通过。所以每个字符,每句程序都要认真对待。使用不同的编程环境,其效率完全不一样,所以我选择了Eclipse,它自动找错/纠错功能、Debug调试和代码自动生成等一些重要的功能大大提高了我的设计效率。对于设计论文,一定要注意格式,认识事情都有它的规则、规范,不能按个人喜好随意改变。致 谢经过一段时间的忙碌,本次课程设计业已完成了,作为一个还未毕业的本科生的课程设计,由于经验的匮乏和业务逻

34、辑的不熟悉,难免有许多考虑不周全和不完善的地方,但是在指导老师和宿舍同学的帮助下很多困难都得以解决,所以在此本人要特别感谢他们对我的帮助。参考文献1 姜志强编著. Java语言程序设计 M.北京:电子工业出版社,20072 侯俊杰编著. Java语言应用开发基础 M.3 孙更新, 吕婕编著. Java毕业设计指南与项目实践 M. 北京:科技出版社,2007.4 杜江, 管佩森编著. Java使用编程100例 M. 北京:中国贴到出版社,2004.5 殷兆麟编著. Java语言程序设计 M. 北京:高等教育出版社, 2002.6 侯俊杰编著. Java程序设计教程与实训 M. 北京:科学出版社,

35、 2005.7 赵强, 陈洪译著. Java程序设计高级主题 M. 北京:北京大学出版社,2004.8丁来佳,周静. 基于JAVA平台事件驱动模型的研究与设计J. 黄冈师范学院学报 , 2008,(S1) .源代码11BattleCanvas.java文件内容:package tank;import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.io.*;public class BattleCanvas extends GameCanvas implements Runnable /

36、* Constructor */private UserSprite userSprite;private LayerManager layerManager;private EnemySprite enemySprite;private TiledLayer board;private Sprite gameOver;private ScoreScreen scoreScreen=new ScoreScreen();private int enemyPosition=1;public static int enemyNum=9; /total enemy number in current

37、level;public static int enemyOnScreen=0; /because one tank is served in the initialization.private String level1="/tank/level1.png"private String level2="/tank/level2.png"public static int currentLevel=1; /define what level the game is in now.private boolean isLoading=true; / whe

38、ther game is in the state loading process;public static long beginTime;public static boolean dead=false;public static boolean completed=false;public static long endTime; /*3 positions are defined at top of the screen each time theenemy comes out.they are 1,2,3 respectively.enemy will taketurns to co

39、me out from these three ports. Default postion is 1. */ public BattleCanvas() throws IOException super(true); layerManager=new LayerManager(); board=createTiledLayer(); createBoard(level1); layerManager.append(board); userSprite=createUser(); userSprite.setLayerManager(layerManager); userSprite.setT

40、iledLayer(board); userSprite.resetPosition(); layerManager.append(userSprite); enemySprite=new EnemySprite6; userSprite.setShootCheck(enemySprite); this.start(); public void start() Thread t=new Thread(this); t.setPriority(Thread.MAX_PRIORITY); t.start(); UserSprite createUser() throws IOException I

41、mage image = Image.createImage("/tank/tanks.png"); return new UserSprite(image); public void run() beginTime=System.currentTimeMillis(); / set the begin time. int gameOverLine=100; /place gameover font at center of the screen; int continueCount=20; / keep "gameOver "continue to d

42、isplay for 2 seconds after it has risen to the screen center. int enemyOutDelay=100;/keep at least 2 seconds intervals between two enemy comes out sequentially boolean isShining=false; try gameOver = createGameOver(); catch (IOException ex3) Graphics g=getGraphics(); while(true) if(enemyNum<=0) e

43、ndTime=System.currentTimeMillis(); scoreScreen.repaint(); try Thread.sleep(1500); / stop for a while to let the user take a look at the final status. catch (Exception ex6) Display.getDisplay(TankMain.instance).setCurrent(scoreScreen); try Thread.sleep(4000); catch (InterruptedException ex5) if(curre

44、ntLevel<2) / if now it is not the end level. this number should be changed according to the actual end level number. createBoard(nextLevel(); currentLevel+; / step into the next level; enemyPosition=1; / reset out port position. enemyNum=1; /reset enemy number. userSprite.resetPosition(); beginTi

45、me=System.currentTimeMillis(); /reset start time for the next level; isLoading=true;Display.getDisplay(TankMain.instance).setCurrent(this); else completed=true; break; if(enemyOnScreen<6)&&(enemyOnScreen<enemyNum) if(getNullEnemyIndex()!=-1) if(!isShining) / this if block is serving fo

46、r shining before enemy tank comes out as an indicator; int x=0,y=0; switch(enemyPosition) case 1:x=0;y=0;break ; /set them at three different position respectively case 2:x=75;y=0;break ; case 3:x=148;y=0;break ; try Image image =Image.createImage("/tank/down.png"); Shine shine = new Shine

47、(image, layerManager); shine.setPosition(x,y); new Thread(shine).start(); isShining=true; catch (IOException ex) if(enemyOutDelay!=0) enemyOutDelay-; /if two seconds are not over,do not check whether can serve an enemy. else try serveAnEnemy(); isShining=false; enemyOnScreen+; catch (IOException ex2

48、) enemyOutDelay = 100; /reset the delay time. if(!dead ) / if not gameover,check how many life ,user has. if(userSprite.getLife()<1) /if user die over,handle these; dead=true; if(dead) layerManager.insert(gameOver,0); gameOver.setPosition(40,gameOverLine+70); /40 is the horizontal position in scr

49、een; if(gameOverLine!=0) gameOverLine=gameOverLine-2; else continueCount-; if (continueCount=0) scoreScreen.repaint(); endTime=System.currentTimeMillis(); Display.getDisplay(TankMain.instance).setCurrent(scoreScreen); break ; input(); render(g); System.gc(); try Thread.sleep(20); catch (InterruptedE

50、xception ex4) void input() int keyStates = getKeyStates(); if (keyStates & UP_PRESSED) != 0) userSprite.go(UserSprite.UP); else if (keyStates & RIGHT_PRESSED) != 0) userSprite.go(UserSprite.RIGHT); else if (keyStates & LEFT_PRESSED) != 0) userSprite.go(UserSprite.LEFT); else if (keyState

51、s & DOWN_PRESSED) != 0) userSprite.go(UserSprite.DOWN); if (keyStates & FIRE_PRESSED) !=0) userSprite.fire(); / remove the "else" clause to enable tank fire when it is moving. void render(Graphics g) if (isLoading) loadingLevel(g); else int w = getWidth(); int h = getHeight(); g.se

52、tColor(0x000000); g.fillRect(0, 0, w, h); layerManager.paint(g, 0, 0); g.setColor(0xB5B5AD); / set color to gray g.fillRect(160, 0, 20, 176); /draw the right side bar and make 3D effect. g.setColor(0xffffff); g.drawLine(160, 0, 180, 0); g.drawLine(161, 1, 180, 1); g.drawLine(160, 0, 160, 176); g.dra

53、wLine(161, 0, 161, 175); g.setColor(0x000000); g.drawLine(179, 0, 179, 176); g.drawLine(178, 1, 178, 176); Font indicator = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM); try Image enemy = Image.createImage("/tank/enemy.png"); g.drawImage(enemy, 165, 35, Graphics.TOP |

54、Graphics.LEFT); Image user = Image.createImage("/tank/tanks.png"); g.drawImage(user, 165, 70, Graphics.TOP | Graphics.LEFT); catch (IOException ex) g.setFont(indicator); g.drawString(String.valueOf(enemyNum), 172, 57, Graphics.BASELINE | Graphics.HCENTER); g.drawString(String.valueOf(userS

55、prite.getLife(), 172, 92, Graphics.BASELINE | Graphics.HCENTER); flushGraphics();public void createEnemy(int i) throws IOException Image image = Image.createImage("/tank/enemy.png"); enemySpritei=new EnemySprite(image); enemySpritei.setLayerManager(layerManager); enemySpritei.setNumber(i);

56、 enemySpritei.setTiledLayer(board); enemySpritei.setEnemyGroup(enemySprite); layerManager.append(enemySpritei); enemySpritei.setEnemyShootCheck(userSprite); TiledLayer createTiledLayer() throws IOException Image image=Image.createImage("/tank/tiles.png"); return new TiledLayer(20,22,image,

57、8,8); public void createBoard(String level) InputStream map=getClass().getResourceAsStream(level); int z=0; if(map!=null) try for (int row = 0; row < 22; row+) for (int col=0; col < 20; col+) z=map.read(); board.setCell(col,row,z); catch (IOException ex) public Sprite createGameOver() throws I

58、OException return new Sprite(Image.createImage("/tank/gameover.png"); private int getNullEnemyIndex() int number=-1; for(int i=0;i<6;i+) if(enemySpritei=null) number=i; / if find a tank is null,return its index,else return -1 means all tank index are allocated. break ; return number; private void serveAnEnemy() throws IOException int index=getNullEnemyIndex(); /if not all enemy are allocated if (index!=-1) createEnemy(index); int x=0,y=0; switch(enemyPosition) case 1:x=5;y=5;enemyPosition=2;break ; /set them at three different

温馨提示

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

评论

0/150

提交评论