基于java坦克大战课程设计报告超全文档格式.docx
- 文档编号:22075132
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:15
- 大小:2.21MB
基于java坦克大战课程设计报告超全文档格式.docx
《基于java坦克大战课程设计报告超全文档格式.docx》由会员分享,可在线阅读,更多相关《基于java坦克大战课程设计报告超全文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
❑坦克有生命值,并非被击中一次就会爆炸
❑坦克爆炸后将产生道具,拾到道具的坦克可加满生命值
❑游戏须提供网络支持,即局域网联网对战
❑玩家在游戏中可以发言,即群聊功能
❑须在玩家之间设立房主,掌管游戏何时开始
❑游戏结束时须判断哪一队胜利
❑游戏结束后可重新开始
❑游戏的操作、进度等须提供相应说明,以告知玩家
二、
概要设计
工作流程图
项目规划
本游戏是一个典型的局域网对战游戏,应具有如下结构:
❑游戏主窗口
游戏的一切效果、进度、消息等都将由游戏主窗口展示
❑网络管理
负责发送、接收网络数据,以及如何处理这些数据
❑封装的游戏元素
游戏元素包括:
坦克、子弹、爆炸效果、墙、道具等游戏必须的元素
开发及运行环境
开发时硬件环境
❑CPU:
InterP7350
❑显卡:
NVIDIAGeForce9600MGS
❑内存:
威刚2G/DDR2-667
❑显示器:
三星液晶15.4寸/分辨率:
1280X800
开发时软件环境
❑操作系统:
Windows7
❑JDK:
1.5.0
❑IDE:
Eclipse3.4.0
运行时硬件环境
InterE5200
NVIDIAGeForce7300GS
金士顿2G/DDR2-667
运行时软件环境
WindowsXp
❑JRE:
1.6.0
三星液晶19寸/分辨率:
1440X900
三、详细设计与算法实现
游戏主窗口
游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道,并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据的输入、输出。
在程序中须创建一个类TankClient,继承自Frame来创建一个窗口。
游戏数据的输入
游戏中坦克需要能往上、下、左、右四个方向运动,故须设立4个按键,使其能操作坦克,另须设一个键控制坦克开火。
为方便操作,本游戏设置WSAD分别表示上下左右,小键盘数字键4,表示开火。
具体实现为,为窗口添加KeyListener(键盘监听器),监听键盘的按下和抬起。
在TankClient类中添加内部的适配器类,由于不需要其它类访问,将其设计为private的,以保证面向对象设计的封装性。
代码如下:
/*
*移动按键键盘监听器
*/
privateclassMoveKeyLextendsKeyAdapter{
publicvoidkeyPressed(KeyEvente){
switch(e.getKeyCode()){
caseKeyEvent.VK_A:
myTank.keyDownToDir(Direction.L);
break;
caseKeyEvent.VK_W:
myTank.keyDownToDir(Direction.U);
caseKeyEvent.VK_D:
myTank.keyDownToDir(Direction.R);
caseKeyEvent.VK_S:
myTank.keyDownToDir(Direction.D);
}
}
publicvoidkeyReleased(KeyEvente){
myTank.keyUpToDir(Direction.L);
myTank.keyUpToDir(Direction.U);
myTank.keyUpToDir(Direction.R);
myTank.keyUpToDir(Direction.D);
}
*开火按键键盘监听器
privateclassFireKeyLextendsKeyAdapter{
caseKeyEvent.VK_NUMPAD4:
myTank.fire();
newTankFireMsg().send();
}
游戏数据的输出
玩家需要从游戏输出数据中获得游戏信息,如坦克在往上行驶、坦克发了颗子弹、坦克爆炸等,这些均需要通过游戏数据的输出来告知玩家。
由于TankClient继承自Frame,Frame类中的方法paint,可以在窗口中绘制图形,即满足了游戏需要图形界面的需求;
另有方法repaint可以刷新窗口,以及时提供游戏信息,故须创建线程,不断地刷新窗口,来获取最新的游戏信息。
publicvoidpaint(Graphiceg){
for(inti=0;
i<
allGE.size();
i++){
intallGEOldSize=allGE.size();
GameElementge=allGE.get(i);
if(geinstanceofMoveable){
Moveablemoveable=(Moveable)ge;
moveable.move();
ge.draw(g);
/*
*如果容器数量减少,则减少相应的遍历索引i
*/
if(0<
allGEOldSize-allGE.size()){
i-=allGEOldSize-allGE.size();
/*
*刷屏线程,负责画面的刷新以及游戏时间的推进
privateclassMyThimplementsRunnable{
publicvoidrun(){
while(true){
repaint();
try{
Thread.sleep(25);
}catch(InterruptedExceptione){
e.printStackTrace();
}
为使游戏主窗口效率更高、更容易被引用,且游戏主窗口只有一个,故TankClient类使用单例模式来设计:
privatestaticfinalTankClienttc=newTankClient();
privateTankClient(){
...
publicstaticTankClientgetTc(){
returntc;
网络管理
游戏需要对局域网对战的支持,所以需要对网络数据进行管理,使游戏能有条不紊地运行,网络管理部分主要负责输入游戏数据后发往其它游戏客户端,以及接收其它客户端发来的游戏数据。
需要发送的游戏数据有:
坦克创建消息(TankCreateMsg)、坦克开火消息(TankFireMsg)等
客户端游戏数据的收发
由于每个游戏消息都有共同的特性,即发送、接受,故将其抽象出一个父类Msg,所有的消息类都继承自Msg类。
publicabstractclassMsg{
publicstaticfinalTankClienttc=TankClient.getTc();
publicstaticfinalintTANK_CREATE_MSG=1;
publicstaticfinalintTANK_CHANGEDIR_MSG=2;
publicstaticfinalintTANK_CALIBRATION_MSG=3;
publicstaticfinalintTANK_FIRE_MSG=4;
publicstaticfinalintCHAT_WORD_MSG=5;
publicstaticfinalintTANK_READY_MSG=6;
publicstaticfinalintGAME_START_MSG=7;
publicstaticfinalintGAME_OVER_MSG=8;
publicstaticfinalintGAME_EXIT_MSG=9;
publicstaticfinalintGAME_CHANGEMASTER_MSG=10;
publicabstractvoidsend();
publicabstractvoidreceive(DataInputStreamdis);
在需要向每个游戏客户端发送游戏消息时只需实例化一个相应的对象,在调用send方法即可,接收时调用receive方法。
服务器端游戏数据的收发
服务器端的设计,只需将所有接收到的包转发给所有游戏客户端即可。
接收:
publicclassUDPThreadimplementsRunnable{
publicvoidrun(){
byte[]buf=newbyte[1024];
DatagramSocketds=null;
try{
ds=newDatagramSocket(ServerMain.SERVER_UDP_PORT);
}catch(SocketExceptione){
e.printStackTrace();
while(true){
DatagramPacketdp=newDatagramPacket(buf,buf.length);
try{
ds.receive(dp);
ServerMain.sendToEveryone(ds,dp);
}catch(IOExceptione){
e.printStackTrace();
转发:
publicstaticvoidsendToEveryone(DatagramSocketds,DatagramPacketdp){
ServerMain.clients.size();
Clientc=ServerMain.clients.get(i);
StringIP=c.IP;
intport=c.udpPort;
dp.setSocketAddress(newInetSocketAddress(IP,port));
ds.send(dp);
封装的游戏元素
将游戏元素(坦克、子弹、墙等)封装成一个一个的类,将大大地降低游戏设计、实现难度,且符合面向对象的设计方法。
由于这些游戏元素都有一些相同的属性、方法,故将其抽象为父类GameElement。
publicabstractclassGameElement{
/**
*持有游戏主窗口的引用
*元素的坐标
publicRectanglerect;
*元素的类型(队伍)
*/
publicGameElementKindkind=GameElementKind.DEMON;
/**
*由游戏主窗口自动调用,将决定该元素的在游戏中的表现形式
publicabstractvoiddraw(Graphicsg);
程序中共有如下游戏元素:
❑Blast:
爆炸效果
❑Bullet:
子弹
❑ChatWord:
群聊的内容
❑Tank:
坦克
❑Wall:
墙
四、
测试
测试环境
测试时硬件环境
测试时软件环境
测试结果
在以上软硬件环境中测试,已通过6人互联测试,游戏过程正常,满足软件的功能需求,结果正确无误。
发现的BUG及不足
1.由于没有添加操作说明,使玩家不知如何操作,大大地影响了游戏的可操作性。
2.在测试环境测试时,出现画面抖动现象,严重地影响了游戏的进行,必须找到原因并改正。
解决方法
1.在程序启动时告知玩家游戏该如何操作,使玩家能清楚、正确地开始游戏。
2.经过反复测试、论证,得知画面抖动现象原因为测试环境JRE安装问题,在重新安装JRE后,游戏画面恢复正常。
五、
软件截图
六、
总结
该游戏定位在小型局域网休闲游戏,是一款免费、绿色、开源的一款软件。
本软件是使用JAVA开发的局域网对战游戏,其不仅实现了基本的功能需求,而且设计灵活、拓展方便、界面生动,多处使用了各种设计模式,是程序的编写效率更高,运行效率更高。
由于程序中多数是面向父类或者面向接口的编程,以后如果要更换某些模块、元素的功能,以及添加功能,是非常容易的。
现在软件还无收入,但随着玩家的逐渐增多,随时可以利用本软件优良的可拓展性,添加相关内容,从而开始盈利;
即便本游戏未得到玩家的喜爱,而需要再次设计游戏或者另行开发新游戏,其内部使用的各个模块、封装的游戏元素,均可以复用,这也是本软件优良的可重用性的体现。
七、
参考文献
❑JAVA开发实战宝典--------编著:
李钟蔚出版社:
清华大学出版社
❑JAVA面向对象编程--------编著:
孙卫琴出版社:
电子工业出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 java 坦克 大战 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)