资源描述
浙江工业大学本科毕业设计文献综述
在线纸牌游戏的设计与实现
摘要:本文是关于在线纸牌游戏的设计与实现的一篇文献综述。随着互联网的发展,网络游戏受到越来越多人的接受和喜爱,其中纸牌类游戏因其历史悠久、用户众多而成为网络游戏市场中占据很大份额的一部分。在本文中,简述了在线纸牌游戏的基本结构、并论述纸牌游戏客户端和服务端的设计模型和具体流程,给出相关交互协议,使用Socket和多线程实现该系统。
关键词:在线游戏、纸牌、多线程、SOCKET
一、引言
纸牌的历史相当悠久,早在汉代,我国就出现了一种叫做“叶子戏”的纸牌游戏。据说是大将军韩信为了减轻士兵出门打仗的思乡之愁,在军中发明了它。叶子戏可以说是世界最早的扑克牌雏形了。到了唐代中期,开始有了关于叶子戏的文字记载,一个叫叶子青的人还撰写了一部叶子戏的专著《叶子格》,详细记载了叶子戏的玩法,说明在当时它已经相当成熟了。大约在13世纪,中国的叶子戏传入欧洲,经过数百年的演变,融合了中外各国的纸牌游戏,才逐渐形成了今天国际公认的纸牌模式――扑克牌[1]。
中华民族是一个有着几千年悠久历史和璀璨文化的国家,而纸牌游戏却早已突破了纯游戏的范畴而成为中国传统文化的一个分支。纸牌游戏在中国拥有良好的群众基础,并得到了广泛的普及,在经过几千年的衍化之后,其精髓已经达到了登峰造极的地步。它旺盛的生命力非一般性娱乐项目所能比拟。而一些纸牌游戏在经过千百年来的不断发展后,已经成为民族文化不可分割的一个重要组成部分。
随着Internet的普及,网络游戏发展速度很快,纸牌游戏也不例外。纸牌网络游戏软件大多是多用户模式,用户操作具有并发性的特点,所以需要基于线程机制来编程,多线程编程能够为游戏各方提供底层的信息通信、协调各方的执行顺序[2]。
二、研究意义
近代传入中国后极度盛行的西方纸牌类娱乐,在进入中国后也慢慢演变成了多种趣味横生的玩法,如:争上游、拖拉机、斗地主等等这些日常我们生活中最常见的多人纸牌类游戏已成为中国老百姓最大众化的一种消遣娱乐的方法。随着中西文化的不断碰撞,这些原本并不为中国人所接受的对弈工具和方式也逐渐的被中国人老百姓所接受和喜爱,且不乏有国际高手出现。近几年来扑克游戏发展迅速,成为人们茶后饭余,亲朋聚会的热门话题。
中国是一个扑克大国,也有大量忠实的游戏玩家。如何使这项有着广大爱好者的智力竞技运动提高到一个高度,也是许多人苦苦思索的问题,美国有代表世界扑克最高水平的“世界扑克锦标赛”,并且在2004年秋首次在ESPN黄金时段播出“世界扑克锦标赛”以后,更加使扑克游戏得到了全面的发展。
我国拥有世界最多扑克玩家,而线下的纸牌游戏耗时太久、也不易找对家,而且一般初出道的玩家都不喜欢面对对手在牌桌上的咄咄逼人,在线上他们则没有这些顾虑,把发牌和数筹码的工作留给电脑,不但节省时间,也去掉了牌局之间的冷场。同时,打牌不用约时间,足不出户即有成千上万个来自各个国家的对手和你切磋,这是现实生活中所无法做到的,所以在线纸牌游戏的开发将会越来越受欢迎。
网络让天涯咫尺,有了在线纸牌游戏这样的平台介质,亲朋好友纵使天各一方也可以像聚在一起的时候那样,打打扑克,边游戏边谈心。相比那些奇思异想的虚幻世界为背景网络游戏来讲,网络纸牌游戏更多了些温馨,少了点喧嚣,它给玩家们带去的不是构筑假想空间虚荣心的满足,而是更接近于真实生活的快乐。
三、国内外研究现状及难点
许多公司都致力于把拥有悠久文化传统和深厚群众基础的传统棋牌类游戏搬上网,在探索具有网络特色的比赛规则、比赛形式、比赛制度等方面,取得了大量有益的经验。
现在国内主要的扑克游戏平台有比较早的联众世界,还有后来居上的QQ游戏,以及以德州扑克游戏闻名的扑克巴巴吧平台,平台中的纸牌游戏也越来越丰盛,基于方便快捷,受到越来越多玩家的喜爱。中国是扑克大国,有着无数的忠实玩家,虽平台众多,但还是缺少一些当地特色游戏的制作,是许多平台在游戏设计中的空缺,因为设计当地特色在线纸牌游戏也是迫在眉睫,介于玩家的喜爱,在线纸牌游戏的设计在互联网上还有很大的发展空间。
由此看来,目前国内的在线纸牌游戏市场正随着网络的高速普及而不断的发展壮大,大型网络游戏近年来的繁荣并没有导致在线棋牌游戏的衰退,相反还起到了相辅相成,极大的丰富了人们网络娱乐生活的作用。这也是在线纸牌游戏进一步繁荣,百花其放的原因之所在,相比大型网络游戏产业的喧嚣和种种急功近利的表现。这些纸牌游戏带给我们更多的却是一份值得信任的稳重感。
目前,一些较流行的开发语言,如Visual C[3] ,Borland C[4] 和Java等都支持线程编程。在网络日趋成为未来趋势的形势下,Java语言的地位越来越突出,越受到人们的重视,利用Java语言来编写网络应用程序,会使设计人员感到意想不到的简单与快捷,也为编写在线游戏带来方便,因此在这种互联网形式下,越来越多的设计人员选择Java语言来开发纸牌游戏。
而本系统的难点主要在于实现服务端与客户端之间通信(即构建多客户端与服务器端的网络通信构架),以及一些SOCKET和多线程编程。对于纸牌游戏本身,如何将规则转换为算法,如何设计游戏开局的发牌都将是一些难点。
四、纸牌游戏的系统设计思想
4.1基本架构介绍
现在的纸牌游戏实现架构主要分为二类:C/S和B/S。
C/S[5]结构的在线纸牌游戏,C/S 网络应用程序即客户/服务器网络应用程序。其工作原理是:首先通过客户端应用程序接收客户的服务请求;其次通过服务器端应用程序从后台数据库中读取数据对客户的请求进行服务;最后再由服务器端应用程序对处理后的数据写入后台数据库[6]。执行过程如图4.1所示:
JDBC-ODBC
socket(tcp)
socket(tcp)
socket(tcp)
后台数据库
服务器
客户
客户
客户
图4.1 C/S执行过程
B/S[7]结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构[8]。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。
通常如果要求系统的响应要求快,又是用于局域网内部或机关企事业单位内部的系统,可以采用C/S结构模式。但如果用户不在同一局域网内,而是分散在各个不同的地方或处于不同的单位,在这种情况下B/S结构模式通常比较适合。C/S程序具有好的交互性,功能强大,但是客户端必须安装客户端软件,限制了其应用;B/S模式下要求客户端具有浏览器,但浏览器在安全方面有一些限制,交互性与功能有一些限制。
在线纸牌游戏系统,对交互性要求较高。本系统选用了C/S 模式进行实现,网络内部使用TCP/IP方式利用Socket通过传输层提供的服务,使用Java进行图形用户的搭建。在C/S模式游戏中,Server一般提供所有用户的全局信息,并能提供客户之间的信息转发,客户之间的通讯必须通过Server进行,因为多个客户能够连接到同一台Server上,所以Server必须用Thread负责每个用户的通讯和消息处理:服务端程序通过一个Thread监听客户端的连接,一旦客户连接,为该客户建立连接并启动一个特定的客户Thread,利用该连接不断从客户读取数据,实现客户和服务器或者客户与客户之间的信息的交互。[9]
4.2 纸牌设计思路
本游戏主要分为两个部分,游戏服务端和游戏客户端。游戏服务端主要存储所有连线玩家的相关信息及各种状态,并负责游戏客户之间信息的传递,游戏客户端提供客户连接服务器,创建、加入、退出游戏等功能,并能与联网客户进行游戏。
关于在线纸牌游戏角色的设定,通常情况下扑克牌游戏中有三个以上角色,一个是游戏裁判,另外是两个以上的游戏方。游戏裁判负责向游戏方发出牌等提示信息,并负责对游戏作出裁判,游戏方遵照游戏规则出牌[10]。以“跑得快”扑克牌游戏(四方)为例进行具体设计,如图4.2出牌队列所示。出牌队列 (存放游戏方的出牌)。
判断出牌队列中的牌数(count)是否已清,如已清,根据规则裁判,并给出下一步出牌信息
按照提示信息出牌,即选择牌放入出牌队列中,然后执行count++
游戏裁判 取出count count++ 游戏方
、
图4.2 出牌队列
五、系统实现技术方法研究
在线纸牌游戏的实现技术多种多样,所以选择合理的技术来实现系统也是一个重大的环节,如果所选择的技术不当,将对系统的实现造成一定的麻烦,可能还会影响系统的性能。J2EE[11]是实现在线纸牌游戏的一种有效技术,当前用J2EE实现C/S结构的在线纸牌游戏非常的流行且技术也越来越趋于成熟,性能也得到了非常大的提升,是一种更实际的信息化平台架构。
5.1 服务端[12、13、14、15]
服务器端完成的功能是:对服务器的某一可用端口进行监听,以获得客户端请求,从而对客户端请求进行处理。 因为是多用户,所以采用多线程,为每一个在线用户分配一个客户线程,实时处理每个客户端的事务请求。编写子线程类ServerThread 为客户端提供服务。在ServerThread 类中调用JDBC-ODBC 桥技术[16]读取后台数据库中数据完成客户端服务请求;调用输入流类接收客户端传来的数据和服务请求进行处理;最后再次调用JDBC-ODBC 桥技术将处理后的数据写入后台数据库。使用Socket 网络通信技术实现客户端和服务器端的数据通信功能。编写Server 类调用.ServerSocket 类绑定系统某个使用端口,调用accept 方法等待客户端服务请求。当服务器端接收到客户端的服务请求时,创建一个新的Socket 与客户端创建的Socket 连接进行数据通信。
一、建立服务器类
用Java实现服务器类的设计,其主要类Server实现如下:
public class Server{
private ServerSocket serverSocket=null;
pubhc static int port=4444;
… //其他处理
public Server() throws IOException{
try{serverSocket=new ServerSocket(port);}
//建立服务器
Socket
catch(Exception ex) {⋯} //异常处理
while(true) //等待用户连接
addClient(serverSocket.accept());
//接收用户连接请求
serverSocket.close(); //关闭服务器Socket
}
public void addClient(Socket socket)throws IOException{
new ServerThread(socket.this).start();
//创建并启动一个服务器线程
⋯ //其他处理
}
}
其中addClient(serversocket.accept())为每当一个用户连接请求到来时,就创建一个单独的线程来为该用户服务,这是并发服务器实现的关键。
二、建立服务器线程类
每当一个新用户登陆时,服务器端使用newServerThread(socket,this).start()单独创建并启动一个服务器线程,该线程从产生到灭亡(即该用户退出系统)整个过程都只为这个用户服务。该线程主要处理服务器端与该用户有关的信息发送与接收等工作,服务器线程类实现如下:
public class ServerThread extends Thread{
…//成员变量的定义及初始化
public void run { //线程运行处理
try{ //接收和发送信息处理
out=flew PrintWriter(socket.getOutputStream(),true);
in=new BufferedReader(new InputStreamReader(
socket.getlnputStream()));
while((inputLine=in.readLinen())!=null) {
if(inputLine.equalslgnoreCase (“ quit”))break;
ontputLine=jcp.processlnput(inputLine);
server.send(outputLine);
}
}
catch(Exception ex){··}//异常处理
}
private void Close ()//线程关闭处理
try{
server.removeClient(socket);
socket.close();
}
catch(Exception ex) {
ex.printStackTrace(Systemerr);
}
}
5.2客户端
客户端完成的功能是:建立与服务器的连接,向服务器发送功能请求,接收来自服务器的信息,完成与主机或其他客户交互,断开与服务器的连接。客户端程序相对服务器端程序来说属于Light—Weight(轻量级),可称作“瘦客户端”。客户端应用程序使用Java Swing 技术编写用户图形界面接收客户请求,使用Socket 网络通信技术实现客户端和服务器端的数据通信功能。编写Client 类,调用组件类设计用户图形界面,应用Java 事件处理机制编写按钮组件的触发功能,调用.Socket 类绑定服务器端的IP地址和端口,最后调用输出流类向服务器传送数据和服务请求。
一、建立客户端类
客户端由一些Java Applet[17]小程序和Java程序[18]组成。这些程序主要功能是实现用户界面以及和服务器的通信控制,按其功能可以被分为两个独立的部分,分别由不同的类来实现。第一部分主要管理图形用户界面,由类Appletclient实现。第二部分实现和服务器的通信,包括状态信息的传递,由类Client实现。[19]其中Client类实现如下:
public class Client{
Socket socket=null;
private String host;
host=applet.getDocumentBase().getHost();
socket--new Socket(host,Server.port);
//建立客户端Socket
connected=true;
new ClientRecieveThread(socket,applet).start():
//创建并启动客户端线程
…//其他处理
}
二、建立客户端线程类
客户端线程类与服务器线程类功能类似,主要实现客户端与该用户有关的信息的发送与接收等,其实现也同服务器线程类极为类似。图5.1为服务器端与客户端之间的联系。
图5.1 客户端与服务器端的联系
5.3 SOCKET
一个完整的Socket连接可描述的5个要素(5元组):协议、本地地址、本地端口、远地地址、远地端口,它由分处于2台主机的2个socket的半相关描述构成,每个半相关描述为协议、本地地址、本地端口。[20]
Socket是一种网络编程接口,是通信的基石,应用程序通过Socket对象[21]才能访问通信协议。一个套接字是通信的一端,在上面可以找到与其对应的一个名字,一个正在被使用的套接字都有它的类型和与其相关的进程。TCP/IP协议中提供了三种类型的套接字[22]:流式套接字,数据报套接字,原始式套接字。流式套接字作为一种面向连接的套接字,由图5.2可以看出其工作过程如下:服务器首先启动,通过调用socket()建立一个侦听套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器请求建立连接。服务器接收后,建立连接套接字并接收客户机的请求,之后,客户机和服务器之间就可以通过调用recv()和send()来发送和接收数据,待数据传送结束后,双方调用closesocket()关闭套接字,在一般的应用中,为了保证数据传输的正确性和可靠性,一般使用面向连接的套接字进行应用程序间的通信。[23]
客户机
socket()
bind()
connect()
send()
recv()
closesocket()
服务器
侦听套接字
socket()
bind()
listen()
accept()
closesocket()
连接套接字
recv()
send()
closesocket()
图5.2流式套接字的工作流程
5.4多线程技术
多线程[24、25]是和进程联系在一起的,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据等系统资源组成的,所用资源在进程终止时释放。而线程是进程内部的一个执行单元,每个进程至少有一个线程——主执行线程(它无须用户创建,是由系统在程序启动后创建的),用户可根据需要在应用程序中建立其它的线程,多个线程并发运行在同一进程中。一个进程的多个线程都在该进程的虚拟地址空间中,使用共有的资源。实际应用中,常使用一个用户界面线程和多个辅助工作者线程相结合,满足系统的多任务要求。在利用多线程进行程序设计时,要充分考虑到并发性、安全性等问题,才能提高程序及系统的效率,发挥出多任务并行的高效性。
根据多线程编程机制,为多个游戏参加者和游戏裁判创建相应的线程,定义其运行内容。
public class pkpgame //扑克牌游戏主类。
{
static Threadplayer playerl,player2,
player3,player4: //游戏参加者固定为四方。
static Threadjudge judge;
private Semaphore s[4];
//定义数组存放信号量表示四方游戏参加者能否出牌,初值为0。
public static void main(String args[]){
//创建四方游戏参加者线程和游戏裁判线程。
//启动游戏参加者线程,启动裁判线程
}
class Threadplayer extends Thread{ //参加者线程的子类。
public void出牌(){
S[i].P();
mutex.P();
//判断当前游戏方是否能出牌。
//可以出牌进入临界区访问共享资源。
//出牌;count++;
if( count==4) //四方均已出牌。
//将游戏方的出牌信号量全部设置为0。
{for(i=0;i<4;i++)S[i].v();
judgment.v(); //唤醒裁判线程。
else
s[(i+1)%4].v(); //告诉下家可以出牌
mutex.v();}
public void run(){
出牌;}
}}
}
Class Threadjudge extends Thread{
Public void 裁判(){
Judgement.p();
Mutex.p();
//对出牌队列信息进行裁判,确定这一步的胜方为sucs。
s[sucs].v();
mutex.p();
public.v();}
public void run(){
裁判();}
}
六、总结与展望
本文讨论了利用Java的多线程机制及其使用,研究了将多线程应用于Socket程序设计的基本模型,在此模型的基础上方便设计纸牌程序的概念,而当前网络环境下的应用系统具有多用户、多任务、交互性强等特点,Java多线程机制在解决此类问题时表现出突出的优势。
随着互联网的发展,在线纸牌游戏将越来越普及。不仅可以在代表着世界扑克最高水平的“世界扑克竞标赛”中获奖,让特色纸牌游戏源远流长。而且中国的在线棋牌游戏早已摆脱掉了初期单一乏味的雏形,现在的棋牌娱乐平台制作精美,系统功能完善、游戏精彩鲜活。这些都预示着这种为社会大众广为接受的娱乐方式,必然将在今后的在线娱乐市场里经久不衰,并继续保持其旺盛的生命力和平稳的发展势头。
参考文献:
[1] 许巍巍.中国校外教育: 美术[J]. 北京: 中国校外教育版, 2010, (4): 32-33.
[2] Dimopoulou M,Miliotis P.An automated university course timetabling
system developed in a distributed environment[J]. A case study European Journal of Operational Research, 2004(153): l36—147.
[3] Ivor Horton. .Ivor Horton’s beginning Visual C++ 2005[M]. 北京: 清华大学出版社.
[4] 曹岩, 王海宇. C++ Bulider应用程序开发实例及技巧[M]. 西安: 西安交通大学出版社.
[5] 侯云峰. 三层次Client/Server应用开发指南[M]. 北京: 电子工业出版社, 2000.
[6] 魏刚. 基于Java 的C/S 网络应用程序开发[J]. 电大理工, 2009, (1): 34-36.
[7] 任秦明. 基于B/S结构的软件开发技术[M]. 西安: 西安电子科技大学出版社, 2006.
[8] Akinori Yonezawa, Satoshi Matsuoka. Metalevel Architectures and Separation of Crosscutting Concerns[M]. Oversea Publishing House, 2001.
[9] 肖正兴. C/S模式下网络五子棋的设计与实现[J]. 福建电脑, 2006, (9): 176-177.
[10] 刘晓露. JAVA多线程机制在网络游戏中的应用与研究[J]. 计算机应用与软件, 2007, 12(24): 140-142.
[11] 李志强. 基于互联网通用科研申报评审系统的研究与开发[D]. 江苏: 东南大学, 2004.
[12] 张卫民. Java语言及其应用[M]. 北京: 清华大学出版社, 1996.
[13] Eckel B(美). Java编程思想[M]. 北京: 机械工业出版社, 1999.
[14] 刘巍, 唐学兵. 利用Java的多线程技术实现数据库的访问[J]. 计算机应用, 2002, 22 (12): 121—123.
[15] The Source for JavaTM Technology[EB/OL]. .
[16] 张白一, 崔尚森. 面向对象程序设计——Java[M]. 西安: 西安电子科技大学出版社, 2003: 259—314.
[17] 何梅. Java Applet编程实例[M]. 北京: 清华大学出版社, 2003: 50—150.
[18] 冯佳琪, 金强.JDBC-ODBC桥技术的应用与实践[J]. 网络与信息, 2007, 20(7), 233-243.
[19] 陈隽. 基于Java多线程技术的网络编程[D]. 淮安: 江苏淮安市行政学院, 2004.
[20] 赵文清. 基于Socket的并发服务器的Java语言实现[D]. 保定: 华北电力大学计算机科学与工程系, 2001.
[21] 王化, 叶爱亮, 祈立学, 曹凌云. VC++6.0编程实例与技巧[M]. 北京: 机械工业出版社,1999.
[22] 汪翔, 袁辉. Visual C++实践与提高——网络编程篇[M]. 北京: 中国铁道出版社, 2001.
[23] 吴晟, 苏庆堂, 罗斌, 赵莉楠, 蔡灿民. 基于Socket和多线程技术的并发服务器的研究[J]. 昆明理工大学学报(理工版), 2006,31(4): 39-42.
[24] Brandon Rhodes, John Goerzen. Foundations of Python Network Programming[M]. MA: Apress, 2010.
[25] D.C.Schmidt, S.Mungee, S.Flores-Gaitan and A.Gokhale.“Software Architectures for Reducing Priority Inversion and Nondeterminism in Real-time Object Request Brokers,” Journal of Realtime Systems[J]. special issue on Real-time Computing in the Age of the Web and the Internet, 2001, 21(2): 273-277.
15
展开阅读全文