麻将程序对和牌判断的逻辑是什么?有比「暴力搜索」更先进的算法么? 日本解决方法(需要翻墙)
开始优化麻将胡法,首先反应理论上查表是最快的,但是没有对查表使用的印象,于是看看有没有参考的,开始参考日本的查表,基本胡牌,再加上一些特殊胡牌方式,因为是日麻,百搭还有字成顺没有,那就先开始这个来先熟悉下查表法
思路很简单,也就是把所有可能全部列成表,一个key对应一个value,根据key来找所需要的值 在参考思路中key 代表牌的结构,value代表刻子,对子,顺子的位置,个数和其它特殊胡法 (其实难度就是怎么全部遍历出所有情况,不漏,不过参考中对key 防止大于32位 有特殊的处理,思路值得一看,ruby 生成表,java判断,不要问我怎么看懂ruby,就是硬啃)
牌型:能胡的牌数量的列表
生成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]