参考
麻将程序对和牌判断的逻辑是什么?有比「暴力搜索」更先进的算法么?
日本解决方法(需要翻墙)
题记
开始优化麻将胡法,首先反应理论上查表是最快的,但是没有对查表使用的印象,于是看看有没有参考的,开始参考日本的查表,基本胡牌,再加上一些特殊胡牌方式,因为是日麻,百搭还有字成顺没有,那就先开始这个来先熟悉下查表法
查表法
思路很简单,也就是把所有可能全部列成表,一个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/白 | —— | —— |
牌型:能胡的牌数量的列表
-
生成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]