带赖子的超高效麻将、跑胡子胡牌算法
2018-03-08 10:52
197 查看
文档 github地址 https://github.com/yuanfengyun/qipai/tree/master/doclua版 https://github.com/yuanfengyun/qipai/tree/master/mjlib_luac++版 https://github.com/yuanfengyun/qipai/tree/master/mjlib_c%2B%2Bgolang版 https://github.com/yuanfengyun/qipai/tree/master/mjlib_gojs版 https://github.com/yuanfengyun/qipai/tree/master/mjlib_jsc#版 https://github.com/yuanfengyun/qipai/tree/master/mjlib_c%23java版 https://github.com/yuanfengyun/qipai/tree/master/mjlib_java 速度: 每秒处理100万次四个赖子判胡 每秒处理1000万次八个赖子判胡
QQ: 273461474
与非字牌表的产生方法相同,只是第一步中,不能加入顺子(除非麻将玩法字牌是能组成顺子的)
表的大小:总量在2M左右表生成耗时:2-3S
QQ: 273461474
核心思想: |
1、名词解释:eye(将),字牌(feng、东南西北中发白),花色(万、筒、条、字牌) |
2、分而治之:检查手牌是否能胡是依次检查万、筒、条、字牌四种花色是否能组成胡牌的一部分。 |
3、单一花色要能满足胡牌的部分,则要么是3*n(不带将),要么是3*n+2(带将)。3*n中的3带表三张牌一样的刻子,或三张连续的牌如1筒2筒3筒。 |
4、判断是否满足胡牌的单一花色部分,需要根据是否有将,有几个赖子,查询不同的表。表内容表示表里的元素加上对应的赖子数量能组成3*n 或3*n+2。 |
赖子数是表名最后的数字,带有eye的表表示满足3*n+2,没有的表示满足3*n。 |
5、查表的key值,是直接根据1-9有几张牌就填几(赖子不算),如1-9万各一张,则key为111111111。如1万3张,9万2张,则key为300000002。 |
6、组合多种花色,判断是否能胡牌。将赖子分配给不同的花色,有若干种分配方式,只要有一种分配能让所有花色满足单一花色胡牌部分,则手牌能胡。 |
如:手上有3个赖子,可以分配万、筒、条各一张,也可以万、同、字牌各一张 |
7、根据是否有将、是否字牌分为4种表,每种表又根据赖子个数0-8分别建表,共36张表,具体如下: |
赖子个数 带将表 不带将的表 字牌带将表 字牌不带将表 |
0 eye_table_0 table_0 feng_eye_table_0 feng_table_0 |
1 eye_table_1 table_1 feng_eye_table_0 feng_table_1 |
2 eye_table_2 table_2 feng_eye_table_0 feng_table_2 |
3 eye_table_3 table_3 feng_eye_table_0 feng_table_3 |
4 eye_table_4 table_4 feng_eye_table_0 feng_table_4 |
5 eye_table_5 table_5 feng_eye_table_0 feng_table_5 |
6 eye_table_6 table_6 feng_eye_table_0 feng_table_6 |
7 eye_table_7 table_7 feng_eye_table_0 feng_table_7 |
8 eye_table_8 table_8 feng_eye_table_0 feng_table_8 |
步骤: |
1、统计手牌中鬼牌个数 nGui,将鬼牌从牌数据中去除. |
2、不同花色分开处理,分别校验是否能满足 将、顺子、刻子 |
3、分析东南西北风中发白时,不需要分析顺子的情况,简单很多 |
4、分析单一花色时,直接根据1-9点对应数字得出一个9位的整数,每位上为0-4代表该点数上有几张牌 |
比如:1筒2筒3筒3筒3筒3筒6筒7筒8筒2万3万3万3万4万 |
数字:筒: 1,1,4,0,0,1,1,1,0 得出的数字为114001110 |
万 0,1,3,1,0,0,0,0,0 得出的数字为13100000 |
5、组合多种花色,判断是否能胡牌。将赖子分配给不同的花色,有若干种分配方式,只要有一种分配能让所有花色满足单一花色胡牌部分,则手牌能胡。 |
如:手上有3个赖子,可以分配万、筒、条各一张,也可以万、同、字牌各一张 |
每种花色与赖子组合,如果所有花色都能配型成功则可胡牌 |
检查配型时,每种花色的牌数量必需是3*n 或者 3*n + 2 |
根据赖子个数、带不带将,查找对应表,看能否满足3*n 或 3*n+2的牌型 |
非字牌表的产生: |
1、穷举万字牌所有满足胡牌胡可能,将对应的牌型记录为数字,根据是否有将、放入eye_table_0或table_0中。 |
具体是每次加入一个刻子,顺子或是将(将只能加入一对),最多加入四组外带将牌。 |
2、将table_0中牌去掉一张,放入table_1中,表示去掉的牌用1张赖子代替。eye_table_0中牌去掉一张,放入到eye_table_1中。 |
3、将table_1中牌去掉一张,放入table_2中,表示去掉的牌用1张赖子代替。eye_table_1中牌去掉一张,放入到eye_table_2中。 |
4、将table_2中牌去掉一张,放入table_3中,表示去掉的牌用1张赖子代替。eye_table_2中牌去掉一张,放入到eye_table_3中。 |
5、将table_3中牌去掉一张,放入table_4中,表示去掉的牌用1张赖子代替。eye_table_3中牌去掉一张,放入到eye_table_4中。 |
6、将table_4中牌去掉一张,放入table_5中,表示去掉的牌用1张赖子代替。eye_table_4中牌去掉一张,放入到eye_table_5中。 |
7、将table_5中牌去掉一张,放入table_6中,表示去掉的牌用1张赖子代替。eye_table_5中牌去掉一张,放入到eye_table_6中。 |
8、将table_6中牌去掉一张,放入table_7中,表示去掉的牌用1张赖子代替。eye_table_6中牌去掉一张,放入到eye_table_7中。 |
9、将table_7中牌去掉一张,放入table_8中,表示去掉的牌用1张赖子代替。eye_table_7中牌去掉一张,放入到eye_table_8中。 |
字牌表的产生: |
表的大小:总量在2M左右表生成耗时:2-3S
相关文章推荐
- 带赖子的超高效麻将、跑胡子胡牌算法
- 带赖子的麻将胡牌及其听牌算法研究
- node.js——麻将算法(二)赖子玩法
- C++带赖子的麻将听牌检测算法实现
- ansible搭建高效运维平台,附批量免密码登陆脚本
- 学校生活正常化一个礼拜,买了台4楼最无敌学习机,体验最迅捷高效的系统,以及本校学生所能用到的最快的教育网。。
- 网络人如何高效学习
- 业务培训视频会议解决方案--目前最高效简单的方式
- 制作系统恢复盘 快速 高效远程装系统 推荐
- 高效工作的信息搜集及管理术
- 高效开发Hybrid APP(一):环境搭建 NodeJS + Grunt + tomd
- 编写高效的JAVA程序-编程规范 (基本篇 )
- [摘录]高效人士七习惯—知己知彼原则
- 在winforms中使用LINQ to SQL实现高效分页
- 高效程序员应该养成的七个习惯
- [原创]网络专用高效内存池,支持多线程.原创,非sgi的内存池
- 图片高效加载(二) 图片的异步加载
- 如何高效地判断奇数和偶数
- iOS高效开发必备的10款Objective-C类库(转)
- 高效指南笔记