局域网内双升游戏的设计(二)--系统框架

news/2024/10/22 4:59:59/

服务器客户端关系

        一般来说,服务器与客户端在交流过程中,都会有自身的状态,也有很多逻辑的判断。这些可以放在服务器,也可以放在客户端。如果把功能分别放在两端的话,会造成逻辑比较混乱且不同步的现象。比如,在抢亮的过程中,可能有先后顺序,某个客户端亮主后,如果先在客户端上显示,但是消息到达服务器后,发现已经有人先亮了,就需要重新显示。这样一来,会造成逻辑的复杂化。在本程序中,采用的是服务器保存所有的状态,处理所有的逻辑。比如,客户端在点击亮主后,做的事情就是发一个消息给服务器,不做任何显示操作,等待服务器传来亮主的消息后再显示。出牌后,也是直接发消息给服务器,并等待服务器的计算结果后再显示出去的牌。客户端只会按照服务器命令做动作的。这样一直瘦客户端的形式,能很大程度上降低整个程序的复杂度。但是会增加消息数和服务器的负担。

        ps:现在暂未实现掉线重连机制。

消息定义

        在程序中,所有的消息采用字符串的形式封装,每个消息定义中有一个消息类型的字符串,还有这个消息包含的多个参数。主要定义如下:

typedef std::map<std::string, std::string> ParamMap;
class SESSIONBASE_API CMsg
{
public:
std::string& operator []( const std::string& key )
{
return m_param[key];
}
std::string& operator []( const char* key )
{
return m_param[key];
}
private:
std::string m_type;
ParamMap m_param;
};


        这样,可以很方便地设置或者获取某个消息的某个参数:

CMsg discardMsg;
discardMsg.getType() = CMsgDef::MSGTYPE_TODISCARD;
discardMsg[CMsgDef::COMMON_PARAM_INDEX] = ToString( pState->m_zhuangIndex );

        将消息转换为一个流格式,于是,在CSessionBasesendMsg中,通过调用m_pWrapper->wrapMsg( pMsg, m_sendBuffer, len );来将CMsg对象转换为一个可以发送的字符串序列。本程序中采用的是XML格式封装,即:m_pWrapper是一个CXmlMsgWrapper对象。如果希望改变封装格式或者对消息进行适当加密的话,可以新建一个CMsgWrapper的子类,并且实现wrapMsgunWrapMsg两个函数即可。

服务器状态机

图 1.             服务器中类图

         在服务器中,主要的类如上图所示,CShengjiGamerMgr是总的调度,所有用户的连接都是通过它来接受的,每当有新的一桌游戏开始时,就新建一个CShengjiGamer对象。每个CShengjiGamer对象中最多保存4Session,分别代表4个不同的玩家。CShengjiGamer中还有一个CGamerStateBase,这是个状态机,使用了状态模式,不同的状态的逻辑处理不一样,要响应的消息也不一样。所以,每个状态机重载的时候要实现各自不同的消息处理函数。这样可以避免在不同状态下,收到客户端的错误消息(或者因为网络延时造成的超时消息)而导致的状态混乱。

        状态切换时,要新建一个新的状态机,并且删除旧的状态机,类似代码如下:

    if ( SHENGJI_PLAYER_COUNT == readyCount )
{
CGamerStateBase* pNewState = new CCompetePointState( m_players, m_initingPlayers, m_pState );
delete this;
return pNewState;
}

        在各个状态中,需要保存当前游戏的数据,就放在m_pState中。在每个状态间来回传递。

          参考代码+编译后的程序: http://download.csdn.net/detail/hustxyj/7024091

http://www.ppmy.cn/news/856545.html

相关文章

局域网内双升游戏的设计(一)--界面

概述 本软件使用VS2010为框架&#xff0c;采用MFC框架&#xff0c;以及DirectDraw作为画图的工具。网络库与消息调度使用live555底层的模块实现。关于DirectDraw和live555的细节&#xff0c;可以自行上网查阅资料。 界面元素 图 1. 界面 如上图所示&#xff0c;是…

局域网内双升游戏的设计(三)--算法

发牌算法 当每个玩家都准备完毕后&#xff0c;那么第一步就是要发牌。需要做到一个完全随机的发牌&#xff0c;就要保证每张牌发到每个玩家手里的概率都是一样的&#xff0c;而且牌的顺序是等概率随机打乱的。程序中采用的是如下的发牌算法&#xff08;感谢Dr.Light提供&#x…

局域网内双升游戏的设计

本科毕业前&#xff0c;就有意向开始写一个双升的游戏&#xff0c;那时候用QT写了个界面&#xff0c;不过由于架构太混乱&#xff0c;导致后面不想去维护。研究生第二年下学期&#xff0c;实验室活不多&#xff0c;就乘机写了一个 新的牌的框架&#xff0c;正好实践了很多设计模…

手机自动化脚本-- 模拟器模拟真机环境过检测

文章目录 安装包目录结构一、安装雷电模拟器9二、新建模拟器并且初始化1. 性能设置2. 其他设置3. 当前配置三、面具1. 安装2. 面具初始化四、修改机型1. 将机型模块安装到模拟器2. 安装机型模块五、修改su问题1. 安装RE管理器2. 删除自带su文件,避免文件冲突六、下载地址额外安…

论文(1)——大家说SCI的一区二区和CCF中A类B类是什么意思?

文章目录 引言问题描述问题解决CCF 和A、B、C类CCF注意事项 SCI和一区、二区如何判定你找的论文所属的会议或期刊是几区或者几类&#xff1f;使用特定的网站查询使用浏览器插件 一年之内的应该投什么刊物&#xff1f; 总结参考 引言 已经研一暑假了&#xff0c;周围很多人已经…

三星依靠折叠手机技术优势在中国市场强力复兴,中国手机该担心了

据某电商公布的热销安卓旗舰手机排行榜&#xff0c;三星8月底上市的两款高端手机Galaxy Z flip3和Galaxy Z fold3均进入了热销榜top10&#xff0c;分别位居第六名、第七名&#xff0c;显示出这家手机企业在被中国消费者冷落数年后似乎开始重获中国消费者的认可。 某电商公布的这…

华为、小米已成老年手机市场主力—1.5万条老年手机电商数据解读

过去几年&#xff0c;大部分中老年人接触互联网都是从使用智能手机开始的&#xff0c;正是由于智能手机在中老年人群中的快速普及推动了互联网在中老年人群中渗透率的大幅增长&#xff0c;随着智能手机越用越熟练&#xff0c;他们开始广泛体验语音、视频、K歌、支付、追剧、看小…

安卓开发者:如何成为Kotlin大师?附送18款kotlin开源项目(纯资源分享)

在开发界,新的语言不断出现,包括go、Rust、Nim、Julia、Scala、Swift…这个名单可以拉很长,但从来没有一款语言像Kotlin一样引起这样广泛的讨论。 在StackOverflow网站统计的,最受开发者欢迎的编程语言排行榜,Kotlin得到了 72.6% 的高比例支持,位列第四名。据 JetBrains…