c++ 胡牌 听牌

生成一张N维的图去分析, 比较容易一些

这个是2人麻将, 4人麻将改几个数值就可以用了;

判断胡牌的思路:

比如 :

 1~9万, 0x01 ~ 0x09  ;

 1~9筒 , 0x11~0x19;

 1~9条 , 0x21~ 0x29;

 东南西北中发白 : 0x31 ~ 0x39

 花牌 : 0x41 ~ 0x48;

弄一个 arr[4][10] 的数组, 做一个牌型的图出来 , 不算花牌;

然后比如 筒子 :  (0x11&0xF0 << 4) 作为花色 , 0x11 & 0x0F 作为值[不论什么牌都是 1 ~ 9 ];

数组的第一个索引放花色 ; 这个花色索引对应的数组首个元素存放此花色的数量

 

现在比如有 2万,2万, 3万 ,1筒

在数组应是 arr[0][0] == 3, arr[1][0] == 1;  第0个元素作为此花色的总数量, 他们的值统计在对应的数组上;

因此 arr[0][2]  == 2 ,  arr[1][1] == 1. 

这样每个索引都记录此牌的数量; 如此就知道了所有的牌;

 

胡牌首先判断7个一对, 有了这个数组, 直接循环就可以得出结果;

然后循环每个花色的首元素, 通过牌的数量来判断, 如果要胡牌必然有一对, 其他的牌都是3个一组.

因此对 3 除余. 如果余数是 1 则不满足胡牌的牌数, 如果是 2 则表示 此花色或许在此行中 ;

接下去就要分析牌型了, 写一个能判断顺子和克子的函数, 除了一对所在的行, 把其他行都扔进去看看能否满足牌型;

之后要对 一对所在的行做特殊处理, 因为你无法知道一对是什么样的牌型 1[11] / [11]

因此需要每次要在对应的索引上 减去2, 然后把剩余的牌去匹配是否是顺子/克子; 

如果能匹配成功, 最后能得到 [一对] 所在的 索引;  

 

下面的代码只用了一个arr[2][10] 来做演示 , arr[0] 筒子, arr[1] 风牌;

代码里全是注释;

//先写2个后面要用的函数
int getColor(char card){
    return card>>4; // (card & 0xF0 ) >> 4 也ok
}
int getValue(char card){
    return card & 0x0F;
}
//检查是否是花牌
bool isFlowerCard(char card){
    return card &0x20;
}

//所有的牌都是16进制
//每个数组第一个元素用于计算此种花色含有多少张牌
//此分布图, 不允许放入花牌,花牌先成其他牌后再使用此图即可
struct card_pic{
    char cards[2][10]; //做演示, 只算筒和字[风]牌, 要算N中花色 把2换成N即可
    card_pic(char * handcards  = 0, int len=0){
        if(handcards && len){
            gen_pic(handcards,len);
        }
    }
    bool gen_pic(char * arr, int len){
        reset();
        for(int i = 0 ; i < len ; ++i){
            int color_index = getColor(arr[i]); //getColor(arr[i]) & 0X0F 也可, 保险
            int value = getValue(arr[i]);
            if(color_index > 1){
                reset();
                return false; //不能是花牌
            }
            ++cards[color_index][0]; //增加此牌型的数量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值