资源描述
毕业设计(论文) 第35页
毕业设计(论文)
设计(论文)题目: 长沙麻将游戏系统的设计
与开发
学生姓名:
学生学号:
专业班级:
指导老师:
院长 (系主任):
年5月21日
长沙麻将游戏系统的设计与开发
摘 要
在互联网高度发达的今天,网络游戏得到了很大的普及。如今网络上的游戏普遍存在地域性特点不强的缺点。本课题将开发一个长沙本地化的麻将游戏,它有着自身独特的打牌方式,并加入了长沙本地化语音功能。
本系统的设计考虑到了系统的高可移植性,高可用性等特点。系统结构采用C/S模式,运用了多线程技术,并利用TCP协议来实现服务器与客户端之间信息的传递。游戏规则的制定在服务器端用单独的类来实现。将来只需要做少许修改,就可支持其他地域的游戏规则。考虑到玩家游戏过程中的速度体验,系统设计中,我们将各种复杂的计算都在服务器端处理,客户端只是简单的显示信息,这样游戏过程中速度将是非常快的。本设计的创新性在于它采用了面向对象的设计思路,将语音功能,计分功能等单独封。这样,只需要对这些单独的模块稍作修改,就可满足不同地域的需求,提高的系统的“扩展性”。
该系统很好的实现了麻将游戏的长沙本地化特点。游戏在本机测试过程中运行良好,同时语音系统也能正常工作,证实了系统的设计和开发都得到了理想的结果。
关键词:长沙麻将,多线程,TCP协议,C/S模式,语音功能
The design and development of "Changsha Majiang"
ABSTRACT
In highly developed Internet today, the network game was much universal. Now the network games on the widespread have many shortcomings, such as geographical characteristics is not strong. This topic will develop a majiang game in Changsha localization, which has its own unique way of playing cards, and we also append localization of voice function to this game.
The design of the system takes into account the high portability and high availability features. We used C/S system architecture model, multithreading technology, and we used TCP protocol to transfer of information between server and clients. Rules of the game were constituted in the server with a separate category. In the future, the game only needs some small modifications to support other geographical rules. Taking into account of the player's feeling when they playing the game, we will all have complicated calculations on the server side, the client only simply display information. So the speed of this game will be very fast.
The innovation in design lies in its use of the object-oriented design. The function of voice and calculate score is achieved in a separate category. Thus, they only need to make some modifications in these separate modules; it can meet the needs of different regions, which improve the system "scalability."
The system achieved a very good localization features. Games in the course of the test run good, and voice system can work well, too. All of these confirmed that the system design and development has been the desired results.
Keywords: Changsha majiang, multithreading, TCP protocol, C/S mode, voice function
目录
1绪论 1
1.1课题背景与长沙麻将设计的目的 1
1.1.1课题背景 1
1.1.2 长沙麻将设计的目的 2
1.2 网络游戏的市场现状 2
1.2.1 中韩游戏领域对比分析 2
1.2.2 中国网络游戏存在的问题 4
1.3 长沙麻将设计的内容和意义 5
2长沙麻将设计的相关技术介绍 7
2.1 客户端/服务器(C/S)模式介绍 7
2.2 基于JDBC的数据库操作 8
2.3 基于Socket的网络传输 9
2.4 多线程的介绍及应用 10
3长沙麻将总体设计与实现 11
3.1 长沙麻将总体设计思想 11
3.2 服务器与客户端设计 11
3.2.1 并发的,面向连接服务器的算法 12
3.2.2 TCP客户算法 13
3.3 各模块设计 13
3.4 吃牌,碰牌,胡牌算法实现 19
4长沙麻将运行结果及分析 25
4.1 游戏运行环境 25
4.2 游戏运行结果 25
结论与展望 32
致谢 33
参考文献: 34
1绪论
1.1课题背景与长沙麻将设计的目的
1.1.1课题背景
中国的网络游戏萌芽于1995年以前。这一时期的单机版的游戏在国内已经形成一定的气候,并向联机版游戏过渡;为网络游戏在中国得以快速发展在人才和技术等方面做了储备。2001年至今正式进入了中国网络游戏的高速成长期。网络游戏在发展期已经呈现出一定的赢利潜力和广阔的发展空间,因此,正在为现金收入烦恼的网络公司不约而同地将目光投入到网络游戏,并且采取了实际的行动。
2005年,中国游戏产业经历了由引进代理向自主创新转折的重要一年。在这一年中,网络游戏产业继续保持了2004年的增长势头,用户达到2634万,比2004年增长了30.1%;网络游戏出版市场实际销售收入达到了37.7亿元,比2004年增长了52.6%。全国从事游戏自主研发的团队由2004年的73家增长到2005年的120多家,增长比例为37%;开发的大中型网游作品达到192款,较之2004年的109款增加了83款,增长幅度达76%。游戏研发从业人员数从2004年的4000多人,增长到12600人,增长幅度超过了200%。2005年中国民族原创网络游戏的市场占有率已经达到60%以上[1]。
2006年上半年中国互联网游戏市场规模达到32.75亿元,前三家的市场份额达到64.42%,相较于2005年同期的51%有较大幅度的增长,市场集中度进一步提升。同时网易的市场份额超过盛大,达到28.6%,盛大的市场份额为20.9%,九城的市场份额为15.0%,腾讯的市场份额为10.0%[1]。
中国的网络游戏玩家已经达到2633万人,但目前国内仅有游戏技术人员几千人,这其中的缺口达到1.5万人以上。然而网络游戏业务若想持续表现良好并稳定增长,重要原因在于对研发的重视和投入,研发团队的能力和经验,已经成了网络游戏方面重要的核心竞争力之一[1]。
未来发展趋势预测:行业整合加剧,会迅速出现几个行业研究开发巨头;收费降低,进入免费,增值收费的模式将迅速普及;产品市场细分;国内研究开发实力的崛起;教育类、益智类游戏将迅速提高娱乐性、挑战性和画面的精美程度,减少教育内容和成分,从而得到玩家的认可,迅速提高在游戏类市场中的比重;流通领域在竞争中将起到越来越重要的作用。
1.1.2 长沙麻将设计的目的
目前国内市场上的大部分网络游戏都是面向全国广大游戏玩家设计的,诚然这减小了开发商的开发成本,但却导致了很多游戏的地域性特点无法得到体现,比如相同的游戏,在不同地域可能游戏规则存在着细微的差别,如果开发商不注意这些细节,忽略玩家的感觉,将导致严重的后果,这也是当前国内游戏开发商必须严肃面对的一个问题。
本课题的目的在于改善当前市场上部分游戏产品,无法满足某些特定地区人群习惯的缺点。通过市场调研,得到当前长沙人在网络游戏的一些独特需求,为了更好的服务长沙人的娱乐休闲生活,制定了开发“长沙游戏”的计划。
为了确保该游戏具有长沙本地化的特点,在系统中加入了长沙本地语音功能。同时,研究了长沙麻将的一些特殊打法,这些都将在游戏中体现出来。游戏本身选用JAVA来开发,其目的是为了将来可以将系统移植到其他平台上去。
本游戏的设计模式以及设计思路将为游戏开发商提供一个指导方向。
1.2 网络游戏的市场现状
1.2.1 中韩游戏领域对比分析
这里我们将对比中国和韩国游戏领域的情况。
近几年,中国网络游戏市场规模急剧扩大,大大小小的网络游戏公司如雨后春笋般涌现。各路商家携巨资攻打网游市场,这足以证明整个网游产业的强劲发展势头。对比于前几年中国市场空白状态下韩国游戏独领风骚的局面,如今国内网络游戏市场群雄逐鹿,竞争异常激烈。面对越来越多的国外游戏进入,国内的网游也迅速成长,不甘蛰伏于他人旗下。那么与网游业发达的韩国相比,国内的网游是什么样的状况呢?
先看看韩国的情况。有人说“从来都没有在一个领域韩国的一举一动如此受世人瞩目过,除了游戏”,虽然夸张了些,但是国家的扶持和宽带的普及确实促成了韩国网游产业的繁荣。韩国网络游戏公司2004年的销售额达到了6.4亿美元。 在网游玩家眼里,韩国可谓是不争的“麦加之地”。韩国国内的游戏制作及经营企业达到了1500多家,网吧等游戏场所46900个,8个包括韩国政府部门下属韩国尖端游戏产业协会KESA和韩国游戏支援中心KGPC在内的游戏协会,在288家有IT相关学位的大学中由政府指定赞助的10家游戏大学及研究院,6大包括On Game Net、在内的有线电视和卫星广播专业游戏频道等组成的游戏产业群[2]。
韩国网游有鲜明的产业特征。首先是政府支持,制定一系列的相关政策和优惠措施,鼓励国内企业发展以宽带、游戏为代表的信息产业。其次是本土化,其本土游戏在国内占据了绝对的主导地位,其游戏内容也有显著的本土化性格特征。再次是系统化,空前发达的网络环境为游戏产业的运营提供了保障,游戏真正成为一项系统化发展的产业,并且与相关事业密不可分。网吧的盛行、传媒的造势、教育的配合、企业的支持、各类游戏竞赛的举办等等,多方面、多层次的配合推动了网游行业的健康发展。另外,韩国公众媒体在消除人们对游戏负面影响的过程中也扮演了重要的角色。近几年来,韩国电视和报纸一直将游戏产业作为一块正在崛起的新兴市场进行广泛宣传,将游戏开发作为信息技术的前沿阵地来造势。观念的转变刺激了网络游戏的突飞猛进。
与之相比,中国的网络游戏产业则还处于起步阶段。第一,由于文化背景的差异,很长时间以来,社会舆论大都对网络游戏持不支持甚至反对态度。这种观念下造成的社会环境是对网游产业形成的无形制约。第二,技术瓶颈,目前我国网络游戏市场基本上以代理国外游戏为主,核心技术的80%为国外控制[27]。国内市场近乎爆发式的快速发育,使得国内企业根本来不及作出准备,国外的优秀产品趁虚而入,抢占先机,而代理国外产品很容易获利,不少国内企业也因此而失去研发热情,只有为数不多的几家公司在苦苦支撑。第三,与中国网络游戏产业的庞大规模和增长速度相比,政府在制定规则和加强监管方面显得苍白无力。对待网游,国内政府的态度可谓是一波三折。自从2004年初部分人大代表在人大会上表达了对网络游戏的意见之后,2004年4月12日国家广电总局就电脑网络游戏类节目的问题发出了《关于禁止播出电脑网络游戏类节目的通知》。很多我们熟知的游戏节目从电视中消失了,其中比较著名的有中央电视台5套的《电子竞技世界》、旅游卫视的《游戏东西》等[2]。
好在人们的认识总是在不断变化发展之中的。2004年10月,新闻出版总署推出了“中国民族网络游戏重点出版工程”,标志着政府部门对中国网络游戏态度的转变,该工程计划将在未来5年内投资10~20亿元,产出100种国产网络游戏[27]。近期,网络游戏技术研发也首次被纳入国家863科技计划,显示了政府在游戏领域自主研发的决心[27]。
另一方面值得庆幸的是,随着越来越多的中国游戏人的成长,国内网游公司纷纷注意到了技术相对于整个网络游戏产业经济起到的决定性作用。越来越多的公司加入到了自主开发的阵列,《剑侠online》、《海之乐章》、《刀剑online》、《傲世online》、《大话西游》等等,也分别占据了国内市场的一部分份额。但是技术的发展并不是一个一蹴而就的过程,无论是网络游戏表层的在客户端技术开发等可见领域,还是包括平衡性等在内的后台不可见因素,这些都需要时间的积累[2]。
如今,欧美的各大游戏商也纷纷打入国内市场,曾经认为欧美网游不太适应中国市场的看法也随着《魔兽世界》的一声炮响被砸得灰飞烟灭,韩国网游在中国已不再是一枝独秀。据报道,目前只有2个韩国网游,即的《泡泡堂》和的《天堂II》达到过中国网游榜的前五。这不是说韩国网游产业已经落后了,只是其他国家已经赶上来了,不是说韩国没有好游戏了,只不过玩家可选择的范围扩大了。
韩国网游作为中国游戏行业发展历程当中一个特殊而又重要的现象,萦绕在中国玩家的心中已经很多年了。从凸现江湖到呼风唤雨再到盛极而衰,韩国网游走过了一条似乎很符合产品寿命周期规律的道路。它能否再度在国内市场崛起,我们没有特别期待,只是有点好奇。我们真正期待的是,中国本土的网络游戏什么时候才能收复失去的领土.
1.2.2 中国网络游戏存在的问题
金山公司主管网游研发的张志宏曾表示金山早已在2000年开始对游戏引擎进行攻关,如今已将自己开发的游戏引擎应用到了《剑侠情缘》中。技术的进步使得国内网游商家发展自主研发运营网络游戏一体化更加得心应手,网络游戏发展更加迅速。
攻克了技术障碍,政府政策的扶持更是让网游商家信心倍增。去年8月,国家“863计划”让国产网络游戏发展“昂首阔步”;今年,国家新闻出版总署明确指出,支持具有自主知识产权的数字娱乐软件开发,对网络游戏进口采取部分限制。
从快速增长的市场产值到商家企业的业绩增长以及网络游戏发展带来的经济效益,商家毫无理由不选择投资网络游戏产业。同时它也带动了电信、电脑软硬件、网吧等产业的发展,日渐完善的网络游戏产业链亦将带给各类商家更多的发展机会。
网络游戏发展前景光明,受到商家青睐。但要进一步做大网游市场并非易事,需要网络游戏商家从传统游戏代理向自主研发转变,同时创新内容、拓展营销渠道。 网络游戏还是个发展中的产业,网游商家欲做大网游市场,还需从多方面进行完善。
转变目前的代理运营进口游戏,大力发展研发自主产权的网络游戏产品,实行研发运营一体化都是当务之急。目前,国内的网游商家已具有了独立研发网络游戏产品能力。自主研发将是网络游戏的发展发向。当技术不再是网络游戏的障碍的时候,网络游戏会得到发展,而发展则意味着需要创新。
目前中国网络游戏与国外游戏比较面临着游戏内容的创意匮乏问题。金山公司张志宏表示“金山目前网络游戏研发人员已近200人,差不多相当于金山研发人员总数的一半。技术上我们跟国外已没有太大的差别,但是我们具有游戏创意的人员极度缺乏,而且这还不仅是金山一家存在的问题” [2]。国内自主研发的网络游戏需要在游戏内容上完善创新,才能超越国外同类游戏,吸引更多的消费者,实现网络游戏的持续快速发展。
1.3 长沙麻将设计的内容和意义
本课题通过对网络上现有游戏的分析,结合不同地域游戏规则的不一致,制定了长沙麻将游戏的开发计划。为了更好的体现地域性的特点,游戏中加入了长沙本地化的方言语音功能。
本课题做到了以下三方面:
科学性:本系统结构采用C/S模式,运用了多线程技术,并利用TCP协议来实现服务器与客户端之间信息的传递,而且各种游戏规则的制定及判断都是在服务器端完成。这样,系统将支持多人同时在线游戏,同时各种信息的传递都将是准确的,可信的。客户端处理信息的速度也是很快的。
创新性:它采用了面向对象的设计思路,将语音功能,计分功能等单独封装,这样,只需要对这些单独的模块稍作修改,就可满足不同地域的需求,提高的系统的“扩展性”。
实用性:游戏采用了C/S模式开发,用户只需要下载客户端安装后,就可以进入游戏厅和网络上的人一起游戏。
正如金山公司主管网游研发的张志宏说过的那样,现在中国在游戏开发的技术方面和国外差距不大了,国内游戏唯一不足的地方在于游戏创意上。有了好的创意,才能吸引到更多的游戏玩家。本课题尝试着让网络游戏跟着消费者的口味走,改变以往开发商开发什么游戏,玩家就只能按照开发商制定的规则去游戏的方式。相信如果中国所有的游戏开发商都可以在自己的产品中加入更多的创意,中国游戏产业的发展一定不可估量!
2长沙麻将设计的相关技术介绍
2.1 客户端/服务器(C/S)模式介绍
C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。
C/S架构软件的优势与劣势:
(1)应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。
(2)数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。
(3)C/S架构的劣势是高昂的维护成本且投资大。采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。
2.2 基于JDBC的数据库操作
JDBC是Java的开发者Sun的公司制定的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各种常用数据库提供无缝联接的技术。JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。,称为开放式数据库互联技术,是由Microsoft公司倡导并得到业界普遍响应的一门数据库连接技术,如果读者有使用ODBC编程的经验,就会发现JDBC与ODBC很类似。JDBC现在可以连接的数据库包括:以及Paradox等。
JDBC的工作机制: SQL(Structure Query Language:结构化查询语言)是一种标准化的关系型数据库访问语言。在SQL看来,数据库就是表的集合,其中包含了行和列。SQL标准虽然也还处在不断变革之中,但其基本内容相对稳定。JDBC定义了Java语言同SQL数据之间的程序设计接口。
JDBC有一个非常独特的动态连接结构,它使得系统模块化。使用JDBC来完成对数据库的访问包括以下四个主要组件:Java的应用程序、JDBC驱动器管理器、驱动器和数据源。
公司开发了JDBC API,JDBC API是一个标准统一的SQL数据存取接口。JDBC在Internet中的作用与ODBC在Windows系列中的作用类似。它为Java程序提供了一个统一缝地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性,而且在Internet上确实无法预料你的用户想访问什么类型的数据库。只要系统上安装了正确的驱动程序,JDBC应用程序就可以访问其相关的数据库。
用JDBC来实现访问数据库记录可以采用下面的几个步骤:
1、 通过驱动程序获取连接接口。
2、 获得Statement或它的子类。
3、 限制Statement中的参数。
4、 执行Statement。
5、 查看返回的行数是否超出范围。
6、 关闭Statement。
7、 处理其它的Statement
8、 关闭连接接口。
2.3 基于Socket的网络传输
TCP/IP(传输控制协议/网间协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式。TCP/IP是INTERNET的基础协议,也是一种电脑数据打包和寻址的标准方法。在数据传送中,可以形象地理解为有两个信封,TCP和IP就像是信封,要传递的信息被划分成若干段,每一段塞入一个TCP信封,并在该信封面上记录有分段号的信息,再将TCP信封塞入IP大信封,发送上网。在接受端,一个TCP软件包收集信封,抽出数据,按发送前的顺序还原,并加以校验,若发现差错,TCP将会要求重发。因此,TCP/IP在INTERNET中几乎可以无差错地传送数据。
socket 用来让一个进程和其他的进程互通信息(IPC),而Socket接口是TCP/IP网络的API接口函数。Socket最先应用于Unix操作系统,如果了解Unix系统的I/O的话,就很容易了解Socket了,因为Socket数据传输其实就是一种特殊的I/O。
在Java中,通过将连接功能封装到套接字类里而使得网络编程更加容易。套接字类即Socket类(它创建一个客户套接字)和类(它创建一个服务器套接字)。套接字类大致介绍如下:
Socket是基类,它支持TCP协议。TCP是一个可靠的流网络连接协议。Socket类提供了流输入/输出的方法,使得从套接字中读出数据和往套接字中写数据都很容易。该类对于编写因特网上的通讯程序而言是必不可少的。
是一个因特网服务程序用来监听客户请求的类。实际上并不执行服务;而是创建了一个Socket对象来代表客户机。通讯由创建的对象来完成。
在本课题中,在服务器端设置一个类进行监听,对每一个客户端的请求产生一个Socket类与之进行通信。通过这个连接的Socket,将客户端的数据文件传输到服务器端。
2.4 多线程的介绍及应用
线程也称为轻型进程 (LWP)。因为线程只能在单个进程的作用域内活动,所以创建线程比创建进程要廉价得多。这样,因为线程允许协作和数据交换,并且在计算资源方面非常廉价,所以线程比进程更可取。线程需要操作系统的支持,因此不是所有的机器都提供线程。Java 编程语言,作为相当新的一种语言,已将线程支持与语言本身合为一体,这样就对线程提供了强健的支持。
Java 编程语言使多线程比在其他语言中药容易的多。需要注意的是 main() 函数也是一个线程,并可用来做有用的工作。只有在需要多个线程时才需要创建新的线程。Thread 类是一个具体的类,即不是抽象类,该类封装了线程的行为。要创建一个线程,程序员必须创建一个从 Thread 类导出的新类。程序员必须覆盖 Thread 的 run() 函数来完成有用的工作。用户并不直接调用此函数;而是必须调用 Thread 的 start() 函数,该函数再调用 run()。
在本课题中根据实际需要,也充分利用了多线程,当有新的游戏玩家登陆系统后,服务器端将会使用一个新的线程与之通信,直到该玩家退出游戏。采用多线程技术后,系统叫支持多人同时在线游戏。
3长沙麻将总体设计与实现
3.1 长沙麻将总体设计思想
该游戏是一个支持多用户同时在线,对安全性,访问速度要求都比较高的系统,这里我们将采用C/S模式,运用了多线程技术,并利用TCP协议来实现服务器与客户端之间信息的传递,而且各种游戏规则的制定及判断都是在服务器端完成。这样,系统将支持多人同时在线游戏,同时各种信息的传递都将是准确的,可信的。客户端处理信息的速度也是很快的。同时,它采用了面向对象的设计思路,将语音功能,计分功能等单独封装,这样,只需要对这些单独的模块稍作修改,就可满足不同地域的需求,提高的系统的“扩展性”。由于游戏采用了C/S模式开发,用户只需要下载客户端安装后,就可以进入游戏厅和网络上的人一起游戏。数据库采用了“连接池”的方式,在启动服务器的时候,将会在连接池中放了400的连接,一旦有客户请求到达服务器是时候,就可以直接从连接池中取得一个连接来满足客户的请求,这样做可以提高对数据库的访问速度。
3.2 服务器与客户端设计
常见的服务器类型有:循环的,无连接的服务器;循环的,面向连接的服务器;并发的,无连接的服务器;并发的,面向连接的服务器。
循环的,无连接的服务器是最常见的无连接服务器形式,特别适应于要求对每个请求进行少量处理的服务。循环服务器往往是无状态的,这使其容易理解而且不易出错。
循环的,面向连接的服务器是一种较常见的服务器类型,它适用于要求对每个请求进行少量处理,但要求有可靠的传输。因为与建立和终止连接相关的开销可能很高,平均响应时间可能并不短。
并发的,无连接的服务器是一种不常见的服务器类型,服务器要为处理每个请求创建一个新线程或者进程。在许多系统中,创建线程或进程所增加的开销决定了并发性所获得的效率。为证明并发是可取的,要么创建一个新线程或进程所要求的时间必须明显小于计算响应是需的时间,要么并发的请求必须能够同时使用多个I/O设备。
并发的,面向连接的服务器是最一般的服务器类型,因为他提供了可靠的传输以及并发处理多个请求的能力。在并发线程的实现方法中,主服务器线程为每个连接创建一个从线程以便对其进行处理。使用多线程使如下情况变得容易,即为每个连接执行一个单独编译的程序,而不是将所有的代码放在一个单独的,巨大的服务器程序中。
综合考虑到游戏程序需要多人同时在线游戏,而且必须对游戏过程中信息的交互提供可靠的传输,我们选择了使用并发的,面向连接的服务器。
3.2.1 并发的,面向连接服务器的算法
主1. 创建套接字并将其绑定到所提供服务的熟知地址上,并让该套接字保持非连接。
主2. 将该端口设置为被动模式,使其准备为服务器所用。
主3. 反复调用accept以便接收来自客户的下一个连接请求,并创建新的从线程来处理响应。
从1. 由主线程传递来的连接请求(即针对连接的套接字)开始。
从2. 用该连接与客户进行交互:读取请求并发回响应。
从3. 关闭连接并退出。在处理完来自客户的所有请求后,从线程退出。
并发线程结构图:
图3-1 并发线程结构图
主服务器线程不与客户直接通信,它只是在熟知端口上等待下一个连接请求。一旦某个请求到达,主服务器线程会接收这个连接请求,并创建一个新的套接字线程来处理该连接。在任何时刻,服务器都包括一个主线程,以及零个或者多个从线程。
3.2.2 TCP客户算法
1、找到期望与之通信的服务器的IP地址和协议端口号。
2、 配套接字。
3、 这个套接字连接到服务器。
4、 使用应用级协议与服务器通信(在此包含发送请求和等待应答)。
5、 关闭连接。
3.3 各模块设计
系统分3个部分来开发:
部分封装了对数据库的操作,其他2个部分都将用到所提供的接口来实现对数据信息的读取及修改。
部分为游戏的客户端程序,安装客户端后,可以登陆到服务器上,即可实现与其他玩家一起游戏。
部分为服务器安装程序,用他来实现各玩家之间信息的交互以及信息的分析。
部分包括2个类:和
图3-2 database类图
说明:类封装了数据库的连接,包含对该连接的一些基本操作,以及该连接是否可用等信息。
类封装连接池的信息,当有新的连接请求时,会到连接池中去选择某个合适的连接。这样做的好处是,当客户端有新的连接请求到达时,可以直接返回某个对数据库的连接,节省了连接建立过程所需要的时间,提高了系统的反应速度。
部分包括9个类:,,,,,,,,。
图3-3 MaJiang类图
说明:
Login类主要包括了登陆界面的初始化以及客户端套接字的建立,Login的实例通过新建一个Connect类的实例,通过将刚才建立的socket传递给该实例,来实现与服务器端信息的交互。当从服务器端返回“new”信息后,释放Login实例,通过实例化一个类的实例,玩家进入了游戏大厅。
类初始化大厅信息,并通过新建Listen类的实例,来实现与服务器端信息的交互。当玩家选择某张桌子坐下后,将游戏大厅设置为隐藏,并新建类的实例,该实例会初始化桌台信息,并通过Play类实现与服务器端信息的交互。其中Game类封装了对玩家手中牌信息的一些处理,User则为当前玩家的个人信息。
Server部分包括5个类:,Client,Game,Server,Watch。
图3-4 Server类图
说明:Server类主要初始化服务器信息,并创建一个主动套接字。通过Watch类来实现监听客户端的连接信息,并新建一个新的套接字。Client类获得新的套接字来实现与该客户的通信。Game类为本系统的核心部分,他实现了各种牌面信息的处理,包括胡牌,吃牌等信息的判断。类作为一个单独的模块,专门用来处理计分。
部分主要流程图如下:
图3-5 进入大厅流程图
说明:用户首先进入登陆界面,在这里系统需要初始化登陆界面的信息,并为“登陆”绑定事件。此时若用户按下了登陆按钮,则会根据用户信息去判断用户是否为合法用户。如果为合法用户,客户端会马上向服务器端发送相关个人信息,如用户名,用户编号以及登陆IP地址,同时会新建一个Connect类的实例,并用它实现与服务器端信息的交流。
由于此时客户端已经给服务器端发送了用户的登陆信息,服务器会返回一个包含“NEW”的字符串信息,表示玩家已经成功登陆了系统。此时会停止Connect实例的运行,并进入到游戏大厅,包括初始化大厅信息,为各张桌子注册事件触发信息。同时会新建一个Listen类的实例,并用它实现与服务器端信息的交流,而且此时用到的Socket和前面Socket为同一个。
图3-6 启动服务器流程图
说明:启动服务器后,首先会进行服务器端界面信息的初始化,同时会创建一个主动套接字,用来监听客户端的连接请求信息。当接收到这样的一个连接请求后,该主动套接字会新建一个Client类的实例,并将接收到的客户端套接字传递给这个Client类的实例来实现与客户端信息的交互。
图3-7 进入游戏流程图
说明:玩家在大厅内选择了某张桌子后,会将大厅设置为隐藏,同时会新建一个类的实例,包括了桌台信息的初始化和在该类实例中新建一个Play类的实例来实现与服务器信息的交互。
客户端有个Game类,里面包括了存储玩家手中牌信息以及对玩家手中牌信息进行排序等功能。
服务器端也有个Game类,里面包括了当一个牌局开始时,初始化牌信息,以及玩家在游戏个过程中对牌信息的分析处理,包括了吃牌算法,碰牌算法,胡牌算法等。本系统的服务器端算法都封装在Game类中。
3.4 吃牌,碰牌,胡牌算法实现
在本系统中,我们将为每张牌图片取一个名字。因为一共有27张不同的牌,所以牌图片的名字为0到26的连续数字。具体做法为:‘一万’到‘九万’用0到8的连续数字表示;‘一条’到‘九条’用9到17的连续数字表示;‘一丙’到‘九丙’用18到26的连续数字表示。如:
图3-8 麻将信息图
由于每张牌的名字都是一个特定数字,这样在处理吃牌,碰牌以及胡牌时,只要先获得牌所对应的数字信息,牌信息的处理就变成了简单的对数字的处理了。另外在服务器用一个保存玩家的牌值,另外用一个保存玩家各张牌所对应牌的张数。
吃牌算法描述:我们将所有的牌分为5类,具体方法为:‘一万’,‘一条’,‘一丙’为第一类;‘二万’,‘二条’,‘二丙’为第二类;‘八万’,‘八条’,‘八丙’为第三类;‘九万’,‘九条’,‘九丙’为第四类;其他为第五类。
当一个玩家打出一张牌后,该牌信息会传递到服务器,而服务器保存了所有玩家的牌信息。此时,服务器只需要判断该玩家的下家是否可以吃牌。为了处理方便,我们假设玩家打出的牌为,其下家为玩家B。
判断能否吃牌的规则为:
若为第一类牌,而且玩家B中同时存在牌值为和的牌,则可以吃牌,否则不可以。如玩家打出了‘一万’,其下家只可以用‘二万’和‘三万’去吃。
若为第二类牌,而且玩家B中同时存在牌值为和的牌,或者同时存在牌值为和的牌,则可以吃牌,否则不可以。如玩家打出了‘二万’,其下家若同时有‘一万’和‘三万’,或者同时有‘三万’和‘四万’,则可以吃,否则不可以吃。
若为第三类牌,而且玩家B中同时存在牌值为和的牌,或者同时存在牌值为和的牌,则可以吃牌,否则不可以。如玩家打出了‘八万’,其下家若同时有‘六万’和‘七万’,
展开阅读全文