VV游戏

 找回密码
 立即注册
查看: 193|回复: 1

麻将的C++之旅(六)查胡

[复制链接]

5

主题

10

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2022-12-12 08:23:50 | 显示全部楼层 |阅读模式
麻将胡牌的基础设计应该都完成了,今天聊一下最核心的一个业务任务,查胡。
一、目标

查胡有两个设计目标,一是确定一手牌能不能胡牌,二是如果能够胡牌,要确认是七对胡牌还是普通胡牌,胡牌的牌张组合是什么。
二、分析

混合查表法确定是否胡牌的基本思路在前文简单聊过,就是对于每种花色的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>> ={"七星不靠  ",  { 0, 3, 6, 11,14,22, 25,36,30, 31,32,33, 34,35}},
例子中的“七星不靠”是我设计测试用例时自己的标识,如何从胡牌的牌张,倒算出可以计算翻数的胡牌类型,后续会仔细聊。
vector<pair<string,vector <uint>>> C={
  {"七星不靠  ",  { 0, 3, 6, 11,14,22, 25,36,30, 31,32,33, 34,35}},  //七星不靠
  {"全带幺  ",  { 0, 1, 2,  0, 1, 2,  6, 7, 8, 18,18,18, 10,10}}, //全带幺
  {"清龙七对  ",  { 0, 0, 0,  0, 1, 1,  1, 1, 3,  3, 4, 4,  5, 5}}, //青龙七对
  {"将对  ",  { 1, 1, 4,  4, 7, 7, 11,11,14, 14,17,17, 17,17}}, //
  {"全带幺  ",  { 0, 1, 2,  0, 1, 2,  6, 7, 8, 18,18,18, 10,10}}, //全带幺
  {"三色三步高",  { 0, 1, 2, 11,12,13, 22,23,24,  6, 7, 8,  4, 4}}, //三色三步高
  {"全不靠  ",  { 0, 3, 6, 11,14,22, 25,28,30, 31,32,33, 34,35}},  //全不靠
  {"七星不靠  ",  { 0, 3, 6, 11,14,22, 25,36,30, 31,32,33, 34,35}},  //七星不靠
  {"组合龙  ",  { 0, 3, 6, 11,14,17, 25,28,22, 31,32,33, 34,35}},  //组合龙
  {"一色双龙会",  { 0, 1, 2,  0, 1, 2,  6, 7, 8,  6, 7, 8,  4, 4}}, //一色双龙会
  {"三色双龙会",  { 0, 1, 2,  6, 7, 8, 20,21,22, 26,27,28, 14,14}}, //三色双龙会
  {"小  三  元",  {34,34,34, 35,35,35,  6, 7, 8,  6, 7, 8, 36,36}}, //小三元
  {"字  一  色",  {30,30,30, 31,31,31, 32,32,32, 33,33,33, 34,34}}, //字一色
  {"清  碰",  { 0, 0, 0,  1, 1, 1,  3, 3, 3,  4, 4, 4,  5, 5}}, //清碰
  {"混  碰",  { 0, 0, 0,  1, 1, 1,  3, 3, 3,  4, 4, 4, 33,33}}, //混碰
  {"清龙七对-1",  { 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] 一筒对.一筒对.二筒对.二筒对.四筒对.五筒对.六条对.
回复

使用道具 举报

1

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2025-5-12 09:40:05 | 显示全部楼层
回个帖子,下班咯~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|VV游戏

GMT+8, 2025-5-30 19:37 , Processed in 0.083565 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表