版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Unity3D多平台网络斗地主的设计与实现毕业设计PAGEPAGEII基于Unity3D多平台网络斗地主的设计与实现毕业设计目录TOC\o"1-3"\h\u前言 1第1章概述 21.1系统开发背景 21.2设计的目的 31.3设计的意义 3第2章开发环境及相关技术介绍 42.1开发环境介绍 42.1.1Unity3D简介 42.1.2VisualStdio2010和MonoDevelop 52.1.3Xcode简介 52.2C#语言和Javascript脚本 62.2.1C#语言 62.2.2Javascript语言 62.3IOCP框架简介 72.3.1IOCP内部工作队列图 72.3.2程序实现IOCP模型的基本步骤 82.3.3使用IOCP模型和不使用IOCP模型通讯的对比 82.4本章小结 10第3章系统需求分析 103.1用户功能需求分析 103.2系统性能要求 103.3可行性分析 10第4章总体方案设计 114.1纸牌设计 11基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第1页。4.1.1牌型设计 11基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第1页。4.1.2出牌类型(游戏规则)设计 124.2C/S模式 124.2.1基于C/S模式的服务器端设计流程图 124.2.2基于C/S模式的客户端设计流程图 124.3游戏逻辑程序结构 134.3.1数据层 134.3.2控制层 134.3.3显示层 144.4游戏设计流程图 144.5数学建模 15第5章详细设计与系统实现 165.1斗地主洗牌算法 165.2斗地主之“排序”算法 165.3基于IOCP的Socket通讯 185.4User对象的设计 195.4.1玩家状态设计 195.4.2玩家的属性以及手牌的操作方法 205.5Table对象的设计 215.5.1桌子状态设计 215.5.2Table的属性及方法 215.6粘包问题 235.6.1TCP和UDP的介绍以及区别 235.6.2粘包介绍及处理 23第6章发布和测试 256.1服务器端性能检测 256.2打包发布Android应用 276.2.1导出Android设置 276.2.2真机效果图 286.3打包发布IOS应用 29基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第2页。6.3.1导出IOS设置 29基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第2页。6.3.2真机效果图 316.4打包发布Web应用 326.4.1关于UnityWebPlayer的SandBoxSecurity(安全沙盒机制) 326.4.2导出Web设置 326.4.3运行结果 336.5打包发布PC/Linux应用 346.6整体测试效果 34结束语 40致谢 42参考文献 43附录A网络斗地主的游戏规则 44附录B部分程序代码 47基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第3页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第3页。第56页共13页前言近年来,随着科技和互联网的飞速发展、智能手机的迅速普以及性能的不断提升,游戏行业也突飞猛进,游戏已经逐渐成为人们公认的第九种艺术。现在各个平台上的游戏逐渐涌现,从最初的红白机,到PC机再到XBox平台发展到如今的手机移动平台,从端游到页游再到手游甚至是体感游戏等表现形式也逐渐丰富,当然成功的也数不胜数。比较大型的游戏有:反恐精英、星际争霸、使命召唤,生化危机等。当然也涌现了诸多经典的网络小游戏,比如麻将、拖拉机、中国象棋等。此外手机游戏,如愤怒的小鸟、保卫萝卜、FlappyBird、切水果、捕鱼达人等也赢得许多人的青睐。这些各种各样形式的游戏给如今生活在网络时代的人们带来了无限的生活乐趣。斗地主是一款相当经典的游戏,当然前人也做了不少版本,有移动端,pc端甚至是Web端的。可能他们在设计的过程中只是正对某一平台然后使用特性的开发技术来开发,这样的话如果想要实现多平台的设计就需要极大的时间成本和劳力成本。而Unity3D引擎的问世,最大的解决了这一问题,它能够实现一次开发多平台发布的特点,这也是为什么Unity3D引擎在短暂的时间里能够发展的如此迅速的原因。将斗地主游戏从单机版到网络化,使得现实中的多个玩家能够在同一个虚拟房间里面进行对局,并且能够实时的聊天,同时还不会受到平台的限制,你可以选择pc,web或者是移动端,从而能更好的体验游戏,娱乐生活。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第4页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第4页。第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之后,我就对它产生了浓厚的兴趣。之所以选择做斗地主游戏,因为首先我觉得它是一款比较经典的游戏,经典的往往能够是永恒的,在日常生活中,斗地主也常常是人们娱乐的一个项目之一,当然想完成它还是有一定的难度,设计都不少的算法,并且我将其网络化,开发起来对我而言还是有一定的挑战性,但又不是力所不能及,只要努力一下还是能实现的。因此就确定了这个多平台的多人网络斗地主的课题。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第5页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第5页。1.2设计的目的从玩家的角度,这种网络小游戏满足了玩家休闲的需求,让玩家换一种方式重温经典,能够在不同的平台,不同的的地区,还能够在同一个“房间”进行对局,也可以实时交流,也能结识更多的朋友,增加了游戏体验的乐趣,从而丰富了人们的业余生活,在紧张的工作之余带给人们最大程度的放松。从自身的角度,将大学所学的理论知识应用于真实的项目开发,做到了理论与相结合,理论知识指导实际操作,实际操作反过来也巩固了理论知识,从而更好的提升了自己的能力和项目经验。1.3设计的意义通过亲自实践,验证了Unity3D引擎的跨平台性,也系统的了解到一个游戏项目设计的整个流程,从最初的规划到最后的实现,为今后走上工作岗位打下基础。最后能够圆满实现,锻炼了自己的能力,同时做出来的游戏也增加了人们业余生活的乐趣。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第6页。
基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第6页。第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):基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第7页。图2-1Unity脚本系统基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第7页。 2.1.2VisualStdio2010和MonoDevelopVisualStdio作为微软最引以为傲的集成开发环境,敏捷的智能提示、排版以及稳定的性能,是任何语言的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#语言基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第8页。C#是微软公司再2000年6月发布的一种全新的且简单、安全、面向对象的程序设计语言,是专门为.NET应用开发而诞生的一种新的计算机语言。它吸收了C++、VisualBasic、java等语言面向对象的特性,又继承了C语言的语法简约的风格,体现了当今最新的程序设计技术的功能和精华。不同的是,C#面向对象模型已经面向了Internet进行了重新设计,它使用的是.NET框架的类库,为了安全起见不再主张指针类型的使用,当然也是可以使用指针,在程序中要做特殊申明。对指针使用的弱化,避免了程序异常访问系统内存地址而带来的隐患,从而更体现了它的健壮性的特点。C#不支持多继承,避免了以往类层次结构中由于多重继承带来的难以控制的特点,C#主张用接口来实现而不是多继承,主要的目的就是减少程序的复杂性,减少出错的可能性,使运行效率更高。.NET框架为C#提供了一个强大的、易用的、逻辑结构一直的设计环境。同时,公共运行时(CommonLanguageRuntime)为C#语言提供了一个托管的运行环境,使程序比以往更加稳定、安全。C#语言的特点有:基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第8页。.语言简洁优雅、安全稳定.保留了C++面向对象的特性.能够快速开发应用.强大的开发控件.支持跨平台2.2.2Javascript语言Javascript是一种直译式、动态、弱类型、基于原型的脚本语言,内置支持类。它的直译器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。Javascript语言的特点:.简单性.动态性.跨平台性.安全性2.3IOCP框架简介基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第9页。IOCP全称I/OCompletion基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第9页。2.3.1IOCP内部工作队列图如下图2-2(源于IOCP本质论),简节明了的看出IOCP本质其实就是创建一个线程池然后内部是以队列和栈的方式来处理客户端交互请求。图2-2IOCP内部工作队列图2.3.2程序实现IOCP模型的基本步骤基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第10页。如下图(2-3),最重要的步骤还是创建了线程池来管理大量线程的切换处理从而提高了服务器端的性能。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第10页。图2-3程序实现IOCP模型步骤2.3.3使用IOCP模型和不使用IOCP模型通讯的对比基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第11页。对比图如下(图2-4),很明显能看出不一样的地方,不适用IOCP,用普通的socket连接,我做过测试,对服务器内存资源消耗比较大,貌似上百多个客户端连接之后服务器端就容易崩溃,内存发出警报,健壮性是服务器端程序首当要考虑的,而测试使用IOCP模型的客户端能够达到2K-3K左右的稳定连接,并且内存资源消耗还比较小,下文测试章节会有具体的截图。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第11页。图2-4使用IOCP和不使用IOCP框架通讯对比基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第12页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第12页。2.4本章小结本章主要介绍了开发Unity游戏所需要的脚本语言以及开发环境。之所以选择C#而非js是因为C#语言更面向对象和具备一些高级的特性(封装,继承,多态,反射和泛型等),它也是国内的主流开发语言之一,而Javascript相对比较容易入门,语言本身是弱类型不需要那么严谨,在实际商业项目开发中不是太收推崇。因此本次设计以C#语言编写,同时采用MonoDevelop4.0调试和VisualStdio2010集成开发环境。服务器端基于IOCP模型搭建的比较稳定、高效、健壮的服务器应用程序。第3章系统需求分析3.1用户功能需求分析系统是由登录,叫地主,出牌,压牌,判断胜负,用户奖惩机制,实时聊天,退出等功能组成。该斗地主是根据民间盛行的扑克牌游戏演变而来,融入了现代电子游戏快捷便利,能更好的满足玩家的游戏体验以及提升业余生活的乐趣,达到缓解压力的效果。3.2系统性能要求系统必须稳定安全,对异常处理要做的比较完善,首先确保的是服务器端的稳定高效的运行,服务器采用的收费阿里云服务器,里面承载的是经典的windowsserver2003服务器系统,然后服务器端采用的是IOCP框架用Winform应用形式呈现出来。3.3可行性分析我将从以下几点分析该设计的可行性:(1)经济上的可行性基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第13页。考虑到是多人在线网络斗地主,而非仅局限于局域网的范围,因此就必须有一个稳定的外网服务器,目前我在公司管理着公司用的阿里云服务器,因此我决定临时可以租用一下公司的云服务器,经济上是可行的。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第13页。(2)技术上的可行性本系统不需要差大规模的计算和非常高的性能要求,可能需要处理一些中级一点的并发处理问题,对服务器端的性能还需要有一定考究,但不至于力所不能及,还有一些关于牌类的算法,例如洗牌算法,发牌算法,压牌算法等,但通过自己的思考相信也应该是可行的。(3)资源可行性虽然没有美工做配合,但网上搜集一些简单的免费的图片还是能够找到,可能效果不是非常的理想,但从程序实现的角度,基本能达到预期的要求,如果以后想要完善,可以找专门的美工做好图片然后进行替代即可。(4)游戏可玩性玩家可以通过设置用户名进行登录进游戏大厅进行多人对战,如果还想要做的完善一些可以专门接入腾讯或者新浪微博的sdk,用专用的账号登录或者是普通注册即可,用户也可对其个人信息进行修改。第4章总体方案设计4.1纸牌设计4.1.1牌型设计总所周知,一张纸牌是由数字、花色、背面所组成,在设计游戏之前先设计出一副牌的所有模板,这里列举一些部分牌的截图(图4-1):基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第14页。图4-1牌型基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第14页。搜集出一整副牌的图片,然后程序里就可以通过代码来调用显示到界面。4.1.2出牌类型(游戏规则)设计出牌类型有很多种,包括:单牌、一对、三张、三带一对、四张一样(炸弹)、王炸(大小王)、三连对、飞机等,详细游戏规则可以参考附录A。4.2C/S模式C/S(Client/Server,客户机/服务器)结构,是大家熟知的客户机和服务器结构。它是软件系统体系结构的一种。主要是由客户端应用程序(Client)和服务器端程序(Server)以及中间件(middle)三个部件组成。客户端应用程序是是系统中用户跟服务器进行数据的交互的部件。服务器端程序负责有效个管理系统资源,处理多个客户端连接请求以及跟多个客户端进行数据交互。4.2.1基于C/S模式的服务器端设计流程图服务器端处理客户端连接流程,参见下图(图4-2)图4-2服务器端处理流程基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第15页。4.2.2基于C/S模式的客户端设计流程图基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第15页。客户端连接服务器流程,参见下图(图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)通过事件机制获取到现在需要进行的操作。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第16页。(2)通过数据层提供的方法或者接口获取相关数据并进行相应处理。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第16页。(3)处理结果返回给事件发起者或存入游戏状态管理机。主表表现在对牌的控制,例如叫地主,出牌,压牌,以及游戏的状态控制等逻辑操作。4.3.3显示层(1)通过数据计算出游戏物体在游戏世界中的位置(2)播放声音这类的元素(3)获取游戏对象主要就是控制游戏场景显示。4.4游戏设计流程图游戏设计思路大概流程图,参见下图(图4-4)基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第17页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第17页。图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。我就是用这种数学建模的方法来达到化抽象为形象,将实际问题转化成数学问题来处理。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第18页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第18页。第5章详细设计与系统实现5.1斗地主洗牌算法做斗地主项目,洗牌算法是最基础也是最关键的一步,怎样“洗”的均匀,“洗”的随机,这是非常有考究的,算法的优劣直接会影响游戏效果的好坏,在平时生活真实的斗地主过程中,我们为了要确保牌洗的随机,我们就多洗几次,那么在程序设计中,我们可以用一个算法来模拟真实洗牌的过程。我的做法是将0-53这54个数字直接先依次输入到数组中,然后不断的进行两个“牌”之间的位置对调,当然平时生活中洗牌跟折半插入算法非常接近,但我还是用相比较折半插入更随机的算法来实现洗牌效果。大体算法思路,详细代码请参照附录B的1算法(斗地主洗牌算法): for(inti=0;i<MAX;i++) { data[Random(0,54)]与data[Random(0,54)]两位置上的值进行互换 }效果图(图5-1):图5-1洗牌算法效果图MAX如果选择的越大,则说明交换的次数越多,随机性就越明显,这里我是选择的是MAX=54进行测试,看起来数值排列还是比较随机的,基本能达到预期效果。5.2斗地主之“排序”算法基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第19页。制作斗地主的时候,发完牌还有基础的又比较重要的步骤就是牌的排序,这里的排序并非指一般的整形数字通常的排序,扑克牌中每种花色的牌有13张,那我们就以13为基准,将0-53的数字先对其取13的余数,得到的数加1即是当前纸牌的数值,参照上面的定义0-12分别对应方块A-K,13-25对应的是黑桃A-K,26-38对应的是红桃A-K,9-51对应的是梅花A-K,然后由服务器端分配三份牌分别发给同一桌的三个玩家,但分完每一份17张牌必须进行一个排序,排序之后的手牌也方便玩家看牌,提高了游戏的可玩性。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第19页。大体算法思路,详细代码请参照附录B的2算法(斗地主排序算法):先封装一个数字对应牌值的算法,主要就是通过整除和求余来判断是什么花色然后是什么花色和什么牌值,对大小王和A、J、Q、K要做特殊判断处理。程序运行效果图:效果图(5-2): 图5-2"排序"算法效果图基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第20页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第20页。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的实现在性能做了不少改进。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第21页。我之前一开始做Socket服务器没有采取IOCP框架,就是单纯的通过多线程和Socket配搭建的服务器,因为一般监听Socket在监听的时候会发生IO堵塞,这就必须要在单独开辟另外一个线程来监听,原先的我曾做过就是以简单的多线程来搭建的服务器,但后来意识到当客户端连接多了服务器端就很不稳定,资源消耗比较大,性能比较差,只能做Socket通讯学习之用,真真商业应用就差很远了。后来基于IOCP框架搭建的服务器,无论是从服务器性能,还是从系统稳定性考虑都非常好。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第21页。连接效果图如下(图5-4):图5-4Socket通讯效果图当客户端输入用户名之后,点击登陆服务器会发现服务器端接收到了用户连接,并且显示出接收到的字符串为:dengl*1*,这里有我自己自定义的协议,两个*号之间才是真真有效的数据,其他的都是协助服务器端判断用户发送的信息是要进行一个什么样的操作。5.4User对象的设计5.4.1玩家状态设计这里玩家的状态通过枚举的方法来列出,主要包括:enumState{none,//空着read,//已经有个连接isonline,//正在玩游戏中iszhunbei//准备进入游戏}分别对应的主要状态切换的方法有:publicvoidZhunbei(){state=STATE.iszhunbei;}//准备中,可以发牌基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第22页。publicvoidOnLine(){state=STATE.isonline;}//在线的方法基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第22页。publicvoidOffLine(){state=STATE.none;username=””;connstringid=””;}//离线5.4.2玩家的属性以及手牌的操作方法属性1.手牌publicList<int>cards2.用户名publicstringusername;3.玩家状态publicSTATEstate=STATE.none;4.所在桌子publicTabletable=null;5.tokenpublicAsyncUserTokentoken;方法函数默认构造函数publicUser(stringconnected,AsyncUserTokentoken){this.connstringid=connected;state=STATE.none;this.token=token;}删除手牌publicvoidRemoveCards(List<int>cards1){foreach(inttempincards1){Cards.Remove(temp);}}添加手牌PublicvoidAddCard(list<int>cards1){foreach(inttempincards1)基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第23页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第23页。Cards.Add(temp);}}判断断开的是否是当前玩家publicboolisequal(stringid){returnconnstringid==id;}对于服务器而言,每一个游戏玩家就是一个User对象,因此定义一个User对象便于管理。5.5Table对象的设计5.5.1桌子状态设计桌子的状态也是同样用枚举表现出来,共有两种状态:publicenumTableState{wait,//准备中game//游戏中}在构造函数中将TableState设置为wait。5.5.2Table的属性及方法属性1.用于定期检测的定时器publicTimertimer;2.桌子的状态publicTableStatestate;3.桌子的IDpublicintid;4.三个玩家列表publicList<User>users;5.三张底牌publicint[]dipai;基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第24页。6.判断房间是否有人断线publicboolisok=false;基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第24页。7.记录几个人叫了地主publicintcount=0;8.当前的分数publicintscore=0;9.记录当前房间应该谁发牌intcurrentindex=-1;10.当前存在的人数publicintonlinetable=0;11.当前收到的牌publicstringcarddata1=””;12.记录目前最的牌最大publicindex=-1;13.计算该轮到谁发牌了publicintNextIndex;方法1.构造函数publicTable(){for(inti=0;i<3;i++){users.Add(newUser(“”,null));}timer.Elapsed+=newTimers.ElapsedEventHandler(Check);//添加timer.Interval=Confige.sleeptime;//间隔时间TABLESTATE=TableState.wait;//桌面状态}2.添加用户publicAddUser(stringconnected,AsyncUserToken);3.判断当前桌子所有玩家是否都准备publicboolisallzhunbei();4.发牌(发牌方法上面已经有详细说名)publicvoidShuffle();5.排牌算法(排序算法上面有详细说明)privatestaticvoidBubbleSortFunction(int[]array);6.叫地主方法publicvoidjiaodizhu(intindex,intscore);7.获取当前谁发牌publicintGetFaPaiIndex();8.接受玩家发牌消息基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第25页。publicvoidProcessTableMessage(stringmessage);基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第25页。9.设置轮到谁发牌publicvoidSetFaPaiIndex(intindex,stringcarddata);10.检测指定时间有没有发牌如果指定时间内,没有收到客户的消息,那么认为它掉线,发送不出牌publicvoidCheck(objectsender,EventArgse);5.6粘包问题5.6.1TCP和UDP的介绍以及区别TCP是传输控制协议,它是面向连接的,在通信之前必须要建立与对方的连接关系,跟拨打电话方式类似,传输可靠,用于传输大量数据(流模式),速度比较慢,只支持一对一通信。UDP是用户数据报协议,面向非连接的,通信之前不需要与对方建立连接,跟发送邮件方式类似,传输不可靠,用于传输少量数据,传输速度快,支持一对一、一对多、多对多通信。5.6.2粘包介绍及处理上面介绍了TCP和UDP通信的区别,本设计是基于TCP协议完成的,TCP是面向连接流式无边界的传输方式。当传输通道建立之后,则数据流就像水一样流过来,其中没有数据边界的概念,包随便多大,因而会出现多个包最后粘成一个大包。当然这个是TCP的原因,还有一种是缓存机制的原因,发送端在默认的状态下是需要等到缓冲区满了才会发送出去的。当然也可以适当使用push刷缓冲区可以减少粘包的现象,如果缓冲区处理不及时,没有做到来一个数据包处理一个,那么也会引发粘包问题。TCP数据交互是基于数据结构的传输。举例:要发送两种数据结构的数据:{givemesomedata}{don’tgivemeanything},如果服务器端不知道怎么断开就会容易发生粘包,可能接受到的数据会是{givemesomedatadon’tgivemeanything},这时服务器就傻眼了就不知道怎么处理了,没见过这么诡异的数据,当然也就不知道怎么处理。本设计中采用的自定义数据包结构来处理粘包问题。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第26页。在字节流前面先加上一个标志,标志就是数据包的字节长度,这样在读取的时候可按字节读取。这样可有效控制粘包问题。并可以成功避免残包的问题,且不会发生连锁反应,一个坏包的出现不会影响下一个包的正常读取。如{*Length*DataStram}。该中解决方案的优点是可以保证通信的100%准确,缺点是影响程序性能,因为按字节读取包,必定会影响程序的效率。结构图如下(图5-5):基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第26页。图5-5自定义的数据结构(1)发送数据:publicvoidSendData(stringtext){if(stream!=null){byte[]data;data=Encoding.UTF8.GetBytes(text);byte[]data1=newbyte[data.Length+1];data1[0]=(byte)data.Length;Array.Copy(data,0,data1,1,data.Length);stream.Write(data1,0,data1.Length);}}(2)接受数据:privatevoidOnGetData(byte[]data) { try { Array.Copy(data,0,databuffer,end,data.Length);//SourceArray,起始位置,数据包,写的位置,长度end+=data.Length;intdata1=databuffer[offset];//取出第一个数基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第27页。while(end-offset>=data1+1)基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第27页。{stringtext=System.Text.Encoding.UTF8.GetString(databuffer,offset+1,data1); Debug.Log(text+""+System.DateTime.Now.ToString());if(text.Length>0)//如果有字符发送过来,就接受{ClientRemote.messagelist.Enqueue(text);offset=offset+data1+1;//游标到有效位末尾data1=databuffer[offset];}}if(end==offset){offset=0;end=0;} }catch(Exceptionex) { Debug.Log(ex.ToString()); }}通过这种自定义数据格式,能够有效的防止粘包的问题,读取的时候来一个完整的包就读取一个包,放到队列中,然后再按照队列先进先出的处理方式进行处理,确保了数据的正确性。第6章发布和测试基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第28页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第28页。6.1服务器端性能检测在网络斗地主,既然是多人联网在线游戏,那么就必须要一个性能比较强的服务器端,因此服务器端必须具备以下几个必备条件:确保服务器不会轻易崩溃,具备很好的健壮性;能够处理高并发请求;资源消耗少;响应速度快;连接安全稳定用专门的TCP测试工具来检测服务器的性能,TCP测试工具就是模拟一个高并发请求的过程,在短时间内向服务器发送3千个链接请求,看服务器的运行状态。然后打开windows任务管理器,观察连接前后资源的消耗情况,如下图测试前后资源消耗对比(图6-1-1/图6-1-2):测试前CPU:0%,资源消耗62%:图6-1-1TCP测试之前资源消耗图测试后资源消耗:62%,测试过程中CPU最高14%:基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第29页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第29页。图6-1-2TCP测试后资源消耗图由此可见基本上处理高并发还算可以,服务器端不会奔溃,并且资源消耗也比较低,连接也比较稳定,不会出现连接不上的情况,总体而言还是满足了服务器端设计的几个要求。6.2打包发布Android应用6.2.1导出Android设置在导出Android应用之前,必须要先确保安装上了Android开发环境,这里就不详细介绍了,网上相关教程也不少,参照配置即可。然后选择Unity的File->BuildingSettings->切换到Android平台->Switch切换,效果如下图(图6-2-1):基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第30页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第30页。图6-2-1切换Android设置1设置应用ID参数(如图6-2-2)图6-2-2设置导出应用参数6.2.2真机效果图导出成APK应用软件安装到LG平板和中兴手机,这两台Android机具有不同的分辨率,也正好测试了一下分辨率的自适应,效果如下图(图6-3-1/图6-3-2):图6-3-1Android手机测试基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第31页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第31页。图6-3-2Android平板测试真机测试看出来还是满足了不同型号不同分辨率,满足了应用的自适应性。6.3打包发布IOS应用6.3.1导出IOS设置基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第32页。操作同上选择切换IOS平台,但必须有个前提就是在MacOS环境下操作,然后点击PlayerSettings,设置ID,选择适用IPad和IPhone,选择是否是真机还是模拟器测试,选择iOS版本,效果图(图6-4-1):基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第32页。图6-4-1导出IOS设置基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第33页。由于IOS开发需要向苹果申请开发者账号,然后向Xcode安装证书,然后才能够导入真机进行测试,这里导出IOS不像导出Android那样直接能生成APK可安装文件,必须先生成Xcode工程,然后通过Xcode来生成应用进行真机测试,关于导入证书,详细图文过程我写在blog中,地址:基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第33页。/dingxiaowei2013/article/details/23312229。Unity设置完毕后,点击生成XCode工程,然后连接IOS设备,在设备选择真机调试,如图(图6-4-2):图6-4-2选择真机设备设置完毕后选择运行,即可在真机中看到效果。6.3.2真机效果图真机效果图如下(图6-5),这里机器是iTouch:基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第34页。图6-5iTouch真机测试基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第34页。效果基本达到预期要求。6.4打包发布Web应用6.4.1关于UnityWebPlayer的SandBoxSecurity(安全沙盒机制)关于Unity的Socket通讯,在其他平台都能够正常跟服务器端进行交互,但一旦切换到Web平台就会报错,这里Unity的Web平台,基于安全性考虑,官方做了一个端口权限的问题,服务器端必须要打开843端口的访问权限,客户端浏览器才能跟服务器进行正常的socket通讯。打开服务器端口访问权限:在Unity的安装目录下找到一个sockpol.exe的工具,具体路径是在“...\Unity\Editor\Data\Tools\SocketPolicyServer”下有一个sockpol.exe可执行工具。然后打开cmdDos窗口,输入命令sockpol.exe--all,看到以下效果(图6-6)图6-6打开服务器端口权限当有一个WebPlayer连接上服务器之后,cmd窗口就会给出提示允许连接。6.4.2导出Web设置基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第35页。如图(图6-7),在Web平台导出设置里面可以输入WebPlayer的宽和高,以及是否允许程序在后台执行,一般我们都选择允许,这样即使窗口失去焦点,也能够确保程序照常运行。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第35页。图6-7导出web设置6.4.3运行结果用浏览器打开刚刚导出的页面,原理是通过WebPlayer插件来加载生成的.unity3d资源,然后通过页面呈现出来。效果图如下(图6-8)图6-8浏览器端测试基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第36页。打开三个浏览器端,然后都登陆成功,服务器端显示出三个登陆玩家,基本达到预期效果。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第36页。6.5打包发布PC/Linux应用因为本身就是用的Windows平台下开发Unity,所以导出成PC/Linux是最简单的,跟上面一样导出成可执行文件就可以了,也没有什么需要特殊注意的地方。直接看效果图(图6-7):图6-9PC端测试照样也可以生成Linux应用软件,运行在Linux平台上。6.6整体测试效果基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第37页。多平台网络测试,见下图(图6-10-1~图6-10-3)移动版测试,能够进行不同平台同一房间的登陆、发牌、叫地主、出牌、压牌等操作。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第37页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第38页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第38页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第39页。图6-10-2叫地主基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第39页。图6-10-3出牌基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第40页。非移动版测试,打开了一个web浏览器还有两个pc窗口,效果图(图6-10-4~图6-10-6):基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第40页。图6-10-4登陆基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第41页。图6-10-5叫地主基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第41页。图6-10-6出牌和压牌基本导出测试了一些常用平台,基本达到预期想要的效果,能够实现多平台多人实时在线斗地主的游戏。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第42页。
基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第42页。结束语本次毕业设计,历时4个月,到目前为止基本功能已经实现,当然还有待完善,丰富游戏的玩法和功能。首先做好准备工作,从搜集资料,到了解玩家目前对游戏的需求,以及综合考虑自身的能力,确定了论文题目,具备一定的挑战性,但又不至于实现不了的一个项目。然后就是分析需求文档做相关调研并确定游戏所要实现的基本功能,接着就是查找资料,思考这些功能的解决方案和方法,包括服务器端选择和配置。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第43页。最后就到了编程实现的过程,从最基本socket通信的简单测试,斗地主洗牌和发牌的基本算法的研究,从小做起,从基本的做起,然后不断的添加和完善优化整个游戏项目,在这过程中,实现一点小功能,就导出用真机进行测试,如有问题及时修改和完善。毕业设计是大学生涯的最后一个重要的阶段,虽然不像是在课堂上,接受着老师传授知识,但也是一段非常宝贵而重要的学习经历。完成毕业设计是培养我们自主学习和探索的一种精神,我们或许在这期间会碰到很多莫名其妙的问题,然后只能自己上网查找资料或者偶尔请教他人。在做这个基于Unity平台的网络斗地主的过程中,我看了不少相关书籍,也解决了不少问题,认识了一些牛人,甚至是一些书籍的原作者。在跟他们交谈的过程中,不仅仅能学到解决当前问题的办法,更是能了解到他们的学习方法,意识到没有天生的天才,那些所谓的大牛也是经过了多少个加班熬夜付出了常人难以想象的努力才能成为业内知名的牛人。在这做毕设的几个月里,我学会了逛论坛,学会了写博客,将我遇到的问题以及解决方法详细的记录下来,既是对自己的一个学习小结又是给他们提供了帮助,不断坚持了几个月也得到了CSDN论坛的肯定,授予了我CSDN专家的荣誉称号,但自知离真真的专家还很遥远,但我坚信只要坚持,一直走在不断学习和进取的道路上,我相信总会有一天能得到更多人的认可!这次的毕业设计,虽然是做的是一个比较老的游戏,但真真做起来,需要考虑的还很多,也需要解决不少的问题,但在做毕设的过程中也遇到有人愿出高价收购收斗地主项目,这也让我更加觉得做这个游戏的乐趣和意义,坚持去完成这个项目也是对自己能力的一种肯定!其实Unity3D不仅仅只是一款简单游戏引擎,还可以用来开发其他方向,例如虚拟现实(VR)、增强现实(AR)、体感游戏、家用主机的开发,也逐渐涉及到各个行业,参加了一次Unity官方开发者大会,大会介绍了Unity已经在医疗、教育、航空、国防等相关领域都有紧密联系。最新的Unity5引擎也进一步做了优化,加强了界面渲染优化,融合了WebGL技术,将在Web领域更会有一番作为,我也将一直好好的深入研究Unity这款强大的引擎,希望基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第44页。能做出更多更有意思的东西出来。
基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第43页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第44页。致谢能够圆满完成毕设,自己也比较开心,对我而言是一段难忘而宝贵的经历。这期间经历了多少个漫漫长夜,遇到了多少个莫名其妙的问题,其中的辛酸与苦楚或许只有自己亲身经历了才知道。当然能够按时完成还离不开许多人的帮助。首先感谢指导老师朱教授在这期间对我们的过程监督和阶段性的检查,以及论文方面的指导。可以说朱老师对我大学对我帮助和启迪最大的老师,整个大学四年,朱老师是教授我们课程最多的老师,每次都兢兢业业,教授给我们的不仅仅是知识,更大的是为人处世的道理。回忆整个大学四年,最有印象的还是和朱老师一起研究课题,一起研究算法的那段时光,虽然短暂,但很深刻,在那段时间里,我感受到了从未有过的专注和乐趣,也正是从那开始,我对编程有了浓厚的兴趣,我认为编程也可以是一种艺术,能够让你的大脑专注与其中,心无旁骛,就像CPU一样的运转,那一刻仿佛自己就是一台计算机!那期间,我也时常往朱老师的办公室跑,感觉他的办公室就是我第二个宿舍,走进去总有一种温馨的感觉,会跟朱老师交流很多,他也不仅仅像老师一样,更像是一个年轻的父亲,教育我们晚辈,没有什么难关我们过不去,也没有什么难题能难得倒我们,Justdoit!自己亲自动手,只要做了就会有收获!其次是感谢这期间帮我一起探讨和解决问题的同事,她是我最近能最快解决问题的帮手之一,然后是网上认识的一些牛人,甚至是一些书籍的原作者,在看他们书籍的时候有遇到什么不解的问题也是得到他们的指导。感谢清华大学出版社和机械工业出版社的编辑,是他们给了我鼓励,让我感受到坚持写博客的乐趣,希望有一天能出版属于自己的书籍,圆我一个梦。最后感谢我的舍友,感激我的朋友、同学、老师、家人和亲戚,有你们的陪伴,让我度过一个圆满而美好的大学生活!基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第45页。基于Unity3D多平台网络斗地主的设计与实现毕业设计全文共59页,当前为第45页。参考文献[1]张磊精通C#游戏编程清华大学出版社2012年01月[2]郑阿奇VisualC#网络编程电子工业出版社2011年10月[3]吕凤翥C#入门经典(第六版)北京交通大学出版社2003年07月[4]BillEvjenC#高级编程(第8版)清华大学出版社2013年10月[5](美)ScottJacobs游戏编程精粹人民邮电出版社2010年07月[6](美)哈本游戏编程入门(原书第3版)机械工业出版社2011年1月[7](美)施雷伯等游戏设计师修炼秘笈机械工业出版社2011年6月[8]游戏架构设计与策划基础出版社:清华大学出版社2010年1月[9](美)MichelleMenardGameDevelopmentwithUnity清华大学出版社2012年5月[10]金玺曾Unity3D游戏开发清华大学出版社2013年6月[11]Unity官方unity4.X从入门到精通中国铁道出版社2013年11月[12]宣雨松Unity3D游戏开发人民邮电出版社2012年6月[13](英)迈耶Android4高级编程(第3版)清华大学出版社2013年04月[14]李华明iOS游戏编程之从零开始清华大学出版社2013年02月[15
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电视机 行业分析报告
- 临安节能灯行业现状分析报告
- 偏门行业前景分析报告
- 今年行业分析和市场分析报告
- 铜丝行业分析报告
- 客服行业情绪压力分析报告
- 各行业财务分析指标报告
- GB/T 44937.5-2025集成电路电磁发射测量第5部分:传导发射测量工作台法拉第笼法
- 门岗保安卫生管理制度
- 卫生工作制度
- 2026河北石家庄技师学院选聘事业单位工作人员36人备考考试试题附答案解析
- 云南省2026年普通高中学业水平选择性考试调研测试历史试题(含答案详解)
- GB 4053.3-2025固定式金属梯及平台安全要求第3部分:工业防护栏杆及平台
- 明确安全生产领导小组的职责与安全管理体系
- 七年级下册语文必背古诗文(字帖描红)
- 电仪施工质量总结
- 《甜花香型大叶种工夫红茶》编制说明
- QSY06503.14-2020石油炼制与化工装置工艺设计包编制规范 - 副本
- 柜式七氟丙烷-气体灭火系统-安装与施工-方案
- 核医学全身骨显像骨显像课件
- 昌乐县镇区基准地价更新修正体系汇编(完整版)资料
评论
0/150
提交评论