基于Socket的安卓棋牌类对战游戏设计与实现

时间:2023-05-23 15:36:03 教案设计 来源:网友投稿

摘 要:随着安卓设备和4G网络的迅猛发展,安卓棋牌类网络对战游戏成为休闲娱乐的热门应用,相对于单机游戏越来越受到用户的青睐。设计并实现了应用Socket协议的棋牌类网络对战游戏。设计了游戏的整体架构,分析了服务器端和客户端Socket通讯过程,阐述了通讯数据接收发送模块、客户端图形绘制模块、客户端操作控制模块、棋牌类规则加载模块等核心内容的实现。在局域网环境及Android真机上调试并实现了该游戏。

关键词:Android;Socket;手机游戏;棋牌;网络对战

DOIDOI:10.11907/rjdk.1511153

中图分类号:TP319

文献标识码:A 文章编号文章编号:1672-7800(2015)012-0099-02

0 引言

据最新IDC移动游戏市场分析数据显示,2015年第二季度游戏市场规模达到98.32亿元,环比增长6.37%,较2014年第二季度同比增长56.74%,越来越多的手机用户已经把手机游戏作为休闲娱乐的主要方式[1]。棋牌游戏具有学习成本低、玩法认同度高等特点,其单局时长一般控制在5分钟左右,适合移动端用户对碎片化时间利用的需求。相对于移动单机类游戏,移动网络对战类棋牌游戏7日留存比例高于整体水平,具有坚实的玩家基础。在此背景下,本文提出了基于Socket网络协议的安卓棋牌类网络对战游戏,通过对Socket协议、C/S开发模式以及SurfaceView框架的应用,对Android棋牌类网络对战游戏的开发方法和实现过程进行了探索。

1 游戏架构

本文中的棋牌类对战游戏采用C/S架构,在服务端专门构建了一个面向连接的SocketServer服务,采用了多线程技术对多个Android客户端进行相应的管理,服务端和客户端之间通过Socket网络协议进行稳定的连接及相应数据的接收、发送以及解析工作[2]。服务端采用Java程序实现了Socket端口监听,处理客户端连接请求,创建客户端处理线程。客户端采用Android自带的SurfaceView架构,通过双缓冲技术的使用,实现游戏内容无闪烁刷新显示。客户端由总控模块MyActivity、主游戏界面GameView、辅助游戏界面GameHelp、音乐控制模块GameMusic、游戏规则类GameGuize、客户端数据接收和发送类ClientAgent组成。客户端各模块之间通过handler进行相应内容的切换显示。整个对战游戏架构如图1所示。

图1 游戏架构

2 服务器端模块实现

2.1 服务器端和客户端Socket通讯过程分析

服务器端主要提供SocketServer服务,其与客户端通讯的一般流程为:循环监听指定的Socket端口,等待客户端连接;第一个客户端通过Socket连接,获取数据输入输出流,同时在服务器端启动一个客户端服务线程ServerAgent1,并告知该客户端等待;第二个客户端通过Socket连接,同样获取数据输入输出流以及ServerAgent2,同时判断是否可以开局游戏;若可以开局,则给连接上的每个客户端发送开始游戏指令,若有更多客户端加入,则循环上述过程直至开局;游戏过程中,各客户端按棋牌规则转换控制权,同时发送游戏数据至服务器端,服务器端在收到游戏数据后同步转发至所有客户端,从而实现所有客户端数据的同步刷新显示。

2.2 数据接收和发送自定义协议分析

棋牌游戏中所有交换数据都通过Socket协议,以数据流的形式在服务器端和客户端之间接收和发送,服务器端在接收到数据后,将数据转发到相应的客户端,客户端根据接收到的数据实现相应的操作,如开始游戏、等待其他用户加入、走棋、出牌、结束游戏等。

数据流分析:发送数据流时不是发送无规则的数据流,而是发送自定义协议的数据流,以便通知客户端接收到数据后采取何种操作[3]。本文棋牌类游戏设计了如下自定义协议:

服务器端到客户端:

<#LINK#>num //告知连接上的客户端是第几个玩家

<#START#> //告知客户端开始游戏,显示游戏开始画面

<#YOU#> //告知该客户端获得控制权,可以走棋出牌

客户端到服务器端:

<#PLAY#>d,d,d,d //客户端走的棋或出的牌

<#NO_PLAY#> //客户端跳过走棋或出牌

<# WIN#> //该客户端获胜

通知各客户端开始游戏的接收和发送数据代码如下:

发送:p1.dout.writeUTF("<#START#>"); //给玩家1发送开始游戏信息

p2.dout.writeUTF("<#START#>"); //给玩家2发送开始游戏信息

p1.dout.writeUTF("<#YOU#>"); //给玩家1发送获取控制权信息

接收:String msg=din.readUTF(); //等待服务器端发送来的消息

