字牌介绍

字牌的基本介绍我就不多说了,可以自行百度。大字牌_百度百科

我这里想给字牌做个归类。我做过很多款字牌,例如: 四川的“贰柒拾”、湖南的 “宁乡跑胡子”,“湘潭跑胡子”,“沅江鬼胡子”,“益阳歪胡子”、广西的“八一字牌”,“桂林字牌”,“全州字牌【四个癞子】”,“飞飞字牌【一个癞子】”等

虽然有这么多玩法,但是其核心的流程都是大同小异的,我所讲的核心流程是指,吃牌,比牌,碰牌,偎(啸),跑(提,龙),胡(王胡)等操作,这种基本操作在各个字牌中都差不多,只不过叫法和表现形式不一样而已。

但对于番型,算分等就有很大的区别,当然还有一些细节方面的差异,比如有的需“挡底”,“翻神”,“翻醒”,“八块”等,或者一些不同的地方性规定。我个人根据玩法的相似性和开发难度给大家进行一下归类。

1、贰柒拾系列:基本都是四川体系,如:"乐山三人",“十四张三人”,“犍为三人”等,后面又在这些玩法上继续扩展,衍生出二人,四人等玩法,这种字牌按圈对局,雨分计算相对复杂,最优解要与圈牌番型相结合。   玩法难度:★★★★

2、跑胡子系列:这个系列的衍生玩法最多,是大家最常玩的一套规则体系,如:“宁乡跑胡子”,“湘潭跑胡子”,“常德扯胡子” ,以及广西的一些字牌,这种系列主要有比较多的系统操作,难点在于各种按钮操作和系统操作的优先级处理上。 玩法难度:★★★

3、鬼胡子系列:这个系列主要是湖南几个地方在玩,沅江,益阳等地,其不同于跑胡子系列的点在于胡牌规则完全不同(不是按胡息的),还有一些牌型的组合最优解(四张可以拆出来组合),番型也特别的多。  玩法难度:★★★★

跑胡子系列的基础逻辑相对于其他两个系列要简单一点,但对于带癞子的,其难度就完全提升了一个档次。

例如广西的全州字牌,有四个癞子,其胡法还支持“王闯,王炸,王钓”,就是所谓的胡任意一张的那种,并需要配合翻醒找到其最优解,其逻辑和难度成指数上升。

我自己开发了一款APP,里面包括了下面所有的字牌玩法,欢迎私信我,学习交流~

展示一些牌局中的截图给大家瞧瞧:分别是牌局中和小结算,截图来源于部分棋牌APP。

乐山贰柒拾:

沅江鬼胡子:

全州字牌(带癞子):

桂林字牌:

字牌算法:

  之前本人写过一篇关于字牌“贰柒拾”的介绍,里面有一部分关于胡牌算法的介绍。链接:棋牌算法——“贰柒拾”(字牌)_Snovi-的博客-CSDN博客

写的算是比较简单,因为当时我对字牌还处于一个初识的状态,经过了这两年的磨练,做了这么多款字牌,经过了很多种尝试,彻底对字牌的算法有一个深刻的理解,下面给大家详细介绍一下字牌的胡牌算法。

字牌采用一种叫“回溯法”的算法来计算胡牌。而对于带癞子的情况,可以采用“多路回溯法”

问题一:什么是回溯法? 

答:回溯法实际上属于一种递归算法,就是用一套相同的逻辑,基于不同的数据状态进行计算,设定一个条件(这里可以是胡息数),一旦条件成立,就跳出当前回溯过程。

问题二:为什么要用回溯法? 

答:回溯法虽然在计算性能上有不稳定的地方,肯定是比不上麻将的查表法的,但是没办法,字牌的胡牌组合太过于复杂,目前我认为很难构造胡牌表来匹配,即使可以,也会占用大量内存。

其实在字牌的计算中,存在一个最优解的情况,而用回溯法反而能够在计算中得到最优结果,所以在性能计算问题是完全没有问题的,甚至更快。而且更关键的一点,回溯法是可以拆分的,即可以形成多路(多线程)回溯,

特别是有癞子的情况下,多路回溯法的性能可能不亚于查表法。

问题三:回溯法怎么用?

答:往下翻

字牌胡牌算法“回溯法”介绍 

图示:思维流程图

         

单路回溯法:力求只用一次串行回溯,通过牌型的计算,直接求出一个最优结果,因为单路回溯法只进行一次计算,所以对计算的方案有比较高的要求,一般按照大牌型优先于小牌型的逻辑计算(胡息),但一旦涉及到胡息番型混合组合取最优解的情况,

