linux 课程设计.docx
- 文档编号:18088454
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:32
- 大小:654.25KB
linux 课程设计.docx
《linux 课程设计.docx》由会员分享,可在线阅读,更多相关《linux 课程设计.docx(32页珍藏版)》请在冰点文库上搜索。
linux课程设计
基于Linux的坦克大战游戏程序的开发
学生姓名:
王浩指导老师:
侯利娟
摘要本课程设计主要是在linux操作系统上用java语言和Eclipse开发小游戏,并设置Linux为游戏服务器为游戏服务。
关键字Java;Eclipse;游戏服务器;命令行
本设计采用分层思想,分为客户端,服务端,其中客户端分为网络连接,消息处理,具体传输底层交给Netclient.java实现。
窗口画面的显示,是以线程每隔0.1s刷新画面上的信息,所以坦克客服端只要改变坦克相关信息的坐标,就能实现动态画面。
客户端保存所有其他客服端的坦克信息,子弹信息,当接收到消息时及时更新自己本地保存的信息,并发送相应的匹配结果信息。
服务端得到客户端的tcp连接后,分配给客户一个ID后,并保存客户端信息,当再次收到客户端的udp数据包后,服务端就转发给其他所有客户端,从而实现网络对战。
Tank每产生一个数据包经过自己的客户端的NetClient转换成数据包发给服务器,同时,NetClient收到数据包后,读取数据包第一个字段,从而辨别数据包是6种tank信息的其中一种,交给客服端更新信息。
游戏中的墙壁实现原理:
定义一个小方块,在不同的坐标画出小方块,这样就可以利用小方块,画出各种图案,每个方块有个存活状态控制信息,只有为活着时,才可以被画笔(paint())调用。
目录
1课程设计目的与要求1
1.1课程设计的意义1
1.2课程设计的目的1
1.3Linux游戏服务器简介1
2部署Linux开发游戏的资源3
2.1启动vsftp服务器3
2.2上传资源4
2.3安装资源5
3游戏开发与调试6
3.1TankWar客服端开发6
3.2TankWar服务器端开发13
3.3TankWar负责网络传输分析16
3.4TankWar传递消息分析20
3.5TankWar运行和调试21
5结束语26
参考文献27
附录:
源程序清单28
1课程设计目的与要求
1.1课程设计的意义
Linux操作系统近几年有了蓬勃的发展,在整个世界范围内得到了越来越多公司和团体的支持,尤其是最近IBM公司的鼎力支持,更是使Linux服务器如虎添翼,更上一层楼。
而在国内,Linux的应用也是方兴未艾,众多公司已经投入到Linux系统的研发和推广工作中。
一些优秀的Linux操作系统相继出现,比如红旗Linux等。
Linux服务器已每年惊人的数字增长。
据科学调查Linux服务器在全球所占的比例达到98%。
1.2课程设计的目的
巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。
通过该课程设计的学习,总结Linux网络系统课程的学习内容,利用Eclipse开发Java游戏,从而巩固课堂知识、深化学习内容、完成教学大纲要求,学好计算机科学与技术专业的专业基础课,从而更深刻的理解网络操作系统。
1.3Linux游戏服务器简介
在高端服务器操作系统领域,随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,并且形成了大规模市场应用的局面。
Linux引起了全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。
目前国外服务器厂商使用的服务器操作系统主要包括SUN的SOLARIS、IBM的AIX、HP的HP-UX,其中UNIX系列的产品几乎占据了大部分服务器高端市场和部分服务器中低端市场,WINDOWS系列占据了较大部分服务器中低端市场,LINUX由于其成本优势在中低端市场也有良好的表现,并且市场份额上升幅度很大。
目前国内的服务器操作系统情况基本类似于国外,高端服务器操作系统市场基本为UNIX平台所占据,由于国内中低端服务器的市场保有量较大,所以WINDOWS系列产品的实际市场占有率相对较国外高,约占40%,LINUX由于低成本的特点,也取得了大约35%的市场份额。
2部署Linux开发游戏的资源
2.1启动vsftp服务器
配置vsftp如图2.1),启动Linux下vsftp服务器(如图2.2)。
图2.1修改vsftp服务器配置文件
图2.2vsftp服务器启动
图2.3设置vsftp服务器自动启动
2.2上传资源
向linux服务器上传资源,和及时更新服务器资源(如图2.5)。
图2.4连接vsftp服务器
图2.5向linux服务器传输资源
2.3安装资源
安装java虚拟机,使java程序能够正常运行(如图2.5)。
图2.5安装java虚拟机
图2.5java虚拟机安装完毕
3游戏开发与调试
3.1TankWar客服端开发
客服端运行开始时,先以TCP传输方式向服务器请求建立连接。
得到服务器确认后,确认自己从服务器分配的ID。
然后以UDP传输方式传输坦克的各信息。
客服端利用容器List保存服务器发来的其他坦克客服端信息。
再从List中取出各信息来和自己比较。
比向服务器传递比较消息。
这里采用分层思想,具体传输底层交给Netclient.java实现。
窗口画面的显示,是以线程每隔0.1s刷新画面上的信息,所以坦克客服端只要改变坦克相关信息的坐标,就能实现动态画面。
图3.1客户端数据流
①坦克建立消息
②坦克产生一个子弹消息
③子弹死去消息
④坦克死去消息
⑤坦克移动消息
⑥墙壁死去消息
当服务端NetClient接收到数据包时会读取数据包第一个字段,从而知道消息类型,交给相应实现消息接口的消息解析器。
得到消息所有信息后,更新本地内容,从而画笔(paint())刷新画面时,内容已改变。
publicvoidpaint(Graphicsg){//每当刷新一次运行下面内容
Colorc=g.getColor();
g.setColor(Color.red);
g.drawString("炮弹数目:
"+missiles.size(),20,55);
g.drawString("爆炸数目:
"+baozaos.size(),20,70);
g.drawString("LINUX课程设计",20,40);
g.drawString("感谢侯利娟老师2年来的无私奉献!
!
",300,40);
g.setColor(c);
for(inti=0;i Explodebaozao=baozaos.get(i); baozao.drawExplode(g); } myTank.DrawTank(g);//画主机坦克 for(inti=0;i this.enemyTank.get(i).DrawTank(g); } for(inti=0;i Missilem=missiles.get(i); m.hitTanks(enemyTank); if(m.tankId! =myTank.ID){ if(m.hitTank(myTank)){//判断子弹是不是击中坦克 Msgtankdead=newTankDeadMsg(this.myTank.ID);//产生一个坦克死去消息 MsgMissiledead=newMissileDeadMsg(m.tankId,m.ID);//产生一个子弹死去消息 this.nc.send(Missiledead);//发送子弹死去消息 this.nc.send(tankdead);//发送坦克死去消息 } } m.drawMissile(g);//调用画子弹方法 } for(inti=0;i Linuxl=linuxs.get(i); for(intj=0;j if(l.hitMissile(missiles.get(j))){//判断子弹击中墙壁 MsgMissiledead=newMissileDeadMsg(this.myTank.ID,missiles.get(j).ID); Msglm=newLinuxMsg(l.id,l.x,l.y,l.live); this.nc.send(Missiledead);//发生子弹死去消息 this.nc.send(lm);//发生墙壁损失 } if(l.live){ l.drawLinux(g);//画出还剩下墙壁 } } } 3.2TankWar服务器端开发 TankWar服务器端接受客服端以TCP传输方式传来的建立请求,分配给客服端一个ID号,保存客服端的信息。 当服务端以线程方式接受到从客服端以UDP方式发来的数据包时,服务端就转发给各客服端。 服务器只转发数据包,不做任何修改。 图3.2tcp和udp连接 ①建立tcp请求连接 ②分配客户ID ③客户向服务器发送UDP数据包 ④服务器转发数据包 图3.3服务器数据流图 List privateclassUDPRecvThreadimplementsRunnable{//接收客户的UDP数据包,并转发进程 byte[]buf=newbyte[1024]; publicvoidrun(){ DatagramSocketdgs=null;//UDP服务端 try{ dgs=newDatagramSocket(UDP_PORT); }catch(SocketExceptione){ e.printStackTrace(); } while(dgs! =null){ DatagramPacketdp=newDatagramPacket(buf,buf.length); try{ dgs.receive(dp); System.out.println("数据包字符长度为: "+buf.length); System.out.println("一个数据包接受成功"+"potr: "+UDP_PORT); for(inti=0;i dp.setSocketAddress(newInetSocketAddress(udp_clients.get(i).IP,udp_clients.get(i).udp_port)); dgs.send(dp); System.out.println("数据包转发成功"+i+"号"+udp_clients.size()); } }catch(IOExceptione){ e.printStackTrace(); } } } } } 3.3TankWar负责网络传输分析 NetClient.java实现网络底层的传输,定义TCP,UDP传输,客服端经过这里封装和发出数据包(数据包的封装交给实现msg.java接口给消息类),当服务器发来消息是,先在这里经过处理再交给客服端。 包括消息的解析,消息的类型辨别。 图3.4TankClient结构图 privatevoidparse(DatagramPacketdgp){//解析消息方法 ByteArrayInputStreambais=newByteArrayInputStream(buf,0,dgp.getLength()); DataInputStreamdis=newDataInputStream(bais); intmsgType=0; try{ msgType=dis.readInt();//判断消息类型 }catch(IOExceptione){ e.printStackTrace(); } Msgmsg=null; switch(msgType){//判断消息类型并选择对应消息MSG是消息接口 caseMsg.TANK_NEW_MSG: msg=newTankMsg(NetClient.this.tc);System.out.println("tank新加入"); msg.parse(dis); break; caseMsg.TANK_MOVE_MSG: msg=newTankMoveMsg(NetClient.this.tc);System.out.println("tank移动"); msg.parse(dis); break; caseMsg.MISSILE_NEW_MSG: msg=newMissileMsg(NetClient.this.tc);System.out.println("子弹加入"); msg.parse(dis); break; caseMsg.TANK_DEAD_MSG: msg=newMissileMsg(NetClient.this.tc); msg.parse(dis);System.out.println("一个坦克死去"); break; caseMsg.MISSILE_DEAD_MSG: msg=newMissileMsg(NetClient.this.tc); msg.parse(dis);System.out.println("一个子弹死去"); break; caseMsg.LINUX_MSG: msg=newLinuxMsg(NetClient.this.tc); msg.parse(dis); break; } } } 3.4TankWar传递消息分析 定义了消息接口,实现消息的类别,消息的封装,消息的解析统一。 让NetClient.java调用实现该消息的接口的类进行通讯。 图3.4一个坦克移动消息数据包的内容 publicinterfaceMsg{ publicstaticfinalintTANK_NEW_MSG=1; publicstaticfinalintTANK_MOVE_MSG=2; publicstaticfinalintMISSILE_NEW_MSG=3; publicstaticfinalintTANK_DEAD_MSG=4; publicstaticfinalintMISSILE_DEAD_MSG=5; publicstaticfinalintLINUX_MSG=6; publicvoidsend(DatagramSocketds,StringIP,intudpPort); publicvoidparse(DataInputStreamdis); } 3.5TankWar运行和调试 所有代码开发完毕后,部署好资源,进行游戏的测试。 一下为游戏的运行过程。 图3.5在linux下运行服务端程序 运行服务端程序后客服端就可以连接服务器进行网络对战。 享受坦克小游戏无限的乐趣。 当客服端运行时需要填写你要的坦克信息。 这样对战时,就有角色的区别,享受团队作战的乐趣。 图3.6客服端运行时,填写坦克信息 图3.7客服端和服务器端建立连接后游戏开始 图3.8多个客服端加入游戏 图3.9多个客服端进行团队作战 图3.10一个客服端被击毙发生的爆炸 图3.11服务器后台的显示的数据包信息 5结束语 对于此次课程设计我感慨颇多,的确,从拿到题目到完成整个服务器配置,从理论到实践,在整整两个星期的日子里,学到的很多理论知识,在这次课程设计实习中更具体的体现了出来,在实践过程中,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学到的理论知识与实践相结合起来,从理论中得出结论,将结论辅助与理论,才能真正学到知识并写出有用的程序,所以提高自己的实际动手能力和独立思考的能力是十分重要的。 在设计的过程中遇到很多的问题,可以说得是困难重重,由于对以前所学过的知识理解得不够深刻,掌握得不够牢固。 导致自己在服务器程中经常出错,致使无法实现要求的步骤。 还有很多是些小问题,这都是由于我粗心大意而造成的,所以我认识到做任何事一定要仔细,容不得丝毫的马虎和粗心大意。 当然还有其他的问题,尤其是关于上机的操作,是我们最大的问题,不过,经过老师的讲解和改错之后,也开始懂得配置和运用了。 参考文献 [1]李政于.Liunx系统管理与服务器配置[M].北京: 人民邮电出版社,2003. [2]邓延.liunx应用实例详解[M].内蒙古: 内蒙古人民出版社,2004 [3]文东戈,孙昌立,王旭.Linux操作系统使用教程[M].北京: 清华大学出版社,2009 附录: 源程序清单 //程序名称: linux开发游戏 //程序作者: 王浩 //最后修改日期: 2011-03-15 //tank.java importjava.awt.Color; importjava.awt.Graphics; importjava.awt.Rectangle; importjava.awt.event.KeyEvent; importjava.util.Random; publicclassTank{ TankClienttc;//持有对象引用 booleangood;//好坏 intID;//坦克ID Stringname;//坦克名字 intMissileID=0; intx;//x坐标 inty;//y坐标 publicstaticfinalintXSPEED=10;//x方向运行速度 publicstaticfinalintYSPEED=10;//y方向运行速度 publicstaticfinalintWIDTH=30;//坦克宽度 publicstaticfinalintHEIGHT=30;//坦克长度 privatebooleanlive=true;//坦克生存状态 privatestaticRandomr=newRandom();//随机生成坐标和方向 privateintstep=r.nextInt(12)+3; booleanbL=false;//方向按钮的判断 booleanbU=false; booleanbR=false; booleanbD=false; Dirolddir;//定义DIR8个方向一个静止状态见枚举类Dir.java Dirdir=Dir.STOP; privateDirptdir=Dir.R; publicTank(intx,inty,booleangood){//初始化坦克 this.x=x; this.y=y; this.good=good; } publicTank(intx,inty,booleangood,Dirdir,Stringname,TankClienttc){ this(x,y,good); this.tc=tc; this.dir=dir; this.name=name; } publicvoidDrawTank(Graphicsg){//坦克的画笔供TankClient.paint()方法调用 if(! live){ if(! good)//如果坦克死去就从坦克列表中删除 tc.enemyTank.remove(this); return; } Colorc=g.getColor();//以下是画坦克方法两边是2个矩形加中间一个矩形在加中间一个点加炮筒 if(good)g.setColor(Color.green); else g.setColor(Color.ORANGE);//左右方向是坦克状态 if(this.dir==Dir.U||this.dir==Dir.D||(this.dir==Dir.STOP&&(olddir==Dir.U||olddir==Dir.D))){ //1.画出左边的矩形 g.fill3DRect(x,y,5,30,false); //2.画出右边的矩形 g.fill3DRect(x+15,y,5,30,false); //3.画出中间的矩形 g.fill3DRect(x+5,y+5,10,20,false); //4.画圆 g.fillOval(x+5,y+10,10,10); // } else{//上下方向是坦克状态 //1.画出上边的矩形 g.fill3DRect(x,y,30,5,false); //2.画出下边的矩形 g.fill3DRect(x,y+13,30,5,false);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 课程设计