麻将查表法(1)

参考

麻将程序对和牌判断的逻辑是什么?有比「暴力搜索」更先进的算法么?
日本解决方法(需要翻墙)

题记

开始优化麻将胡法,首先反应理论上查表是最快的,但是没有对查表使用的印象,于是看看有没有参考的,开始参考日本的查表,基本胡牌,再加上一些特殊胡牌方式,因为是日麻,百搭还有字成顺没有,那就先开始这个来先熟悉下查表法

查表法

思路很简单,也就是把所有可能全部列成表,一个key对应一个value,根据key来找所需要的值
在参考思路中key 代表牌的结构,value代表刻子,对子,顺子的位置,个数和其它特殊胡法
(其实难度就是怎么全部遍历出所有情况,不漏,不过参考中对key 防止大于32位 有特殊的处理,思路值得一看,ruby 生成表,java判断,不要问我怎么看懂ruby,就是硬啃)

这个算是翻译?再加自己理解(不考虑百搭,字成顺)

对于牌的定义及一些词的意思:

颜色\值 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
0x10 0x11/一万 0x12/二万 0x13/三万 0x14/四万 0x15/五万 0x16/六万 0x17/七万 0x18/八万 0x19/九万
0x20 0x21/一筒 0x22/二筒 0x23/三筒 0x24/四筒 0x25/五筒 0x26/六筒 0x27/七筒 0x28/八筒 0x29/九筒
0x30 0x31/一条 0x32/二条 0x33/三条 0x34/四条 0x35/五条 0x36/六条 0x37/七条 0x38/八条 0x39/九条
0x40 0x41/东 0x42/南 0x43/西 0x44/北 0x45/中 0x46/发 0x47/白 —— ——

牌型:能胡的牌数量的列表

  1. 生成Key
    1.1. 对手牌抽象成数字(不在乎其它信息,只注意牌的数量,要根据牌型生成key)
     0x13,0x15,0x18,0x18,0x26,0x28,0x29,0x31,0x31,0x32,0x38,0x42,0x43,0x44 --> [1,1,2,1,1,1,2,1,1,1,1,1]
     0x11,0x12,0x15,0x16,0x21,0x23,0x26,0x32,0x36,0x36,0x38,0x41,0x44,0x45 --> [1,1,1,1,1,1,1,1,2,1,1,1,1]

     如果把这个数据直接为key,那么会发现key的最大位数有14位,那么最起码要用uint64_t来存储,这个时候会浪费过多
     的内存

    1.2.用0对不连续的数进行分割(方便找出所有胡牌可能)
     0x13,0x15,0x18,0x18,0x26,0x28,0x29,0x31,0x31,0x32,0x38,0x42,0x43,0x44 --> [1,0,1,0,2,0,1,0,1,1,0,2,1,0,1,0,1,1,1]
     0x11,0x12,0x15,0x16,0x21,0x23,0x26,0x32,0x36,0x36,0x38,0x41,0x44,0x45 --> [1,1,1,1,1,1,1,1,2,1,1,1,1]

发布了39 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zbbzb/article/details/90441086