这种单次回溯就显的比较吃力。如果这种情况很少的话,可以通过构造两个数据包,进行两次(多次)单路回溯,然后比较结果,这是一种"伪多路"(单线程),但在实际操作计算中确实很有效果,即保留的单路回溯的效率与清晰,又能减少大量的比较计算。

基本上只要不带癞子的都可以才用单路回溯法,其中“贰柒拾”和“鬼胡子”系列对计算思维要求要高一点。当然也可以把单路回溯强行拆成多路回溯,但个人觉得没有必要。

多路回溯法:通过同时进行多次回溯,分别计算出结果,最终得到满足条件的结果集。注意,多路回溯不是指同时进行多个“单路回溯”,(不是意味着开多个线程,每个线程跑一次单路回溯,这种是叫多线程版“伪多路”),真正的多路回溯的精髓在于,

每一次数据包的计算都是无状态的,只关心数据包自己的计算过程,并不关心数据包来自哪一路或来自哪一次。举个例子:现在有一张牌可以胡十种结果,每一种结果需要计算十次,总共有一百个数据包,多路回溯的优势在于每次可以同时计算多个数据包,

而不用关心当前数据包的状态(多线程同时进行),直到所有数据包计算完成,获得结果集,再计算最优解。

值得一提的是,单路回溯原则上是单线程的,所以要注意计算量,如果计算过于复杂或者最优解无法通过一次计算得出,则不适用单路回溯。多路回溯需要配合多线程将计算性能发挥到最优,以满足计算出所有结果的需要,多路回溯需要设定一个最长计算时间,因为需要等待多有路子里的数据包都计算完,这就涉及到线程互相等待机制了,建议采用乐观锁机制。

“回溯法”计算逻辑介绍

不管你的回溯法用的多好,不管你是单线程还是多线程,都离不开中间的计算过程,计算写的好不好,会严重影响回溯法的性能,好的计算过程能够在最快的时间内得出最优解(单路回溯法),全面的计算逻辑才能找出所有满足胡牌组合的情况。

字牌中的胡牌计算,无非就是计算手牌,将手牌组合成不同的组合,当把所有手牌都组合完,判断是否满足胡牌条件并结束计算。下面讲详细的介绍回溯法中的“计算”逻辑。

计算过程流程图:

分步骤说明:

①:手牌进行排序,一般按从大字到小字这样排(这里的手牌,可能包含最后胡的那张牌,也有可能不包含,要根据情况而定,不一定是21张,已经吃碰杠的牌也不能算,但要累加胡息)

②:取出第一张,判断一下手牌里存在多少张,根据张数不同可能完成的组合也不同,注意,这里要考虑到一种情况,就是这张牌刚好是胡的那张牌,这样会增加很多限制

③:依次尝试所有相应的组合,就拿吃来说,就先去组2710,因为2710有胡息,如果组合成功,就可以直接进行下一个回溯,这样就是最优解优先原则,2710不行再考虑其他组合

④:组合成功后,要根据组合的类型进行当前数据包状态的修改,比如加胡息,拼牌型,记录所有需要用来判断胡牌的条件信息,并移除掉相应的牌,递归进行下次回溯计算

⑤:当所有手牌都组合完成时(如果其中有不能组合的就不会到这一步),判断胡牌条件,如果条件成立,退出计算,得到胡牌结果。

PS:这样的步骤一般用于跑胡子系列,而对于鬼胡子(四张可拆),带癞子的(无法优先最优解),则要更加复杂一点,但整一个的逻辑思路还是一样滴。

代码(JAVA):

这篇文章较为理论,实际上涉及的代码有很多,其中带癞子的更涉及到多线程相互等待的操作。

贴了不全也只是一个思路,有需要的评论区吧。

贴上最为核心的方法而且呈上齐下的一个方法。

