基于Unity3D多平台网络斗地主的设计与实现毕业设计.docx
- 文档编号:14139385
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:60
- 大小:3.93MB
基于Unity3D多平台网络斗地主的设计与实现毕业设计.docx
《基于Unity3D多平台网络斗地主的设计与实现毕业设计.docx》由会员分享,可在线阅读,更多相关《基于Unity3D多平台网络斗地主的设计与实现毕业设计.docx(60页珍藏版)》请在冰点文库上搜索。
基于Unity3D多平台网络斗地主的设计与实现毕业设计
基于Unity3D多平台网络斗地主的设计与实现毕业设计
前言
近年来,随着科技和互联网的飞速发展、智能手机的迅速普以及性能的不断提升,游戏行业也突飞猛进,游戏已经逐渐成为人们公认的第九种艺术。
现在各个平台上的游戏逐渐涌现,从最初的红白机,到PC机再到XBox平台发展到如今的手机移动平台,从端游到页游再到手游甚至是体感游戏等表现形式也逐渐丰富,当然成功的也数不胜数。
比较大型的游戏有:
反恐精英、星际争霸、使命召唤,生化危机等。
当然也涌现了诸多经典的网络小游戏,比如麻将、拖拉机、中国象棋等。
此外手机游戏,如愤怒的小鸟、保卫萝卜、FlappyBird、切水果、捕鱼达人等也赢得许多人的青睐。
这些各种各样形式的游戏给如今生活在网络时代的人们带来了无限的生活乐趣。
斗地主是一款相当经典的游戏,当然前人也做了不少版本,有移动端,pc端甚至是Web端的。
可能他们在设计的过程中只是正对某一平台然后使用特性的开发技术来开发,这样的话如果想要实现多平台的设计就需要极大的时间成本和劳力成本。
而Unity3D引擎的问世,最大的解决了这一问题,它能够实现一次开发多平台发布的特点,这也是为什么Unity3D引擎在短暂的时间里能够发展的如此迅速的原因。
将斗地主游戏从单机版到网络化,使得现实中的多个玩家能够在同一个虚拟房间里面进行对局,并且能够实时的聊天,同时还不会受到平台的限制,你可以选择pc,web或者是移动端,从而能更好的体验游戏,娱乐生活。
第1章概述
1.1系统开发背景
随着Unity3D引擎的横空出世,游戏开发技术也变得越来越成熟,这款引擎也逐渐改变了整个游戏圈的开发格局,之前火遍了全球的神庙逃亡就是基于Unity引擎开发的一款比较成功的手游大作,这也更很好的证明了Unity作为一款游戏引擎还是值得开发者的信赖。
Unity相比较之前大家都熟悉的Unreal虚幻引擎,我认为Unity做的更好,它最值得人称赞的就是它的跨平台性是其他游戏引擎无法匹敌的,Unity能够做到一次编写多平台发布,能够大大节省了项目开发周期以及开发成本,并且还得够达到Unreal虚幻引擎开发出的那种游戏体验效果。
Unity开发也算是基于.NET平台上的一个拓展,它的内核是Mono框架,而Mono是基于.NET的一个跨平台的继承开发环境,它能够很好的移植到各个平台,所以Mono的问世也给广大.NET平台开发者带来了福音,终于不会在收到微软的约束,开发出来的东西只能运行在windows平台。
正因为这样,Unity也是一致收到广大.NET开发者的喜爱。
发展至今Unity已经支持了基本国内外所有的主流平台。
也正是因为这一特性,才使得更多的公司更多的开发者对它抛出了橄榄枝,达到了开发出来的游戏,不要受平台的限制,能够给玩家更多不同的平台体验,它的这一特性也推动了Unity引擎的飞速发展。
结合自身的优势,由于我大学期间一直自学的.NET开发,所以还是有一定的.NET开发基础和经验,加上喜欢钻研,学习了其他Android、IOS等移动平台开发,所以了解的技术范围还比较广泛,感觉做Unity开发能将我所了解的这些多平台开发的知识能够很好的融会起来,所以当第一时间了解到Unity之后,我就对它产生了浓厚的兴趣。
之所以选择做斗地主游戏,因为首先我觉得它是一款比较经典的游戏,经典的往往能够是永恒的,在日常生活中,斗地主也常常是人们娱乐的一个项目之一,当然想完成它还是有一定的难度,设计都不少的算法,并且我将其网络化,开发起来对我而言还是有一定的挑战性,但又不是力所不能及,只要努力一下还是能实现的。
因此就确定了这个多平台的多人网络斗地主的课题。
1.2设计的目的
从玩家的角度,这种网络小游戏满足了玩家休闲的需求,让玩家换一种方式重温经典,能够在不同的平台,不同的的地区,还能够在同一个“房间”进行对局,也可以实时交流,也能结识更多的朋友,增加了游戏体验的乐趣,从而丰富了人们的业余生活,在紧张的工作之余带给人们最大程度的放松。
从自身的角度,将大学所学的理论知识应用于真实的项目开发,做到了理论与相结合,理论知识指导实际操作,实际操作反过来也巩固了理论知识,从而更好的提升了自己的能力和项目经验。
1.3设计的意义
通过亲自实践,验证了Unity3D引擎的跨平台性,也系统的了解到一个游戏项目设计的整个流程,从最初的规划到最后的实现,为今后走上工作岗位打下基础。
最后能够圆满实现,锻炼了自己的能力,同时做出来的游戏也增加了人们业余生活的乐趣。
第2章开发环境及相关技术介绍
2.1开发环境介绍
所谓工欲善其事,必先利其器。
要做一个项目的开发,首先得选择好合适的开发工具,市场上行行色色的开发工具很多,这就需要要对比选择,根据项目需求选择最佳的搭配工具。
本设计采用的开发环境是Windows7旗舰版操作系统,搭载Unity3D4.2.0f1专业版引擎。
采用VisualStdio2010IDE编辑C#脚本。
2.1.1Unity3D简介
Unity是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。
Unity能够运行在Windows和MacOSX系统下,可发布游戏至Windows、Mac、Wii、iPhone、Windowsphone8和Android等平台。
也可以利用Unitywebplayer插件发布网页游戏。
Unity具有强大的脚本系统,它的核心思想是面向对象,把游戏场景中有所的物体都抽象成可编程的对象,从而将游戏编程转化为游戏对象的控制和调度,而控制游戏对象和对象调度的就是我们所说的脚本系统,关系图如下(图2-1):
图2-1Unity脚本系统
2.1.2VisualStdio2010和MonoDevelop
VisualStdio作为微软最引以为傲的集成开发环境,敏捷的智能提示、排版以及稳定的性能,是任何语言的IDE都无法比拟的。
因此C#语言开发,当然首选VisualStdio。
但是VisualStdio不支持Unity的Debug(调试),必须要到AssetStore(Unity的插件商量)去购买一个UnityVS插件才能够实现断点调试功能。
而MonoDevelop是基于.NET的一个跨平台的集成开发环境,主要支持的语言也是C#。
Mono作为.NET向跨平台和开源的先驱,它打破了微软一惯封闭的风格,因此Mono也得到了业界的广大好评和重视。
MonoDevelop是Unity自带的集成开发环境,相比较VS的优势就是能够不依赖插件从而实现断点调试,还有就是能够在其他平台上运行,但是它也有弊端,没有VS那么强大的提示功能,对中文支持也不够友好,可以说这两个IDE来编辑Unity脚本个有利弊,看如何取舍,一般都是选择前者。
2.1.3Xcode简介
Xcode是苹果公司向开发人员提供的集成开发环境,用于开发MacOSX,iOS的应用程序,Xcode具有较强的编译速度。
Unity导出IOS程序的时候需要导出Xcode工程,然后由Xcode编译导出发布,当然还需要申请安装苹果开发官方的开发者证书。
文章最后在介绍Unity工程导出成IOS版本安装到ios移动设备上会详细介绍流程以及注意事项。
2.2C#语言和Javascript脚本
这两者都是Unity开发支持的语言,当然还包括boo脚本,但一般不怎么用boo脚本作为开发语言,前两者语言,C#国内人用的比较多,Javascript国外开发者用的比较多,接下来我们就做一个对比,这两种语言开发Unity有什么异同。
在这里,因为Unity是基于.NET平台,而C#是.NET平台主推的语言,因此我就选择了C#,能够更好的兼容.NET的一些库文件。
2.2.1C#语言
C#是微软公司再2000年6月发布的一种全新的且简单、安全、面向对象的程序设计语言,是专门为.NET应用开发而诞生的一种新的计算机语言。
它吸收了C++、VisualBasic、java等语言面向对象的特性,又继承了C语言的语法简约的风格,体现了当今最新的程序设计技术的功能和精华。
不同的是,C#面向对象模型已经面向了Internet进行了重新设计,它使用的是.NET框架的类库,为了安全起见不再主张指针类型的使用,当然也是可以使用指针,在程序中要做特殊申明。
对指针使用的弱化,避免了程序异常访问系统内存地址而带来的隐患,从而更体现了它的健壮性的特点。
C#不支持多继承,避免了以往类层次结构中由于多重继承带来的难以控制的特点,C#主张用接口来实现而不是多继承,主要的目的就是减少程序的复杂性,减少出错的可能性,使运行效率更高。
.NET框架为C#提供了一个强大的、易用的、逻辑结构一直的设计环境。
同时,公共运行时(CommonLanguageRuntime)为C#语言提供了一个托管的运行环境,使程序比以往更加稳定、安全。
C#语言的特点有:
.语言简洁优雅、安全稳定
.保留了C++面向对象的特性
.能够快速开发应用
.强大的开发控件
.支持跨平台
2.2.2Javascript语言
Javascript是一种直译式、动态、弱类型、基于原型的脚本语言,内置支持类。
它的直译器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。
Javascript语言的特点:
.简单性
.动态性
.跨平台性
.安全性
2.3IOCP框架简介
IOCP全称I/OCompletionPort,IOCP模型属于一种通讯模型,适用于(能控制并发执行的)高负载服务器的一种技术,基于IOCP通信的的服务器是以多线程的方式实现了与多个客户的消息并发交互,可以合理有效的处理客户端端的消息,可以使得系统内存资源得以合理的利用,有效的解决了因多线程竞争所带来的问题。
2.3.1IOCP内部工作队列图
如下图2-2(源于IOCP本质论),简节明了的看出IOCP本质其实就是创建一个线程池然后内部是以队列和栈的方式来处理客户端交互请求。
图2-2IOCP内部工作队列图
2.3.2程序实现IOCP模型的基本步骤
如下图(2-3),最重要的步骤还是创建了线程池来管理大量线程的切换处理从而提高了服务器端的性能。
图2-3程序实现IOCP模型步骤
2.3.3使用IOCP模型和不使用IOCP模型通讯的对比
对比图如下(图2-4),很明显能看出不一样的地方,不适用IOCP,用普通的socket连接,我做过测试,对服务器内存资源消耗比较大,貌似上百多个客户端连接之后服务器端就容易崩溃,内存发出警报,健壮性是服务器端程序首当要考虑的,而测试使用IOCP模型的客户端能够达到2K-3K左右的稳定连接,并且内存资源消耗还比较小,下文测试章节会有具体的截图。
图2-4使用IOCP和不使用IOCP框架通讯对比
2.4本章小结
本章主要介绍了开发Unity游戏所需要的脚本语言以及开发环境。
之所以选择C#而非js是因为C#语言更面向对象和具备一些高级的特性(封装,继承,多态,反射和泛型等),它也是国内的主流开发语言之一,而Javascript相对比较容易入门,语言本身是弱类型不需要那么严谨,在实际商业项目开发中不是太收推崇。
因此本次设计以C#语言编写,同时采用MonoDevelop4.0调试和VisualStdio2010集成开发环境。
服务器端基于IOCP模型搭建的比较稳定、高效、健壮的服务器应用程序。
第3章系统需求分析
3.1用户功能需求分析
系统是由登录,叫地主,出牌,压牌,判断胜负,用户奖惩机制,实时聊天,退出等功能组成。
该斗地主是根据民间盛行的扑克牌游戏演变而来,融入了现代电子游戏快捷便利,能更好的满足玩家的游戏体验以及提升业余生活的乐趣,达到缓解压力的效果。
3.2系统性能要求
系统必须稳定安全,对异常处理要做的比较完善,首先确保的是服务器端的稳定高效的运行,服务器采用的收费阿里云服务器,里面承载的是经典的windowsserver2003服务器系统,然后服务器端采用的是IOCP框架用Winform应用形式呈现出来。
3.3可行性分析
我将从以下几点分析该设计的可行性:
(1)经济上的可行性
考虑到是多人在线网络斗地主,而非仅局限于局域网的范围,因此就必须有一个稳定的外网服务器,目前我在公司管理着公司用的阿里云服务器,因此我决定临时可以租用一下公司的云服务器,经济上是可行的。
(2)技术上的可行性
本系统不需要差大规模的计算和非常高的性能要求,可能需要处理一些中级一点的并发处理问题,对服务器端的性能还需要有一定考究,但不至于力所不能及,还有一些关于牌类的算法,例如洗牌算法,发牌算法,压牌算法等,但通过自己的思考相信也应该是可行的。
(3)资源可行性
虽然没有美工做配合,但网上搜集一些简单的免费的图片还是能够找到,可能效果不是非常的理想,但从程序实现的角度,基本能达到预期的要求,如果以后想要完善,可以找专门的美工做好图片然后进行替代即可。
(4)游戏可玩性
玩家可以通过设置用户名进行登录进游戏大厅进行多人对战,如果还想要做的完善一些可以专门接入腾讯或者新浪微博的sdk,用专用的账号登录或者是普通注册即可,用户也可对其个人信息进行修改。
第4章总体方案设计
4.1纸牌设计
4.1.1牌型设计
总所周知,一张纸牌是由数字、花色、背面所组成,在设计游戏之前先设计出一副牌的所有模板,这里列举一些部分牌的截图(图4-1):
图4-1牌型
搜集出一整副牌的图片,然后程序里就可以通过代码来调用显示到界面。
4.1.2出牌类型(游戏规则)设计
出牌类型有很多种,包括:
单牌、一对、三张、三带一对、四张一样(炸弹)、王炸(大小王)、三连对、飞机等,详细游戏规则可以参考附录A。
4.2C/S模式
C/S(Client/Server,客户机/服务器)结构,是大家熟知的客户机和服务器结构。
它是软件系统体系结构的一种。
主要是由客户端应用程序(Client)和服务器端程序(Server)以及中间件(middle)三个部件组成。
客户端应用程序是是系统中用户跟服务器进行数据的交互的部件。
服务器端程序负责有效个管理系统资源,处理多个客户端连接请求以及跟多个客户端进行数据交互。
4.2.1基于C/S模式的服务器端设计流程图
服务器端处理客户端连接流程,参见下图(图4-2)
图4-2服务器端处理流程
4.2.2基于C/S模式的客户端设计流程图
客户端连接服务器流程,参见下图(图4-3)
图4-3客户端连接流程
4.3游戏逻辑程序结构
本设计的程序结构包括三个层次(数据层,控制层,显示层),也就是常用的MVC模式。
MVC的可移植性,代码逻辑比较清晰,耦合度也比较低,在代码重构和结构方面比较有优势。
4.3.1数据层
(1)通过socket获取byte[]流数据并解析成对应的Model实体。
(2)创建存储Model实体数据的数据结构(全局单列类,静态类)。
(3)通过数据构造byte[]流并通过socket发送到远端。
通过socket从远端获取其他玩家的状态(包括在线状态、出牌状态、手牌状态等)。
4.3.2控制层
(1)通过事件机制获取到现在需要进行的操作。
(2)通过数据层提供的方法或者接口获取相关数据并进行相应处理。
(3)处理结果返回给事件发起者或存入游戏状态管理机。
主表表现在对牌的控制,例如叫地主,出牌,压牌,以及游戏的状态控制等逻辑操作。
4.3.3显示层
(1)通过数据计算出游戏物体在游戏世界中的位置
(2)播放声音这类的元素
(3)获取游戏对象
主要就是控制游戏场景显示。
4.4游戏设计流程图
游戏设计思路大概流程图,参见下图(图4-4)
图4-4客户端连接流程
4.5数学建模
数学建模是一种数学的思考方法,是运用数学的语言和方法,通过抽象、简化简历能近似刻画并“解决”实际问题的一种强有力的数学手段。
斗地主游戏是属于经典的棋牌类游戏中的一种,在进行这个游戏开发的之前,就需要对其进行一个建模,将抽象的游戏将其形象化数字化的表现出来。
扑克牌类的游戏,每一张纸牌都有一些非常重要的属性值,那就是牌面上数值的大小以及它的花色类型。
总所周知,一副扑克牌有54张(包含大小王)。
那我们可以将其抽象成0-53与之一一对应的54个数值,这样就将抽象的牌类比较形象的转化成数值的比较。
我们规定一一对应的数值关系:
●方块A、方块2...方块K——0,1...12
●黑桃A、黑桃2...黑桃K——13,14...25
●红桃A、红桃2...红桃K——26,27...38
●梅花A、梅花2...梅花K——39,40...51
●小王、大王——52,53
单张牌大小关系:
大王>小王>2>A>K>Q...>4>3
假设我们要进行两张单拍的大小比较的时候,其实就是在比较两个整形数字的“大小”,例如:
黑桃3VS方块4,就是比较15和3的“大小”,但并非就是两个整形数字的直接大小比较,因为我们知道斗地主游戏中牌的大小比较不需要考虑花色,只需要关心牌面上的数值大小即可。
所以设计中对纸牌的一系列操作,形象简单点点说就是对一个整型数组的操作。
上面的两个牌面大小比较方法是15%13=2,2<4,所以还是“4>15”,也就是方块4>黑桃3,这里注意一点的是牌型为A、2、大小王他们对应的数字要做特殊处理。
具体算法参见5.1。
我就是用这种数学建模的方法来达到化抽象为形象,将实际问题转化成数学问题来处理。
第5章详细设计与系统实现
5.1斗地主洗牌算法
做斗地主项目,洗牌算法是最基础也是最关键的一步,怎样“洗”的均匀,“洗”的随机,这是非常有考究的,算法的优劣直接会影响游戏效果的好坏,在平时生活真实的斗地主过程中,我们为了要确保牌洗的随机,我们就多洗几次,那么在程序设计中,我们可以用一个算法来模拟真实洗牌的过程。
我的做法是将0-53这54个数字直接先依次输入到数组中,然后不断的进行两个“牌”之间的位置对调,当然平时生活中洗牌跟折半插入算法非常接近,但我还是用相比较折半插入更随机的算法来实现洗牌效果。
大体算法思路,详细代码请参照附录B的1算法(斗地主洗牌算法):
for(inti=0;i { data[Random(0,54)]与data[Random(0,54)]两位置上的值进行互换 } 效果图(图5-1): 图5-1洗牌算法效果图 MAX如果选择的越大,则说明交换的次数越多,随机性就越明显,这里我是选择的是MAX=54进行测试,看起来数值排列还是比较随机的,基本能达到预期效果。 5.2斗地主之“排序”算法 制作斗地主的时候,发完牌还有基础的又比较重要的步骤就是牌的排序,这里的排序并非指一般的整形数字通常的排序,扑克牌中每种花色的牌有13张,那我们就以13为基准,将0-53的数字先对其取13的余数,得到的数加1即是当前纸牌的数值,参照上面的定义0-12分别对应方块A-K,13-25对应的是黑桃A-K,26-38对应的是红桃A-K,9-51对应的是梅花A-K,然后由服务器端分配三份牌分别发给同一桌的三个玩家,但分完每一份17张牌必须进行一个排序,排序之后的手牌也方便玩家看牌,提高了游戏的可玩性。 大体算法思路,详细代码请参照附录B的2算法(斗地主排序算法): 先封装一个数字对应牌值的算法,主要就是通过整除和求余来判断是什么花色然后是什么花色和什么牌值,对大小王和A、J、Q、K要做特殊判断处理。 程序运行效果图: 效果图(5-2): 图5-2"排序"算法效果图 5.3基于IOCP的Socket通讯 既然是网络游戏,那么就不得不谈一谈Socket通讯,C#版的Socket是Microsoft.NetFramework为应用程序访问Internet提供的网络通讯类库。 通讯的原理是服务器端打开本地ip上的某个特定端口,然后不断的进行监听客户端的连接请求,然后做出响应的处理,简单的流程如下图(5-3),代码请参见附录B的3: 图5-3Socket通讯流程图 其中SocketAsyncEventArgs是.NET提供的关于异步socket类,封装了IOCP的使用,可以方便实现NIO(non-blockingIO),NIO对于某些场景下Server性能和吞吐量有很大好处。 在应用中证明C#编写基于.NETIOCP的高性能服务器可以支持10000个以上的TCP长连接,SocketAsyncEventArgs是.NETFramework升级到2.0之后,.NETSocket提高的一种更高效的方法,对底层IOCP的实现在性能做了不少改进。 我之前一开始做Socket服务器没有采取IOCP框架,就是单纯的通过多线程和Socket配搭建的服务器,因为一般监听Socket在监听的时候会发生IO堵塞,这就必须要在单独开辟另外一个线程来监听,原先的我曾做过就是以简单的多线程来搭建的服务器,但后来意识到当客户端连接多了服务器端就很不稳定,资源消耗比较大,性能比较差,只能做Socket通讯学习之用,真真商业应用就差很远了。 后来基于IOCP框架搭建的服务器,无论是从服务器性能,还是从系统稳定性考虑都非常好。 连接效果图如下(图5-4): 图5-4Socket通讯效果图 当客户端输入用户名之后,点击登陆服务器会发现服务器端接收到了用户连接,并且显示出接收到的字符串为: dengl*1*,这里有我自己自定义的协议,两个*号之间才是真真有效的数据,其他的都是协助服务器端判断用户发送的信息是要进行一个什么样的操作。 5.4User对象的设计 5.4.1玩家状态设计 这里玩家的状态通过枚举的方法来列出,主要包括: enumState { none,//空着 read,//已经有个连接 isonline,//正在玩游戏中 iszhunbei//准备进入游戏 } 分别对应的主要状态切换的方法有: publicvoidZhunbei(){state=STATE.iszhunbei;}//准备中,可以发牌 publicvoidOnLine(){state=STATE.isonline;}//在线的方法 publicvoidOffLine(){state=STATE.none;username=””;connstringid=””;}//离线 5.4.2玩家的属性以及手牌的操作方法 ●属性 1.手牌publicList 2.用户名publicstringusername; 3.玩家状态publicSTATEstate=STATE.none; 4.所在桌子publicTabletable=null; 5.tokenpublicAsyncUserTokentoken; ●方法函数 默认构造函数 publicUser(stringconnected,AsyncUserTokentoken) { this.connstringid=connected; state=STATE.none; this.token=token; } 删除手牌 publicvoidRemoveCards(List { for
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Unity3D 平台 网络 地主 设计 实现 毕业设计