if(msg.startsWith("<#START#>")) //接收到<#START#>开头的数据

{

//客户端利用handler机制切换到开始游戏画面

father.myHandler.sendEmptyMessage(2);

}

3 客户端模块实现

3.1 客户端图形绘制模块

游戏客户端应用了Android的SurfaceView框架,在刷新线程中对游戏画面进行整屏刷新显示,采用双缓冲技术,防止画面闪烁[4]。与单机游戏不同的是,每个客户端显示的内容实际上略有区别,如3人斗地主牌类游戏中,玩家只能在正对自己的屏幕下方看到自己的牌及出牌区中显示的牌,其他玩家的牌在当前屏幕上只显示背景。在具体绘制时,客户端程序必须根据连接时服务器端告知的第几玩家来进行相应的绘制,图形绘制模块代码如下:

public void onDraw(Canvas canvas, int ClinetNum)

{

//绘制公共区域内容

canvas.drawBitmap(bground, XOFFSET, YOFFSET, paint);

//根据ClientNum绘制各自客户端显示的内容

drawSelf(canvas,ClinetNum);

}

3.2 客户端操作控制模块

客户端棋牌的操作采用触控方式进行,一般分为两步:第一步选择需要打出的牌或棋子,将其突出显示;第二步触控出牌按钮出牌或触控走棋的目标位置出棋,出牌或走棋时需要判断能否进行当前操作,也就是出的牌或棋必须符合游戏规则。另外只有当客户端获得控制权,也就是接收到服务器发送的<#YOU#>数据流时才可以触控操作,其它时间只能等待别的客户端操作。Android中通过onTouchEvent事件并结合MotionEvent参数来进行触控事件的操作,棋牌游戏中一般单点触摸就可以涵盖所有操作,通过MotionEvent.ACTION_DOWN参数来进行触屏操作判断,代码如下:

public boolean onTouchEvent(MotionEvent e)

{

switch(e.getAction()) //第一个触摸点

{

case MotionEvent.ACTION_DOWN: //触屏按下

if(activity.clientagent.you) //当前客户端具有控制权

………… //具体的出牌走棋操作

3.3 棋牌规则加载模块

当客户端得到控制权并按下屏幕操作时,棋牌必须符合规则,如中国象棋、军棋、斗地主等棋牌游戏都有规则,牌类游戏中可出牌的种类一般有单张、对子、三张、拖拉机、炸弹等,在游戏设计中必须详细考虑,不然会产生不可预料的BUG,影响游戏的可玩性[5]。具体操作中,一旦确定要走棋或出牌时,可以先进行校验操作,根据校验返回的result值再进行下一步操作,这里给出本对战平台中判断牌类游戏对子的方法:

public static int rule (String cardstring) //检查是否符合出牌条件

{

switch(cardstring.length)

{

case 2: //对子

if(((cards[0]<52)&&(cards[1]<52))&&((cards[0]%13)==(cards[1]%13)))

{

result=DUI_ZI;

}

else

{

result=N_A; //不是对子

}

break;

}

return result;

}

4 系统运行环境及运行实例

本文中的棋牌类网络对战系统在无线网络环境下运行,服务器端采用Windows2003+JDK6.0配置,在字符界面下运行服务端Java程序,提供SocketServer服务,循环监听9999端口,接收和发送游戏中的自定义协议数据流;客户端系统在Android2.3.3以上版本、256M内存手机中均可正常运行,运行时画面显示流畅,操控响应快捷,各种操作均有提示信息,音效逼真,具有较好的用户体验。图2给出了基于该平台的中国象棋游戏运行效果。

图2 游戏运行效果

5 结语

本文设计并实现了基于Socket协议的Android棋牌类网络对战游戏,分析了服务器端和客户端的通信过程,设计了数据传输过程中的自定义协议以及安卓客户端实现中的重要模块。该网络对战系统经过测试,适用于大多数的棋牌游戏,对Android棋牌类网络对战游戏的开发提供了开发方法和思路。下一步将对服务器端的图形化作进一步研究,引入游戏大厅概念,进一步提高游戏的易用性。

参考文献参考文献:

[1] 官建民,唐胜宏,王培志.正在形成的移动互联网生态系统 [J] .新闻战线,2015(15):59-66.

[2] 郑帅.基于Socket的游戏服务器的设计与实现 [D] .北京:北京交通大学,2014.

[3] 张新猛,蒋盛益,姜灵敏.基于J2me/socket手机网络游戏设计与实现 [J] .微计算机信息,2010(36):236-238.

[4] 吴亚峰,于复兴.Android游戏开发大全[M] .北京:人民邮电出版社,2013.

[5] 冯小燕.基于Android的网络版锄大地游戏研究与实现 [D] .广州:华南理工大学,2012.

(责任编辑:杜能钢)

推荐访问:对战 棋牌类 设计 游戏 Socket