棋牌游戏算法——字牌系列总结相关推荐

  1. 棋牌类游戏算法–牌分类_快速分类–三向和双枢轴

    棋牌类游戏算法–牌分类 毫无疑问,Quicksort被认为是本世纪最重要的算法之一,并且它是许多语言的事实上的系统排序,包括Java中的Arrays.sort . 那么,quicksort有何新功能? ...

  2. 棋牌游戏开发之地主算法判断牌型

    棋牌游戏开发咨询 QQ:325131039 棋牌游戏开发咨询交流群: 490287966 由于近年来网络棋牌游戏的火爆导致个各个地区的特色棋牌游戏进入开发的红火时期,也有越来越多的团队个人开始研究棋牌 ...

  3. 【技术博客】2020.04.28-简单塔防游戏和棋牌游戏构架学习 ——学习系列博客(一)构架初探

    序言,保卫萝卜项目作为自己学习整体游戏项目的开始,还是很有收获的. 项目初步实现了分管关卡地图编辑.场景结构.关卡选择.游戏地图等主要功能,同时内部构架采用了MVC加单例的构架,对我这种初学者还是很有 ...

  4. 记一次棋牌游戏 cocos2d-x LUA脚本解密

    1.如何查看luac的key和sign 对一棋牌游戏反编译后,可以在其assets目录下面发现*.luac的脚本,打开下面的luac脚本,可以看到luac是加密的,如下图: 可以看到加密的luac文件 ...

  5. 基于JSF框架的在线棋牌游戏平台

    一.项目总体说明 1.1  项目总体说明 该项目是基于JSF框架的在线棋牌游戏平台,目前有五子棋和象棋两项已完成子模块,皆支持人机对战与在线匹配对战,其中象棋还支持大部分棋牌平台不支持的复盘功能.项目 ...

  6. 算法细节系列(16):深度优先搜索

    算法细节系列(16):深度优先搜索 详细代码可以fork下Github上leetcode项目,不定期更新. 题目均摘自leetcode: 1. 329 Longest Increasing Path ...

  7. 棋牌游戏做ASO有什麽用?

    ASO是「应用商店优化」的简称.ASO(App Search Optimization)就是提升你APP在各类APP应用商店/市场排行榜和搜索结果排名的过程. 类似普通网站针对搜寻引擎的优化,即SEO ...

  8. 【棋牌游戏】JAVA服务器设计与开发(一)

    ####开篇语 大概在16年时候,新型房卡模式打开棋牌游戏新里程,整个棋牌行业迅速改变模式,出现近两三年激烈的竞争景象,据统计全国大大小小棋牌游戏公司,专职棋牌公司近两万多家,这都不算后起大大小小游戏 ...

  9. DDOS攻击 — 棋牌游戏创业公司的生死劫

    近年来,棋牌游戏在网络游戏市场中"异军突起",遥遥领先于网络游戏中的其它游戏,成为网络游戏行业最赚钱的游戏之一,也是玩家最多的一个游戏类别,俨然成为互联网企业发展的新宠儿. 为了分 ...

最新文章

  1. 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)| CSDN博文精选
  2. oracle10.2.0.5漏洞,Oracle 10.2.0.5 opatch报错
  3. 音视频技术开发周刊 72期
  4. bootstrap导航条文字颜色_XEditor基础组件:导航条
  5. A problem occurred starting process 'command 'G:\Android\sdk\ndk-bundle\toolchains\mips64el-linux-an
  6. 2010全面兼容IE6/IE7/IE8/FF的CSS HACK写法
  7. scala定义函数(六)
  8. Nginx的accept_mutex配置分析
  9. ubuntu php命令行模式,在命令行ubuntu 16.04上切换php版本
  10. 意外收获——我与FPGA的第一次
  11. 计算机基础知识试题及答案填空题,计算机基础知识练习题及答案解析
  12. gis重分类失败可能原因
  13. python实现r树存储地理位置_空间索引R树研究_回顾与展望_张明波
  14. 计算机上缺少vsix安装程序,VSIX安装程序在Visual Studio 2017年(15.3)
  15. 关于在github上传代码却没有小绿点(贡献率)的问题
  16. springboot+vue房屋租赁系统-求租合同系统java
  17. PHP 导出 Excel 换行不显示
  18. MLC颗粒+eMMC 5.0,Kuner扩容iPhone6
  19. WEKA算法开发——记一次不太成功的遗传属性加权贝叶斯算法实验
  20. 3D扫描建模技术应该如何学习?来来来,看这里!

热门文章

  1. Word2007“由于文件许可权错误,Word无法完成保存操作”问题的解决方法
  2. 用python画一个简单卡通人物画法_Python绘制可爱的卡通人物 | 【turtle使用】
  3. 试水Bilibili/ijkplayer-Android
  4. 除了支付宝,微信也能查询账单了!再也不担心钱花哪去了!
  5. 组件的生命周期,小程序如何引入第三方ui框架
  6. hibernate-validate如何校验controller+service+分组校验+自定义注解实现校验规则等
  7. 中国计算机大会 2018
  8. Show一下拿的奖杯
  9. python能代替ps吗_Python中怎么像PS一样处理图像
  10. 新零售saas小程序如何探索数字化门店的破局之路?