最新毕业设计论文单击对战游戏的设计与实现可编辑文档下载.docx
- 文档编号:5726719
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:22
- 大小:86.87KB
最新毕业设计论文单击对战游戏的设计与实现可编辑文档下载.docx
《最新毕业设计论文单击对战游戏的设计与实现可编辑文档下载.docx》由会员分享,可在线阅读,更多相关《最新毕业设计论文单击对战游戏的设计与实现可编辑文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
最新毕业设计论文单击对战游戏的设计与实现可编辑文档下载
目录
摘要1
关键字1
1前言1
1.1程序开发背景1
1.2程序开发目标1
1.3编码设计标准与规范2
1.4程序开发的实际意义2
1.5对“单击对战”的解释3
2相关软件及技术介绍3
2.1开发平台与工具选择3
2.1.1.NET简介3
2.1.2MicrosoftVisualStudio2008简介3
2.2相关技术简介3
2.2.1使用UDP协议的套接字技术3
2.2.2使用TCP协议的套接字技术3
2.2.3Socket方法和相关类介绍4
2.2.4多线程的使用4
2.2.5事件的使用4
2.2.6反射调用一个类的私有成员4
3可行性分析与需求分析4
3.1可行性分析4
3.2需求分析5
3.2.1功能需求5
4单击对战游戏设计5
4.1系统设计思想5
4.2系统总体设计5
5主要功能详细设计6
5.1在线用户列表的获得6
5.1.1设计思路6
5.1.2实现过程6
5.2进入对战窗体的友好用户体验9
5.2.1设计思路9
5.2.2关键代码9
5.3五子棋对战窗体功能12
5.3.1设计思路12
5.3.2关键代码12
6系统测试15
6.1测试分析报告15
6.2.1测试方式简介15
6.2改进意见15
7结束语15
致谢15
参考文献15
单击对战游戏的设计与实现
计算机科学与技术专业学生
指导教师
摘要:
系统是基于.NET平台开发的一个P2P结构的单击对战五子棋游戏。
基于P2P、套接字、事件、设计模式、多线程、反射等技术,使用c#语言和UDP协议的套接字进行广播,不但可以实现在局域网内获得所有在线用户IP列表、状态的功能,而且通过使用TCP协议的套接字可以实现多个用户之间的连接、游戏、聊天、并闪动对方屏幕的功能。
以计算机技术和网络技术为核心的现代网络技术已在现实生活和生产中得以广泛的使用,休闲类网络游戏集趣味性、娱乐性、互动性和益智性于一体,已经成为多数人群的休闲方式。
关键字:
P2P;UDP广播;TCP协议;设计模式;事件
1前言
1.1程序开发背景
随着计算机信息技术的发展,网络游戏已成为我们生活中的重要组成部分,但由于广域网游戏占用的资源较多、易受到病毒等缺点,所以局域网游戏被游戏爱好者广泛使用。
无论是对于初步探索网络编程的编程爱好者还是有志于在物联网方面发展的程序员,编写简单的局域网游戏都是一个很好开始。
网络游戏在市面上已经出现多年,许多游戏对战平台也已相继出现,例如我们熟知的浩方、QQ对战平台和街机游戏的ArcadeLive平台等等,虽说它们有很大的不同,但有一点是可以肯定的:
不管是这些游戏还是对战平台,刚开始都是需要在局域网内调试的。
然而,出于盈利的目的,开发商一般不会将对战平台的局域网内的版本流于市面,更不会公开自己的原代码。
当然通过一些人士的分析和透露,我们知道浩方是通过把tcp/ip协议转换为ipx协议。
虚拟局域网,为大家提供了一个作战平台,但游戏开始后,玩家之间就是p2p的关系了,游戏速度和平台无关。
但具体的实现肯定是很困难的,里面至少涉及hook,P2P,VPN,修改数据包,java或C++的网络编程,进程通信,数据库的操作等等。
当然一些大型游戏里面内置了网络连接模块,在局域网内是不需要再通过平台完成数据通信的。
但对于一些单机游戏,要想完成局域网内的对战,对战平台就不可或缺了。
这方面ArcadeLive是比较有代表性的,它的联网功能可能是靠"kaillera"来实现的,要想实现联网玩游戏,你必须有一个kaillera的客户端和一个服务器端的程序,客户端现在大多在模拟器中自带,而服务器端则是一个单独的程序。
总之网络联机模块的技术发展还是很成熟的,但由于开发商的保密,很多技术难题还是要自己解决的。
1.2程序开发目标
拟开发基于p2p具有运用时自动加载在线用户IP列表、双击某个IP或头像自动进入五子棋游戏,并且用户体验很好的程序。
该程序无需服务器端,也就是说每个程序实例既是服务端也是客户端,也就是常被我们提及的p2p。
运行程序时通过广播特定的信息使所有在线的用户获得自己的IP然后添加到自己的用户列表上,收到此特定信息的用户回复另一信息,然后就可以实现所有的人获得在线用户IP的功能。
游戏是逐渐被世人抛弃的起源于中国古代的传统黑白棋种之一的五子棋,虽然它看似无聊,但对于练习编程技术还是很有意义的。
本程序中的五子棋使用TCP协议的套接字进行通讯,广泛应用了事件机制,接收到我们自定义的信息后就会根据以至的信息头作出相关的反映。
众所周之,网络游戏会因为种种原因出现延迟,使用户持续等待甚至出现卡死的情况,本程序尽最大的努力提高用户体验的舒适性,即尽量不发生卡的情况。
1.3编码设计标准与规范
为了在编码过程中,能够快速地、有效地阅读,我们有必要为对象约定一个规范的编码命名约定。
(1).对象命名约定
下面为在编码过程中会用到的对象统一的命名,如下表1所示:
对象名
命名约定(前缀码)
Form
Frm
TextBox
txt
PictureBox
pic
Panle
pnl
Lable
lbl
TextBox
txt
TreeView
tv
表1对象统一的命名
(2).结构化编码约定
编码风格参照下例进行:
boolstartListen=false;
publicboolCanAgin,CanAgins,CanDown,IFirst;
privateSocketsocketListerner;
privateThreadmainThread;
publicClientRoleclientConnectionRole=newClientRole();
在程序中,对一些比较难懂,或是属性不熟悉的地方加上必要的文字说明,其次,程序要有层次,使得读程序时更易读懂。
1.4程序开发的实际意义
对于数据的通信,我们比较熟悉的有Tcp/Ip协议、UDP协议等等。
以UDP协议为例,UDP从应用程序接过报文后,附上目的端口号、源端口号和其他两个小字段后就直接将结果段递交给网络层。
网络层将该段封装到数据报中后,尽力而为地将数据包传递给接收端主机。
如果数据报到达接收端主机,UPD将根据IP地址和两个端口号将段中的数据交给相应的进程。
本程序中的用户列表的维护就是利用使用UDP协议的Socket发送广播进行获得。
然而鉴于UDP协议的无连接特点,丢失数据包的可能性也很大的,所以当进入游戏窗体后,真正负责通讯的采用了TCP协议的套接字进行通讯,也就是说,UDP协议那个套接字只负责维护列表。
本程序中的游戏是人气很旺的网络五子棋,选择它的原因很简单:
简单直接,不会上瘾,算法简单,易于实现。
本程序的可扩展性强,程序员可以根据自己的要求将基于TCP的Socket也提到一个类中,然后通过存放到一个以远程端点为Key相应连接套接字为Value的Dictionary中,以实现和多人对战的要求。
当然也可以利用反射将游戏程序编译成一个类,然后放到一个特定文件夹下,当主窗体运行时,自动加载。
除此之外,对于网络编程的初学者也是很有帮助的。
1.5对“单击对战”的解释
本程序采用p2p的架构,即集服务端和客户端的功能于一体,整个设计采用事件驱动,所以非常方便实现。
之所以叫做“单机对战游戏的设计与实现”,主要是内嵌的游戏是五子棋游戏,它在用户体验上的感觉基本就是单击鼠标,没有太多别的负责的操作,很是适合小朋友或是老年人玩。
2相关软件及技术介绍
2.1开发平台与工具选择
2.1.1.NET简介.NET的编程模型将开发语言和运行时平台分离,实现了独立与语言的组件技术,通过不同的运行平台,.NET应用可以被扩展到PC、PDA、手机和嵌入式设备上。
.NET运行平台称为.NETFramework,是.NET平台的基础框架,它创造了一个完全可操控的安全的和特性丰富的应用执行环境,这不但使得应用程序的开发与发布更加简单,并且实现了众多语言的无缝连接。
2.1.2MicrosoftVisualStudio2008简介为了开发.NET的应用,微软推出了强大的.NET开发工具VisualStudio.NET(以下简称VS)作为微软.NET战略的重要组成部分。
VS包含C#、VisualBasic.NET、Visualc++.NET等多个开发语言,同时还为第三方语言工具商提供了接口,只要支持CLS(CommonLanguageSpecification)的语言都可以集成到VS环境中。
VS充分发挥了CLR的潜力,为开发者提供了一个统一的集成开发环境和调试器。
由于采用统一的类型定义和共享类库,各语言不仅在运行时,而且在设计就可以实现对象级交互。
VS不仅提供了WebServices开发工具,而且提供从WebServices开发到发布、注册、整合的全过程支持。
为创建和部署WebServices,.Net平台采用了一系列的互联网协议,如XML、SOAP、WSDL、UDDL等用于WebServices的部署、请求和响应。
软件人员最关心的还是开发效率的提高,VS人性化的界面和众多工具将成倍提高开发效率。
无论针对传统的Windows桌面开发,WebServices,开发人员都不必在为每种不用的应用重写全部代码,不必为不同的客户设备定制不同的界面。
2.2相关技术简介
2.2.1使用UDP协议的套接字技术数据报式Socket(DATAGRAM)是一种无连接的Socket,对应于无连接的UDP服务应用.不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高。
使用UDP协议的套接字可以用来向许多系统支持的网络发送广播数据包。
要实现这种功能,网络本身必须支持广播功能,因为系统软件并不提供对广播功能的任何模拟。
广播信息将会给网络造成极重的负担,因为它们要求网络上的每台主机都为它们服务,所以发送广播数据包的能力被限制于那些用显式标记了允许广播的套接字中。
广播通常是为了如下两个原因而使用的:
1.一个应用程序希望在本地网络中找到一个资源,而应用程序对该资源的地址又没有任何先验的知识。
2.一些重要的功能,例如路由要求把它们的信息发送给所有可以找到的本网段的主机。
被广播信息的目的地址取决于这一信息将在何种网络上广播。
本程序中利用基于UDP协议的套接字向广播地址255.255.255.255发送广播的方式以获得用户列表。
2.2.2使用TCP协议的套接字技术本程序中的游戏部分使用的是的TCP协议的套接字进行通讯。
众所周之流式Socket(STREAM)是一种面向连接的Socket,针对于面向连接的TCP服务应用,虽然效率低但由于其安全特性被广泛使用。
某一个棋子的位置很可能关系到游戏的胜败,所以使用TCP协议的套接字就可以避免丢包等问题。
2.2.3Socket方法和相关类介绍
--------------------方法------------------------------
Socket():
创建一个Socket
Bind():
绑定一个本地的IP和端口号(IPEndPoint)
Listen():
让Socket侦听传入的连接尝试,并指定侦听队列容量
Connect():
初始化与另一个Socket的连接
Accept():
接收连接并返回一个新的socket
Send():
输出数据到Socket
Receive():
从Socket中读取数据
Close():
关闭Socket(销毁连接)
------------------相关类--------------------------
IPAddress类:
包含了一个IP地址
IPEndPoint类:
包含了一对IP地址和端口号
2.2.4多线程的使用应用多线程技术最大的误区在于没有分清适合的情况就盲目地使用多线程。
除非运行一个多处理器计算机,否则在CPU密集的任务中使用两个线程不能节省多少时间,理解这一点很重要。
在单处理器计算机上,让两个线程同时进行100万次运算所花的时间与让一个线程进行200万次运算是相同的,甚至使用两个线程所用的的时间更长,因为要处理另一个线程操作系统必须用一定的事件切换线程,即分配时间片。
使用线程带来的负面因素是必须额外考虑线程的并发、同步等线程安全问题,从而使得程序更加复杂而难以维护。
然而,有些场合则使用多线程技术非常合适,网络应用开发就是其经常出现的场合之一。
当一个线程等待从网络中获取数据,同时其他线程可以继续处理其他的任务,此时可以节省很多时间。
本程序中主要就是在针对Accept和Receive这两个会阻塞的方法使用多线程。
2.2.5事件的使用由于不知道什么时候会有人发送信息给自己,所以程序中应用事件来处理对方的消息,即监听对方发送的消息,如果接受到的消息和自己要处理的一致,则执行注册在其上的方法。
例如,A上线的时候,就会向广播地址发送“Logon”消息,已经在线上的B、C收到此消息后就行执行自定义的OnGetList事件,然后此事件调用注册在自己身上的GetListMethod方法,从而实现将A的IP地址加到自己的用户列表上的功能。
2.2.6反射调用一个类的私有成员当用户进入对战窗体后,主窗体的用户列表不可用,即一次只能和一个用户进行游戏,(这只是我个人规定)。
当用户退出对战窗体后,必须要求主窗体的用户列表重新可用,但我们注意到,窗体类的TreeView类型字段默认是private,也就是其它类不可访问的,当然我们可以将其改成internal或更加访问级别使外界可以访问。
但我们有更专业的手段:
利用反射技术。
.NET的一个反编译工具Reflector就是利用发射实现的。
3可行性分析与需求分析
3.1可行性分析
在很早以前五子棋软件就已经被开发出来了,当时的五子棋软件仅提供了“人机模式”与“双人模式”。
“人机模式”是指,人与计算机进行对弈,计算机按照事先编写好的算法程序来进行下棋;“双人模式”是指,两个人通过交替使用同一台计算机来进行下棋。
无论是选择哪一种模式,所有的操作都必须在同一台计算机上来往完成,棋局无法在异地计算机之间来进行,故而也叫单机版五子棋软件。
3.2需求分析
软件的需求分析是软件生存期中重要的一步,也是决定性的一步。
只有通过需求分析才能把软件功能和性能的总体概念描述为具体的软件需求规格说明,从而奠定软件开发的基础。
在此阶段,了解用户要求本软件必须满足的所有功能和限制,以及用户对软件功能和性能的要求,弄清用户想要软件“做什么”,准确地表达用户的要求。
3.2.1功能需求
(1).运行游戏自动获得所有在线用户列表并且自己的IP加到所有其他在上用户玩家列表上的功能。
(2).显示请求对战提示框。
(3).进入对战窗体,其他用户无法再与其游戏。
(4).显示玩家退出提示框。
(5).能通过网络进行下棋。
(6).符合五子棋的基本规则。
(7).提供玩家之间的聊天功能。
(8).提供玩家之间闪屏功能。
(9).一个用户退出程序,所有在线用户列表中自动清除退出用户对应的IP。
(10).用户界面需求界面友好、亲切。
(11).界面简洁、不花哨。
(12).操作界面直观、不繁琐。
(13).用户体验良好。
4单击对战游戏设计
现有的网络编程模式主要分成两类:
一种是基于C/S(Client/Server客户机/服务器)模式,另一种是B/S(Browser/Server,浏览器/服务器)模式;C/S程序具有好的交互性,功能强大,但是客户端必须安装客户端软件,服务器端也要运行,限制了其应用;B/S模式下要求客户端具有浏览器,但浏览器在安全方面有一些限制,交互性与功能有一些限制。
由于这两种模式的种种弊端,单击对战游戏采用了p2p网络技术来设计与实现,网络内部使用UDP和TCP协议的Socket通过传输层提供的服务进行通讯。
4.1系统设计思想
主窗体运行时开启是一个基于UDP协议的套接字用户获得所在网段所用玩家的IP地址,双击一个IP进入对战窗体。
同时对方收到请求对战的提示框。
对战窗体通过一个socket监听其他用户的连接的连接,一旦有人连接连接,为该用户建立连接并启动一个特定的客户socket,利用该连接不断从客户读取数据,双方的交互。
4.2系统总体设计
系统流程图:
图1系统流程图
5主要功能详细设计
5.1在线用户列表的获得
5.1.1设计思路用户列表即在线用户的IP地址。
由于本程序使用的端口号为1817,所以一般情况下只需要知道本网段内所有运行了本程序的主机的IP就能实现要求。
选择广播是最简单且效率最高的手段,接下来考虑的就是应当使用什么协议的Socket进行广播。
因为只是获得列表是需要连接且要求效率较高,UDP显然在这里最适合。
5.1.2实现过程
界面设计
(1).新建一个空解决方案,命名为”GobangDemo”,在解决方案上右击添加一个“新建项目”,在出现的对话框上选择“Windows窗体应用程序”命名为“Gobang1”。
(2).将默认生成的窗体删除,添加一个“Windows窗体”并命名为FrmMain,将此窗体的FormBorderStyle属性设为none。
(3).拖入一个Panel控件,命名为pnlWrap,将它的Dock属性设为Full。
然后依次再拖入三个Panle,分别命名为pnlTop、pnlMain、pnlBelow,然后分别设置它们对应的BackgroundImage的值。
(4).拖入一个PictureBox控件,命名为picClose,然后设置Image属性以显示它默认的图片。
拖入一个ImageList控件,使用默认名字imageList1,在其Images属性中添加一个头像图片。
拖入一个ContextMenuStrip控件,使用默认命名contextMenuStrip1,然后添加“显示主界面”和“退出”两个子菜单。
拖入一个NotifyIcon控件,使用默认命名notifyIcon1,设置Visable属性为true,ContextMenuStrip属性为contextMenuStrip1。
(5).拖入一个TreeView控件,命名为tvPlayer,设值ImageList属性为imageList1,ImageIndex属性为0。
小结:
其实要实现一个漂亮的界面并不是什么复杂的问题,只要一张很好看的图片就可以,但一个好的编程习惯那就是将所有的控件都放到Panel中,所以就要将图片切成三段,然后设置成对应容器的背景颜色。
下面分别介绍各控件的具体作用:
notifyIcon1用于将程序图标显示系统托盘,picClose用于最小化到系统托盘,tvPlayer显示所有在线用户IP,imageList1里的图片作为用户列表中的头像,contextMenuStrip1作为notifyIcon1的菜单。
关键代码
(1).GetUserList类中发送UDP广播的方法SendToAll
publicvoidSendToAll(stringstate)
{
IPEndPointendPoint=newIPEndPoint(IPAddress.Parse("255.255.255.255"),port);
Byte[]sendBytes=Encoding.ASCII.GetBytes(state);
try
{
udpGetList.Send(sendBytes,sendBytes.Length,endPoint);
}
……
}
(2).GetUserList类中处理信息的方法GetList中接收来自局域网的信息:
IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,port);
while(true)
{
Byte[]receiveBytes=udpGetList.Receive(refRemoteIpEndPoint);
stringreturnData=Encoding.ASCII.GetString(receiveBytes);
//接下来判断收到的信息,然后作出相应的处理
……
}
处理“Logon”消息:
GetListEventArgsgetList=newGetListEventArgs();
getList.IP=RemoteIpEndPoint.Address.ToString();
getList.Msg=returnData;
OnGetList(this,getList);
IPEndPointendPoint=newIPEndPoint(IPAddress.Parse(getList.IP),port);
Byte[]sendBytes=Encoding.ASCII.GetBytes("Reply");
udpGetList.Send(sendBytes,sendBytes.Length,endPoint);
处理“Reply”消息:
GetListEventArgsgetList=newGetListEventArgs();
getList.IP=RemoteIpEndPoint.Address.ToString();
if(getList.IP!
=IPAddress.Loopback.ToString())
{
getList.Msg=returnData;
OnGetList(this,getList);
}
(3).使用到的事件
publiceventEventHandler
其中的GetListEventArgs是一个继承自EventArgs的自定义类:
publicclassGetListEventArgs:
EventArgs
{
publicstringMsg;//获得发过来的信息
publicstringIP;//获得对方IP,用于显示的主界面的用户列表上
}
(4).窗体类FrmMain的中的
TreeNodenode=newTreeNode();
node.Text=e.IP;
node.Tag=(object)e.IP;
foreach(TreeNodenintvPlayer.Nodes)
{
if(n.Text==node.Text||n.Text.Contains(node.Text))
{
return;
}
}
tvPlayer.Nodes.Add(node);
小结:
在p2p理念下,使用广播获得用户列表是目前为止我发现的最高效的实现手段。
可以看到只需向广播地址发送“Logon”信息,在线的所有用户都会接收到此信息,然后执行相应的代码,其中最重要的就是将发送此信息的用户的IP加到自己的tvPlayer中。
图2主界面
5.2进入对战窗体的友好用户体验
5.2.1设计思路IP为117.67.187.188的用户双
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 毕业设计 论文 单击 游戏 设计 实现 编辑 文档 下载
![提示](https://static.bdocx.com/images/bang_tan.gif)