棋牌游戏算法——麻将系列总结

麻将介绍

麻将的基本规则都是一样的,我就不累赘了。

        我从事棋牌工作五年了,开发过无数的麻将玩法,如柳州麻将,转转麻将,红中麻将,来宾麻将,广东麻将,清远麻将,长沙麻将,北海麻将,基本上两广的麻将都写过(狗头),所以对麻将开发有一定的理解。

        我自己也开发了一款棋牌APP游戏,里面涵盖了很多麻将的玩法,欢迎私信我学习交流。

       我们先把不同规则的麻将进行一个简单的归类,众所周知,全国各地每个地方的麻将叫法都不一样(注意:这里只是说叫法,打法可能相同),带风的,带花的,带癞子(精)的,只能自摸的,带番的,中码的,特殊牌型的,什么样的规则都有,但是核心算法却是百变不离其中。

按照惯例,先展示一部分麻将的界面,其中界面来源棋牌APP。

红中麻将:

柳州麻将:

 转转麻将:

广东推倒胡:

从上面的几个麻将界面可以看出,按花色分类,可以分成 万子、条子、筒子、风字、癞子五大类,基本上每一类都是独立的,那么只要手牌满足每一类都能成牌,那就是可以胡了,按照这个逻辑,下面开始介绍麻将经典的胡牌算法。

麻将胡牌算法

        麻将的核心算法,主要就是胡牌算法了,主流的胡牌算法有两种方式,一种是回溯法(性能低),另一种是查表法下面我依次对这两种算法进行介绍。

回溯法:

        所谓回溯,就是按照符合规则的牌型对所有手牌依次进行组合,首先将花色进行分类,按照刻字,顺子,将,这样可组合的方式对每一种花色进行组合(癞子可以作为任意牌添加进去),每次组合成功,将组合从手牌移除,重新进行回溯,如果有一次回溯失败,这样代表此组合不成立,换一种组合重新回溯,直到所有牌被移除或者所有组合都失败为结束。

        回溯法的优点是比较好理解,逻辑上比较简单,但是缺点也很明显,效率太低!特别是有癞子的时候,回溯的次数非常非常多,这里也可以采用多路回溯法,但性能依然不跟查表法媲美。回溯法的另一个优点是可以在回溯的过程中计算番型,但这会大大提高代码的复杂性,因为本身番型是属于业务逻辑,不是胡牌算法本身通用的。

查表法:

        所谓查表,顾名思义,就是想知道能不能胡牌,只需要把手牌放进去查一下表,就知道了。那么问题来了,什么样的表呢。说白了,就是将所有可能形成组合穷举出来,放到Map里,打个比方。假设我现在手牌是清一色,那么有多少种组合呢,11122233344455  12345678911234 22334455667788 .......等等等N种,所以这个表的数据非常非常大,大概在几百万条,会占据一定的内存空间(但其实不到100M)、构造这张表的难度非常大,要考虑各种可能,从1张牌到14张牌,从杠子到对子,还要支持癞子。

        查表法的优点就是在于其性能极其高,每一种花色只需要一次hash查找就能得出结果,但是其缺点呢除了上面所说的占空间外,对于一些特殊的牌型或者特殊的组合,查表法是无济于事的,比如“七小对”,“十三幺”,这个时候还是不得不使用回溯法来进行计算。同时,查表法也不支持番型判定的。

代码实例:

回溯法可以参考我字牌系列总结篇,一样的思路,包括多路回溯

查表法由于代码较为复杂,篇幅很大计算量很多,有需要可以私信我

从下图可以看出,总共需要需要12个表,分为带将的和不带将的,带癞子的和不带癞子的

        

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
C++棋牌游戏服务器架构通常包括以下几个主要组件: 1. 游戏逻辑层:负责处理游戏规则、游戏状态的更新和管理,以及处理玩家的操作请求。这一层通常由C++编写,包括游戏逻辑的实现和相关算法。 2. 网络通信层:负责处理客户端和服务器之间的网络通信。这一层通常使用TCP或UDP协议进行数据传输,并提供网络连接的建立、断开、数据收发等功能。常用的C++网络库有Boost.Asio、libevent等。 3. 数据库层:负责存储和管理游戏数据,如玩家信息、游戏记录等。这一层通常使用关系型数据库(如MySQL)或NoSQL数据库(如Redis)来存储数据,并提供相应的读写接口。 4. 多线程/多进程管理:为了提高服务器的并发处理能力,可以采用多线程或多进程的方式来处理客户端请求。多线程可以使用C++标准库中的std::thread或第三方库如pthread来实现,多进程可以使用fork或者第三方库如boost.process来实现。 5. 负载均衡与高可用性:为了提高服务器的性能和可用性,可以采用负载均衡技术将客户端请求分发到多台服务器上进行处理,同时可以使用集群和备份机制来实现高可用性。常用的负载均衡软件有Nginx、HAProxy等。 6. 安全认证与防作弊:为了保证游戏的公平性和安全性,可以在服务器端进行安全认证和防作弊处理。常见的技术包括数据加密、防止外挂和作弊程序的检测与防御等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snovi-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值