收藏 分销(赏)

基于Unity三D的多人网络斗地主游戏的设计和实现.doc

上传人:快乐****生活 文档编号:2509832 上传时间:2024-05-31 格式:DOC 页数:69 大小:6.77MB 下载积分:14 金币
下载 相关 举报
基于Unity三D的多人网络斗地主游戏的设计和实现.doc_第1页
第1页 / 共69页
基于Unity三D的多人网络斗地主游戏的设计和实现.doc_第2页
第2页 / 共69页


点击查看更多>>
资源描述
本科毕业设计(论文) 基于Unity3D多平台网络斗地主设计与实现 学院名称: 计算机工程学院 专 业: 计算机科学与技术 班 级: 10工程W 学 号: 10141303 姓 名: 丁小未 指引教师姓名: 朱明放 指引教师职称: 副专家 二〇一四 年 五 月 基于Unity3D多平台网络斗地主设计与实现 摘 要:斗地主是一款非常典型游戏,可以说是家喻户晓,玩法也比较简朴,娱乐性也比较强,老少皆宜。随着互联网技术飞速发展,斗地主呈现形式也变得多样性,由老式纸牌游戏衍生为移动端单机游戏,然后到多人多平台即时在线联网游戏。形式变化可以让人足不出户也能感受到和伙伴们一起玩游戏乐趣。 本设计游戏规则是针对一副牌为准,本文阐述了网络斗地主游戏基本算法设计以及大体设计框架和思路,并且以图文,某些核心代码解释形式展示出来。本设计采用了Unity3D作为开发引擎,结合Visual studio 开发工具,通过基本socket通讯和某些算法,最后实现了多平台多人网络斗地主设计。 本文基于Unity3D游戏开发设计过程中,采用了MVC设计模式,这也符合Unity3D工作模式;采用C#脚本语言也更符合Unity3D游戏设计面向对象设计理念,游戏设计就是将面向对象这一特性发挥到极致;采用MONO开源跨平台框架可以大大节约游戏开发效率以及开发成本,最后通过实际完毕效果来验证了基于Unity3D多平台网络斗地主游戏设计具备高效性,高品质和低门槛性特点。 核心词:Unity3D,斗地主,手机游戏,游戏引擎,socket,网络通讯,MVC,MONO Design and implementation of multi-platform network Landlords Based Unity3D Abstract:Landlords is a classic game,which can be said to be a household name. The rules are relatively simple,and kind of the entertainment is relatively strong. As a result,the game has gain popularity among both the young and the old. With the rapid development of Internet technology,the form of the game is of great diversity. The game derived from the traditional card game,then turned into the stand-alone mobile phone game,and now has become a multi -platform instant online multiplayer networked game. The changes in the game form make people who stay at home enjoying the fun of playing the game together. The design of the rules is according to a deck of cards. The article discusses the basic network Landlords algorithm design and the general framework and ideas of the game. The game interprets itself successfully by the graphic form and the part of the core code. This design uses the Unity3D as a development engine. Besides,it combined with Visual studio development tools. Ultimately we finish the design of a multi -platform multiplayer online Landlords by some algorithms and the basic socket communication. The article is based on the design process of Unity3D game development. The MVC design pattern is consistent with Unity3D mode,and C # scripting language is good for the design object-oriented design of Unity3D game. Object-oriented game design is supposed to make the best of the feature .The MONO open source framework can greatly reduce the efficiency of game development as well as development costs. Finally we validate the high efficiency,high- quality and low-threshold characteristics of the multi-platform network game which based on Landlords Unity3D by achieving the actual results. Keywords:Unity3D,Landlords,mobile games,game engine,socket,network communications,MVC,MONO 目录 前言 1 第1章 概述 2 1.1 系统开发背景 2 1.2 设计目 3 1.3 设计意义 3 第2章 开发环境及有关技术简介 4 2.1 开发环境简介 4 2.1.1 Unity3D简介 4 2.1.2 Visual Stdio和MonoDevelop 5 2.1.3 Xcode简介 5 2.2 C#语言和Javascript脚本 6 2.2.1 C#语言 6 2.2.2 Javascript语言 6 2.3 IOCP框架简介 7 2.3.1 IOCP内部工作队列图 7 2.3.2 程序实现IOCP模型基本环节 8 2.3.3 使用IOCP模型和不使用IOCP模型通讯对比 8 2.4 本章小结 10 第3章 系统需求分析 10 3.1 顾客功能需求分析 10 3.2 系统性能规定 10 3.3 可行性分析 10 第4章 总体方案设计 11 4.1 纸牌设计 11 4.1.1 牌型设计 11 4.1.2 出牌类型(游戏规则)设计 12 4.2 C/S模式 12 4.2.1 基于C/S模式服务器端设计流程图 12 4.2.2 基于C/S模式客户端设计流程图 12 4.3 游戏逻辑程序构造 13 4.3.1 数据层 13 4.3.2 控制层 13 4.3.3 显示层 14 4.4 游戏设计流程图 14 4.5 数学建模 15 第5章 详细设计与系统实现 16 5.1 斗地主洗牌算法 16 5.2 斗地主之“排序”算法 16 5.3 基于IOCPSocket通讯 18 5.4 User对象设计 19 5.4.1 玩家状态设计 19 5.4.2 玩家属性以及手牌操作办法 20 5.5 Table对象设计 21 5.5.1 桌子状态设计 21 5.5.2 Table属性及办法 21 5.6 粘包问题 23 5.6.1 TCP和UDP简介以及区别 23 5.6.2 粘包简介及解决 23 第6章 发布和测试 25 6.1 服务器端性能检测 25 6.2 打包发布Android应用 27 6.2.1 导出Android设立 27 6.2.2 真机效果图 28 6.3 打包发布IOS应用 29 6.3.1导出IOS设立 29 6.3.2真机效果图 31 6.4 打包发布Web应用 32 6.4.1 关于UnityWebPlayerSandBox Security(安全沙盒机制) 32 6.4.2 导出Web设立 32 6.4.3 运营成果 33 6.5 打包发布PC/Linux应用 34 6.6 整体测试效果 34 结束语 40 道谢 42 参照文献 43 附录A 网络斗地主游戏规则 44 附录B 某些程序代码 47 前言 近年来,随着科技和互联网飞速发展、智能手机迅速普以及性能不断提高,游戏行业也突飞猛进,游戏已经逐渐成为人们公认第九种艺术。当前各个平台上游戏逐渐涌现,从最初红白机,到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旗舰版操作系统,搭载Unity3D 4.2.0f1专业版引擎。采用Visual Stdio IDE编辑C#脚本。 2.1.1 Unity3D简介 Unity是由Unity Technologies开发一种让玩家轻松创立诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容多平台综合型游戏开发工具,是一种全面整合专业游戏引擎。Unity可以运营在Windows 和Mac OS X系统下,可发布游戏至Windows、Mac、Wii、iPhone、Windows phone 8和Android等平台。也可以运用Unity web player插件发布网页游戏。 Unity具备强大脚本系统,它核心思想是面向对象,把游戏场景中有所物体都抽象成可编程对象,从而将游戏编程转化为游戏对象控制和调度,而控制游戏对象和对象调度就是咱们所说脚本系统,关系图如下(图2-1): 图2-1 Unity脚本系统 2.1.2 Visual Stdio和MonoDevelop Visual Stdio作为微软最引觉得傲集成开发环境,敏捷智能提示、排版以及稳定性能,是任何语言IDE都无法比拟。因而C#语言开发,固然首选Visual Stdio。但是Visual Stdio不支持UnityDebug(调试),必要要到AssetStore(Unity插件商量)去购买一种UnityVS插件才可以实现断点调试功能。而MonoDevelop是基于.NET一种跨平台集成开发环境,重要支持语言也是C#。Mono作为.NET向跨平台和开源先驱,它打破了微软一惯封闭风格,因而Mono也得到了业界广大好评和注重。MonoDevelop是Unity自带集成开发环境,相比较VS优势就是可以不依赖插件从而实现断点调试,尚有就是可以在其她平台上运营,但是它也有弊端,没有VS那么强大提示功能,对中文支持也不够和谐,可以说这两个IDE来编辑Unity脚本个有利弊,看如何取舍,普通都是选取前者。 2.1.3 Xcode简介 Xcode是苹果公司向开发人员提供集成开发环境,用于开发Mac OS X,iOS应用程序,Xcode具备较强编译速度。Unity导出IOS程序时候需要导出Xcode工程,然后由Xcode编译导出发布,固然还需要申请安装苹果开发官方开发者证书。文章最后在简介Unity工程导出成IOS版本安装到ios移动设备上会详细简介流程以及注意事项。 2.2 C#语言和Javascript脚本 这两者都是Unity开发支持语言,固然还涉及boo脚本,但普通不怎么用boo脚本作为开发语言,前两者语言,C#国内人用比较多,Javascript国外开发者用比较多,接下来咱们就做一种对比,这两种语言开发Unity有什么异同。在这里,由于Unity是基于.NET平台,而C#是.NET平台主推语言,因而我就选取了C#,可以更好兼容.NET某些库文献。 2.2.1 C#语言 C#是微软公司再6月发布一种全新且简朴、安全、面向对象程序设计语言,是专门为.NET应用开发而诞生一种新计算机语言。它吸取了C++、Visual Basic、java等语言面向对象特性,又继承了C语言语法简约风格,体现了当今最新程序设计技术功能和精华。不同是,C#面向对象模型已经面向了Internet进行了重新设计,它使用是.NET框架类库,为了安全起见不再主张指针类型使用,固然也是可以使用指针,在程序中要做特殊声明。对指针使用弱化,避免了程序异常访问系统内存地址而带来隐患,从而更体现了它健壮性特点。C#不支持多继承,避免了以往类层次构造中由于多重继承带来难以控制特点,C#主张用接口来实现而不是多继承,重要目就是减少程序复杂性,减少出错也许性,使运营效率更高。.NET框架为C#提供了一种强大、易用、逻辑构造始终设计环境。同步,公共运营时(Common Language Runtime)为C#语言提供了一种托管运营环境,使程序比以往更加稳定、安全。C#语言特点有: .语言简洁优雅、安全稳定 .保存了C++面向对象特性 .可以迅速开发应用 .强大开发控件 .支持跨平台 2.2.2 Javascript语言 Javascript是一种直译式、动态、弱类型、基于原型脚本语言,内置支持类。它直译器被称为JavaScript引擎,为浏览器一某些,广泛用于客户端脚本语言,最早是在HTML网页上使用,用来给HTML网页增长动态功能。Javascript语言特点: .简朴性 .动态性 .跨平台性 .安全性 2.3 IOCP框架简介 IOCP全称I/O Completion Port,IOCP模型属于一种通讯模型,合用于(能控制并发执行)高负载服务器一种技术,基于IOCP通信服务器是以多线程方式实现了与各种客户消息并发交互,可以合理有效解决客户端端消息,可以使得系统内存资源得以合理运用,有效解决了因多线程竞争所带来问题。 2.3.1 IOCP内部工作队列图 如下图2-2(源于IOCP本质论),简节明了看出IOCP本质其实就是创立一种线程池然后内部是以队列和栈方式来解决客户端交互祈求。 图2-2 IOCP内部工作队列图 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调试和VisualStdio集成开发环境。服务器端基于IOCP模型搭建比较稳定、高效、健壮服务器应用程序。 第3章 系统需求分析 3.1 顾客功能需求分析 系统是由登录,叫地主,出牌,压牌,判断胜负,顾客奖惩机制,实时聊天,退出等功能构成。 该斗地主是依照民间盛行扑克牌游戏演变而来,融入了当代电子游戏快捷便利,能更好满足玩家游戏体验以及提高业余生活乐趣,达到缓和压力效果。 3.2 系统性能规定 系统必要稳定安全,对异常解决要做比较完善,一方面保证是服务器端稳定高效运营,服务器采用收费阿里云服务器,里面承载是典型windows server 服务器系统,然后服务器端采用是IOCP框架用Winform应用形式呈现出来。 3.3 可行性分析 我将从如下几点分析该设计可行性: (1)经济上可行性 考虑到是多人在线网络斗地主,而非仅局限于局域网范畴,因而就必要有一种稳定外网服务器,当前我在公司管理着公司用阿里云服务器,因而我决定暂时可以租用一下公司云服务器,经济上是可行。 (2)技术上可行性 本系统不需要差大规模计算和非常高性能规定,也许需要解决某些中级一点并发解决问题,对服务器端性能还需要有一定考究,但不至于力所不能及,尚有某些关于牌类算法,例如洗牌算法,发牌算法,压牌算法等,但通过自己思考相信也应当是可行。 (3)资源可行性 虽然没有美工做配合,但网上收集某些简朴免费图片还是可以找到,也许效果不是非常抱负,但从程序实现角度,基本能达到预期规定,如果后来想要完善,可以找专门美工做好图片然后进行代替即可。 (4)游戏可玩性 玩家可以通过设立顾客名进行登录进游戏大厅进行多人对战,如果还想要做完善某些可以专门接入腾讯或者新浪微博sdk,用专用账号登录或者是普通注册即可,顾客也可对其个人信息进行修改。 第4章 总体方案设计 4.1 纸牌设计 4.1.1 牌型设计 总所周知,一张纸牌是由数字、花色、背面所构成,在设计游戏之前先设计出一副牌所有模板,这里列举某些某些牌截图(图4-1): 图4-1 牌型 收集出一整副牌图片,然后程序里就可以通过代码来调用显示到界面。 4.1.2 出牌类型(游戏规则)设计 出牌类型有诸各种,涉及:单牌、一对、三张、三带一对、四张同样(炸弹)、王炸(大小王)、三连对、飞机等,详细游戏规则可以参照附录A。 4.2 C/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个数值,这样就将抽象牌类比较形象转化成数值比较。咱们规定一一相应数值关系: l 方块A、方块2...方块K——0,1...12 l 黑桃A、黑桃2...黑桃K——13,14...25 l 红桃A、红桃2...红桃K——26,27...38 l 梅花A、梅花2...梅花K——39,40...51 l 小王、大王——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个数字直接先依次输入到数组中,然后不断进行两个“牌”之间位置对调,固然平时生活中洗牌跟折半插入算法非常接近,但我还是用相比较折半插入更随机算法来实现洗牌效果。 大体算法思路,详细代码请参照附录B1算法(斗地主洗牌算法): for(int i=0;i<MAX;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张牌必要进行一种排序,排序之后手牌也以便玩家看牌,提高了游戏可玩性。 大体算法思路,详细代码请参照附录B2算法(斗地主排序算法): 先封装一种数字相应牌值算法,重要就是通过整除和求余来判断是什么花色然后是什么花色和什么牌值,对大小王和A、J、Q、K要做特殊判断解决。程序运营效果图: 效果图(5-2): 图5-2 "排序"算法效果图 5.3 基于IOCPSocket通讯 既然是网络游戏,那么就不得不谈一谈Socket通讯,C#版Socket是Microsoft.Net Framework为应用程序访问Internet提供网络通讯类库。通讯原理是服务器端打开本地ip上某个特定端口,然后不断进行监听客户端连接祈求,然后做出响应解决,简朴流程如下图(5-3),代码请参见附录B3: 图5-3 Socket通讯流程图 其中SocketAsyncEventArgs是.NET提供关于异步socket类,封装了IOCP使用,可以以便实现NIO(non-blocking IO),NIO对于某些场景下Server性能和吞吐量有很大好处。在应用中证明C#编写基于.NET IOCP高性能服务器可以支持10000个以上TCP长连接,SocketAsyncEventArgs是.NET Framework升级到2.0之后,.NET Socket提高一种更高效办法,对底层IOCP实当前性能做了不少改进。 我之前一开始做Socket服务器没有采用IOCP框架,就是单纯通过多线程和Socket配搭建服务器,由于普通监听Socket在监听时候会发生IO堵塞,这就必要要在单独开辟此外一种线程来监听,原先我曾做过就是以简朴多线程来搭建服务器,但日后意识到当客户端连接多了服务器端就很不稳定,资源消耗比较大,性能比较差,只能做Socket通讯学习之用,真真商业应用就差很远了。日后基于IOCP框架搭建服务器,无论是从服务器性能,还是从系统稳定性考虑都非常好。 连接效果图如下(图5-4): 图5-4 Socket通讯效果图 当客户端输入顾客名之后,点击登陆服务器会发现服务器端接受到了顾客连接,并且显示出接受到字符串为:dengl*1*,这里有我自己自定义合同,两个*号之间才是真真有效数据,其她都是协助服务器端判断顾客发送信息是要进行一种什么样操作。 5.4 User对象设计 5.4.1 玩家状态设计 这里玩家状态通过枚举办法来列出,重要涉及: enum State { none,//空着 read,//已有个连接 isonline,//正在玩游戏中 iszhunbei //准备进入游戏 } 分别相应重要状态切换办法有: public void Zhunbei(){state = STATE.iszhunbei;}//准备中,可以发牌 public void OnLine(){state = STATE.isonline;} //在线办法 public void OffLine(){state = STATE.none;username=””;connstringid=””;}//离线 5.4.2 玩家属性以及手牌操作办法 l 属性 1.手牌 public List<int> cards 2.顾客名 public string username; 3.玩家状态 public STATE state = STATE.none; 4.所在桌子 public Table table = null; 5.token public AsyncUserToken token; l 办法函数 默认构造函数 public User(string connected,AsyncUserToken token) { this.connstringid = connected; state = STATE.none; this.token = token; } 删除手牌 public void RemoveCards(List<int> cards1) { foreach(int temp in cards1) { Cards.Remove(temp); } } 添加手牌 Public void AddCard(list<int> cards1) { foreach(int temp in cards1) { Cards.Add(temp); } } 判断断开与否是当前玩家 public bool isequal(string id) { return connstringid == id; } 对于服务器而言,每一种游戏玩家就是一种User对象,因而定义一种User对象便于管理。 5.5 Table对象设计 5.5.1 桌子状态设计 桌子状态也是同样用枚举体现出来,共有两种状态: public enum TableState { wait,//准备中 game //游戏中 } 在构造函数中将TableState设立为wait。 5.5.2 Table属性及办法 属性 1.用于定期检测定期器 public Timer timer; 2.桌子状态 public TableState state; 3.桌子ID public int id; 4.三个玩家列表 public List<User> users; 5.三张底牌 public int [] dipai; 6.判断房间与否有人断线 public bool isok = false; 7.记录几种人叫了地主 public int count = 0; 8.当前分数 public int score = 0; 9.记录当前房间应当谁发牌 int currentindex = -1; 10.当前存在人数 public int onlinetable = 0; 11.当前收到牌 public string carddata1=””; 12.记录当前最牌最大 public index = -1; 13.计算该轮到谁发牌了 public int NextIndex; 办法 1.构造函数 public Table() { for(int i=0;i<3;i++){users.Add(new User(“”,null));} timer.Elapsed+=new Timers.ElapsedEventHandler(Check);//添加 timer.Interval = Confige.sleeptime;//间隔时间 TABLESTATE=TableState.wait;//桌面状态 } 2.添加顾客 public AddUser(string connected,AsyncUserToken); 3.判断当前桌子所有玩家与否都准备 public bool isallzhunbei(); 4.发牌(发牌办法上面已有详细说名) public void Shuffle(); 5.排牌算法(排序算法上面有详细阐明) p
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 研究报告 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服