虚拟分组课程设计报告讲解.docx
《虚拟分组课程设计报告讲解.docx》由会员分享,可在线阅读,更多相关《虚拟分组课程设计报告讲解.docx(47页珍藏版)》请在冰豆网上搜索。
虚拟分组课程设计报告讲解
学号
2013-2014学年第二学期
《软件开发》
课程设计报告
题目:
虚拟分组坦克程序设计
专业:
计算机科学与技术
班级:
10
(2)
姓名:
院系:
计算机与信息工程系
指导教师:
成绩:
2014年6月8日
4系统实现.……………………………………………………………………………………….4
1开发技术概述
Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言。
JAVA现在主要用在WEB开发,手机游戏及一些平台游戏的开发,因为它具有很好的跨平台性,在手机等各种电子产品上应用非常广泛。
C语言是一种面向过程编程,这就使得Java具有重用的特性,在开发速度上比C语言更快,但是在运行速度上却是C更快,因为C属于底层语言,它比JAVA更加亲近机器,所以在许多系统开发上一般是用C语言,比如我们常用的XP系统、LINUX系统,都是C语言开发的。
跨平台的服务器端的嵌入式脚本语言。
C++多用于游戏引擎、反病毒、硬件驱动以及一些对运行效率要求比较高的应用程序,比如数据库管理系统。
C++语言在提供强大的功能的同时也提高了程序含BUG的可能性。
C++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性。
2相关技术理论
系统运行环境
(1)网络服务器操作系统:
WindowsXP;
(2)开发工具:
eclipse3.2;
(3)运行环境:
J2SDK1.5;
(4)编程语言:
Java语言;
3系统分析
3.1系统可行性分析
3.1.1技术可行性
Java语言自Sun公司于1995年5月正式发布以来,经历了出生、成长、成熟壮大的几个阶段,逐渐发展成为IT领域里的主流计算模式,使用Java开发工具方便,容易实现。
Java对开发网络产品有它自己独特的优势,网络游戏也是其开发产物之一。
本系统开发过程是利用Java编程语言和eclipse集成开发环境配合使用来实现的,它是基于TCP/UDP协议和Socket编程技术,建立以C/S为结构模式的娱乐性游戏平台。
3.1.2操作可行性
本设计是一个虚拟的游戏平台,只是模拟了现在社会上的一些多机游戏的部分功能,所以操作简易,玩家不需要了解内部流程,只是和一般其他的游戏一样的操作即可开始游戏。
相对于开发者而言,整个系统形成主要由JDK5.0虚拟环境和eclipse3.2共同完成,无需更多复杂的工具和服务器支持。
3.2功能分析
3.2.1TankClient类基本功能分析
TankClient类是整个系统的核心部分,它承担整个系统的所有可实现功能的调度工作。
是整个游戏运行的场所。
TankClient类设计流程图如图3.2所示:
结束
TankClient类是主类,通过调用其他类中封装的方法来使整个系统运行起来,下面显示TankClient与各个类之间的关系如图3.3所示:
打击
图3.3游戏系统类关联图
3.2.2Tank类基本功能分析
Tank(坦克)类中,封装了一些变量属性,包括坦克自己的大小(WIDTH,HRIGHT),运动速度(SPRRD_X:
在x轴方向的速度;SPEED_Y:
在Y轴方向的速度)、生命值控制(life)、坦克编号(id)、坦克名(name)、方向控制(dir)、生死控制(live)、好坏控制(good)的变量等。
Tank类中没有main函数,不是主类,它当中只封装一些变量属性和静态方法,被TankClient类调用来实现坦克的一系列动作。
Tank类中的主要方法罗列如下:
(1)getRect()方法
publicRectanglegetRect(){
returnnewRectangle(x,y,this.WIDTH,this.HEIGHT);
}
Rectangle类是碰撞检测的辅助类,通过得到子弹的x,y坐标和宽高度,检测两个矩形是否碰撞(相交);
(2)draw()方法:
负责将所有的活动在屏幕上画出来;
(3)move()方法:
主要负责控制坦克的移动,包括8个方向(左,左上,上,右上,右,右下,下,左下)的控制以及给坦克一个移动的速度;
(4)keyPressed()方法:
设定使用键盘的“↑”“↓”“←”“→”键控制坦克移动;
(5)keyReleased()方法:
处理按键抬起事件,抬起“CTRL”键时,发射炮弹并加入新炮弹,能够逐一发射每一发炮弹、抬起“A”键可以发射超级炮弹等功能;
(6)locationDirection()方法:
定义了炮筒方向,可以向八个方向发射炮弹;
(7)fire()方法:
处理发送子弹的方法;
(8)bumpWithWall()方法:
主要负责处理坦克撞墙事件;
(9)bumpWithTank()方法:
主要到负责处理坦克和坦克相撞事件;
4系统实现
4.1游戏主窗体实现
TankClient类负责画出游戏主窗体,它是整个游戏运行和所有活动的场所。
登陆主窗口后,主界面上包括两个下拉菜单条,“游戏”和“帮助”。
TankClient类是整个系统的“大管家”,当要执行某动作时,“大管家”只需要调用各个类中封装好的方法,让被调用的类自己去执行它自己的方法,这更体现了面向对象的思想。
游戏主窗体界面如图4.1所示:
图4.1游戏主窗口预览效果图
实现虚拟屏幕消除闪烁的关键代码如下:
publicvoidupdate(Graphicsg){//利用双缓冲消除闪烁的效果
if(offScreenImage==null){
offScreenImage=this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
GraphicsgOffScreen=offScreenImage.getGraphics();
Colorc=gOffScreen.getColor();
gOffScreen.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
代码如下:
packagemytest;
importrobocode.*;
publicclassTrack
{
publicStringName; //敌人坦克的名称
publicdoubleHeading; //敌人的绝对角度,通过计算得出
publicdoubleBearing;//敌人坦克相对于你车头方向的相对角度
publicdoubleDistance; //敌人坦克的距离
publicdoubleEnergy; //能量
publicdoubleVelocity; //速率
publicdoubleFaceHeading; //敌人坦克面向的方向
publicdoubletrackX,trackY; //敌人坦克的坐标
publicdoublenextTrackX,nextTrackY;//下一个标准时间中敌人坦克所在的位置
publicvoidupdate(ScannedRobotEvente)
{Name=e.getName(); //敌人坦克的名称
Bearing=e.getBearing(); //敌人坦克相对于你车头方向的相对角度
Distance=e.getDistance();//敌人坦克的距离
Energy=e.getEnergy(); //能量
Velocity=e.getVelocity(); //速率
FaceHeading=e.getHeading();//敌人坦克面向的方向
}
}
下一步就是如何把已经现身在雷达中的敌人抓到一个vector里去了,让我们回到我们的机器人主体中去:
派生自AdvancedRobot类的MyVector类中。
首先,声明一个vector类型,并在run中进行初始化。
publicclassMyVectorextendsAdvancedRobot
{finaldoubleversion=0.1;
privateVectortrackVector; //声明我们的向量数组
/**
*run:
MyVector'sdefaultbehavior
*/
publicvoidrun(){
out.println("myVectorVersionis"+version);
trackVector=newVector(); //初始化我们的向量数组
while(true){
//Replacethenext4lineswithanybehavioryouwouldlike
showTrack();
setTurnRadarRight(360); //让雷达不停转
execute();
}
}
4.2.2获取敌人
只要雷达工作正常,我们就能获取每一个敌人的信息了。
当敌人的信息源源不断地涌入我们的onScannedRobot中,我们的机器人要像一个优秀的指挥官一样去鉴别情报,哪些是已经有的,哪些是没有的。
让我们去onScannedRobot事件里看一下吧。
*onScannedRobot:
Whattodowhenyouseeanotherrobot
*/
publicvoidonScannedRobot(ScannedRobotEvente){
if(!
isInVector(e))
{ TrackmyTrack=newTrack();
myTrack.update(e);
trackVector.add(myTrack);
}
}
我的myVector机器人是靠自定义