麻将胡牌的基础设计应该都完成了,今天聊一下最核心的一个业务任务,查胡。
一、目标
查胡有两个设计目标,一是确定一手牌能不能胡牌,二是如果能够胡牌,要确认是七对胡牌还是普通胡牌,胡牌的牌张组合是什么。
二、分析
混合查表法确定是否胡牌的基本思路在前文简单聊过,就是对于每种花色的NNCode,进行OKTable查表,均能表得到对应的value,如果四种花色Value中的V值,符合(1、0、0、0),则为普通胡牌,符合(2、2、2、2)是七对胡牌,符合(3、3、3、3)是不靠胡牌。同一手牌,可能同时胡普通牌和七对牌,但是不可能胡不靠牌,简单说,胡牌类型的可能只有1、1|2、2、3
三、实现
1) 查表找V,
a) 按照花色循环遍历牌的NNCode
b) 本花色没有牌张,V值记录为-99,下一花色
c) OKTable根据花色NNCode查表Value,没查到退出,不胡;
d) 解码、记录Value的V,下一花色
2) V值判断,不属于(1、0、0、0)、(2、2、2、2)、(3、3、3、3)分别与3个-99(三种花色没有牌张)的组合,退出,不胡;
3) 解码每种花色对应的Value,给出胡牌牌型。
四、例子
用下面的数据类型做了测试用例,[0,8]筒,[10,18]条,[20,28]万,[30,36]风,
pair<string,vector <uint>> ={&#34;七星不靠 &#34;, { 0, 3, 6, 11,14,22, 25,36,30, 31,32,33, 34,35}},
例子中的“七星不靠”是我设计测试用例时自己的标识,如何从胡牌的牌张,倒算出可以计算翻数的胡牌类型,后续会仔细聊。
vector<pair<string,vector <uint>>> C={
{&#34;七星不靠 &#34;, { 0, 3, 6, 11,14,22, 25,36,30, 31,32,33, 34,35}}, //七星不靠
{&#34;全带幺 &#34;, { 0, 1, 2, 0, 1, 2, 6, 7, 8, 18,18,18, 10,10}}, //全带幺
{&#34;清龙七对 &#34;, { 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 4, 4, 5, 5}}, //青龙七对
{&#34;将对 &#34;, { 1, 1, 4, 4, 7, 7, 11,11,14, 14,17,17, 17,17}}, //
{&#34;全带幺 &#34;, { 0, 1, 2, 0, 1, 2, 6, 7, 8, 18,18,18, 10,10}}, //全带幺
{&#34;三色三步高&#34;, { 0, 1, 2, 11,12,13, 22,23,24, 6, 7, 8, 4, 4}}, //三色三步高
{&#34;全不靠 &#34;, { 0, 3, 6, 11,14,22, 25,28,30, 31,32,33, 34,35}}, //全不靠
{&#34;七星不靠 &#34;, { 0, 3, 6, 11,14,22, 25,36,30, 31,32,33, 34,35}}, //七星不靠
{&#34;组合龙 &#34;, { 0, 3, 6, 11,14,17, 25,28,22, 31,32,33, 34,35}}, //组合龙
{&#34;一色双龙会&#34;, { 0, 1, 2, 0, 1, 2, 6, 7, 8, 6, 7, 8, 4, 4}}, //一色双龙会
{&#34;三色双龙会&#34;, { 0, 1, 2, 6, 7, 8, 20,21,22, 26,27,28, 14,14}}, //三色双龙会
{&#34;小 三 元&#34;, {34,34,34, 35,35,35, 6, 7, 8, 6, 7, 8, 36,36}}, //小三元
{&#34;字 一 色&#34;, {30,30,30, 31,31,31, 32,32,32, 33,33,33, 34,34}}, //字一色
{&#34;清 碰&#34;, { 0, 0, 0, 1, 1, 1, 3, 3, 3, 4, 4, 4, 5, 5}}, //清碰
{&#34;混 碰&#34;, { 0, 0, 0, 1, 1, 1, 3, 3, 3, 4, 4, 4, 33,33}}, //混碰
{&#34;清龙七对-1&#34;, { 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 4, 4, 15,15}}, //青龙七对 */
};
运行结果:可以看到“一色双龙会”的胡牌结果,有两个。
七星不靠 :胡了!|特殊:14[0-0-0] 一筒.四筒.七筒.二条.五条.三万.六万.东风.南风.西风.北风.中风.发风.白风.
全带幺 :胡了!|普通:14[1-1-3] 一条对.一筒暗顺.一筒暗顺.七筒暗顺.九条暗刻.
清龙七对 :胡了!| 7对:14[7-0-0] 一筒对.一筒对.二筒对.二筒对.四筒对.五筒对.六筒对.
将对 :胡了!| 7对:14[7-0-0] 二筒对.五筒对.八筒对.二条对.五条对.八条对.八条对.
全带幺 :胡了!|普通:14[1-1-3] 一条对.一筒暗顺.一筒暗顺.七筒暗顺.九条暗刻.
三色三步高:胡了!|普通:14[1-0-4] 五筒对.一筒暗顺.七筒暗顺.二条暗顺.三万暗顺.
全不靠 :胡了!|特殊:14[0-0-0] 一筒.四筒.七筒.二条.五条.三万.六万.九万.东风.南风.西风.北风.中风.发风.
七星不靠 :胡了!|特殊:14[0-0-0] 一筒.四筒.七筒.二条.五条.三万.六万.东风.南风.西风.北风.中风.发风.白风.
组合龙 :胡了!|特殊:14[0-0-0] 一筒.四筒.七筒.二条.五条.八条.三万.六万.九万.南风.西风.北风.中风.发风.
一色双龙会:胡了!|普通:14[1-0-4] 五筒对.一筒暗顺.一筒暗顺.七筒暗顺.七筒暗顺.
7对:14[7-0-0] 一筒对.二筒对.三筒对.五筒对.七筒对.八筒对.九筒对.
三色双龙会:胡了!|普通:14[1-0-4] 五条对.一筒暗顺.七筒暗顺.一万暗顺.七万暗顺.
小 三 元:胡了!|普通:14[1-2-2] 白风对.七筒暗顺.七筒暗顺.中风暗刻.中风暗刻.
字 一 色:胡了!|普通:14[1-4-0] 中风对.东风暗刻.东风暗刻.东风暗刻.东风暗刻.
清 碰:胡了!|普通:14[1-4-0] 六筒对.一筒暗刻.一筒暗刻.一筒暗刻.一筒暗刻.
混 碰:胡了!|普通:14[1-4-0] 北风对.一筒暗刻.一筒暗刻.一筒暗刻.一筒暗刻.
清龙七对-1:胡了!| 7对:14[7-0-0] 一筒对.一筒对.二筒对.二筒对.四筒对.五筒对.六条对. |