java坦克大战.docx
《java坦克大战.docx》由会员分享,可在线阅读,更多相关《java坦克大战.docx(16页珍藏版)》请在冰豆网上搜索。
java坦克大战
基于java坦克大战课程设计报告
摘要
面向对象方法是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,它吸取了结构化程序设计的精华,以更接近人们通常思维的方式来处理问题,是一种全新的软件开发技术。
作为一种新的的编程语言,Java很大程度推广了面向对象的思想。
随着计算机技术的发展,Java的强大展现出它不可替代的作用。
Java的功能不仅体现在它网络方面的应用,对于应用程序设计、游戏设计等Java都能满足需求。
本文针对Java的具体应用,设计了一个小游戏。
根据游戏的规则,用户将可以和计算机进行简单对战。
程序实现了友好的用户交互界面,让用户能很好地对游戏进行操作。
关键字:
JAVA GUI 游戏
ABSTRACT
TheObject-OrientedMethodisamethodwhichaplliestheObject-OrientedDesigntotheprocessofthesoftwareexploitureanddirectstheployofdevelopment.ItextractstheprimeoftheStructuredDesignforComputerProgrammers,dealsmatterswitha
folksyfashion,whichisconsideredtobeagrandnewsoftware-developtechnique.
Asanewprogramminglanguage,JavaspreadtheObject-OrientedDesigninacertaindegree.Withthedevelopmentofthetechniqueofcomputer,theinsurmountablefunctionofJAVAisexhibitedforits’mightiness.Notonlyappliesinnetwork,JAVAalsocanfulfilltherequirementoftheApplication-DesignandGame-Design.
Inthispaper,tousetheidiographicapplicationofJAVA,Idesignagamecalled.Followingtheregularofthegame,usercanplayasimplerevalrywithcomputer.ThisprogrammeactualizesafolksyGUImode,whichwillmakeusermastergameeasily.
Keywords:
JAVA GUI Game
目录
一、系统分析-1-
可行性分析-1-
需求分析-1-
二、概要设计-2-
工作流程图-2-
项目规划-3-
开发及运行环境-3-
三、详细设计与算法实现-4-
游戏主窗口-4-
网络管理-6-
封装的游戏元素-8-
四、测试-10-
测试环境-10-
测试结果-10-
五、软件截图-11-
六、总结-14-
七、参考文献-15-
一.背景与意义
游戏是全球最大的娱乐经济项目之一,已经被命名为“第九艺术”。
而由“游戏”派生出来的职业,除了软件开发外,游戏包装宣传推广、攻略指导、网络游戏管理员和职业游戏玩家等,已成为了一系列专门的岗位。
面对游戏产业如此巨大的市场空间,国内各大城市纷纷加大了这方面的人才培养,中国的游戏人才培训已随着游戏行业的总体发展开始逐步迈入了正轨。
虽然说中国的游戏行业开始逐步的迈入了正轨,但是现今,游戏人才出现严重的瓶颈时期,高校的扩招、金融危机的侵袭直接影响着我们最关心的就业问题,但是另一方面游戏人才的缺乏又直接制约着行业的发展,这就更加严格了对社会培训机构的稳定性和正规性的要求。
在我国,游戏人才培养体系还未健全,部分开设了相关专业的高校,游由于理论和实践的脱离无法完全满足网游公司对人才的需求。
所以,就中国目前的市场分析来看,加强游戏产业必须在多渠道人才培养体系上加快突破,尽快建立起多渠道人才培养体系,来满足社会对游戏人才的需求。
《坦克大战》(Battle City)是1985年日本南梦宫Namco游戏公司在任天堂FC(FamilyComputer)平台上,推出的一款多方位平面射击游戏。
游戏以坦克战斗及保卫基地为主题。
大部分80后的青年人曾经都玩过这款FC平台上的经典游戏,FC平台上的坦克大战只能两个人协同作战。
本系统运用Java这个跨平台的编程语言,在PC上重新实现这一款经典游戏,探究曾经这一款经典游戏的大概设计与实现,并且加入坦克八个方向的行走,多人的局域网对战模式,使游戏的玩法更丰富。
二.设计原理
本系统的坦克大战是基于Java语言设计开发的,具有高超的人工智能,精美的图形处理,支持单机运行和网络对战的坦克射击游戏。
比之前网络上实现的游戏更加方便,快捷,智能。
游戏基本玩法较简单,游戏可一人电脑作战,每次电脑方有坦克10辆,游戏以消灭全部敌方坦克过关为目的。
在这过程中,坦克有机会得到血块来添加生命值,从而变得更加强大,也能利用各种有利地形来阻击敌人。
游戏设置了墙面,电脑方坦克不能穿越墙面射击玩家坦克,而玩家坦克可随意穿越墙面打击电脑方坦克,这一游戏特权。
还有给玩家坦克设置超级炮弹,当电脑方坦克数量过多时,玩家坦克可以发射超级炮弹打击敌方。
主要新增的功能简单罗列如下:
1、屏幕左上方显示游戏状态,当玩家方坦克数全为零时则游戏结束;
2、一般坦克只可在空地中或草丛中行走,不可通过墙面等障碍物;
3、游戏中打坏敌方坦克后,可能会在随机位置随机出现血块奖励,坦克经过该位置可获得相应加生命值奖励;
4、玩家坦克的游戏资格和电脑坦克不同。
工作流程图:
一.详细设计过程与算法实现
游戏主窗口
游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道,并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据的输入、输出。
在程序中须创建一个类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);
break;
caseKeyEvent.VK_D:
myTank.keyDownToDir(Direction.R);
break;
caseKeyEvent.VK_S:
myTank.keyDownToDir(Direction.D);
break;
}
}
publicvoidkeyReleased(KeyEvente){
switch(e.getKeyCode()){
caseKeyEvent.VK_A:
myTank.keyUpToDir(Direction.L);
break;
caseKeyEvent.VK_W:
myTank.keyUpToDir(Direction.U);
break;
caseKeyEvent.VK_D:
myTank.keyUpToDir(Direction.R);
break;
caseKeyEvent.VK_S:
myTank.keyUpToDir(Direction.D);
break;
}
}
}
/*
*开火按键键盘监听器
*/
privateclassFireKeyLextendsKeyAdapter{
publicvoidkeyReleased(KeyEvente){
switch(e.getKeyCode()){
caseKeyEvent.VK_NUMPAD4:
myTank.fire();
newTankFireMsg().send();
break;
}
}
}
游戏数据的输出
玩家需要从游戏输出数据中获得游戏信息,如坦克在往上行驶、坦克发了颗子弹、坦克爆炸等,这些均需要通过游戏数据的输出来告知玩家。
由于TankClient继承自Frame,Frame类中的方法paint,可以在窗口中绘制图形,即满足了游戏需要图形界面的需求;另有方法repaint可以刷新窗口,以及时提供游戏信息,故须创建线程,不断地刷新窗口,来获取最新的游戏信息。
代码如下:
publicvoidpaint(Graphiceg){
for(inti=0;iintallGEOldSize=allGE.size();
GameElementge=allGE.get(i);
if(geinstanceofMoveable){
Moveablemoveable=(Moveable)ge;
moveable.move();
}
ge.draw(g);
/*
*如果容器数量减少,则减少相应的遍历索引i
*/
if(0i-=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){
for(inti=0;itry{
Clientc=ServerMain.clients.get(i);
StringIP=c.IP;
intport=c.udpPort;
dp.setSocketAddress(newInetSocketAddress(IP,port));
ds.send(dp);
}catch(IOExceptione){
e.printStackTrace();
}
}
}
封装的游戏元素
将游戏元素(坦克、子弹、墙等)封装成一个一个的类,将大大地降低游戏设计、实现难度,且符合面向对象的设计方法。
由于这些游戏元素都有一些相同的属性、方法,故将其抽象为父类GameElement。
publicabstractclassGameElement{
/**
*持有游戏主窗口的引用
*/
publicstaticfinalTankClienttc=TankClient.getTc();
/**
*元素的坐标
*/
publicRectanglerect;
/**
*元素的类型(队伍)
*/
publicGameElementKindkind=GameElementKind.DEMON;
/**
*由游戏主窗口自动调用,将决定该元素的在游戏中的表现形式
*/
publicabstractvoiddraw(Graphicsg);
}
程序中共有如下游戏元素:
Blast:
爆炸效果
Bullet:
子弹
ChatWord:
群聊的内容
Tank:
坦克
Wall:
墙
图
(1)
图
(2)
图(3)
图(4)
图(5)
图(6)
发现的BUG及不足
1.由于没有添加操作说明,使玩家不知如何操作,大大地影响了游戏的可操作性。
2.在测试环境测试时,出现画面抖动现象,严重地影响了游戏的进行,必须找到原因并改正。
解决方法
1.在程序启动时告知玩家游戏该如何操作,使玩家能清楚、正确地开始游戏。
2.经过反复测试、论证,得知画面抖动现象原因为测试环境JRE安装问题,在重新安装JRE后,游戏画面恢复正常。
总结
该游戏定位在小型局域网休闲游戏,是一款免费、绿色、开源的一款软件。
本软件是使用JAVA开发的局域网对战游戏,其不仅实现了基本的功能需求,而且设计灵活、拓展方便、界面生动,多处使用了各种设计模式,是程序的编写效率更高,运行效率更高。
由于程序中多数是面向父类或者面向接口的编程,以后如果要更换某些模块、元素的功能,以及添加功能,是非常容易的。
现在软件还无收入,但随着玩家的逐渐增多,随时可以利用本软件优良的可拓展性,添加相关内容,从而开始盈利;即便本游戏未得到玩家的喜爱,而需要再次设计游戏或者另行开发新游戏,其内部使用的各个模块、封装的游戏元素,均可以复用,这也是本软件优良的可重用性的体现。
1、
参考文献
JAVA开发实战宝典--------编著:
李钟蔚出版社:
清华大学出版社
JAVA面向对象编程--------编著:
孙卫琴出版社:
电子工业出版社