首页 > 编程知识 正文

麻将胡牌的数学公式,麻将胡牌基本公式

时间:2023-05-06 19:34:11 阅读:193627 作者:2562

网上开源的麻将的代码比较少,本文主要介绍一个麻将的胡牌的算法。

这个麻将系统中1个麻将用一个已经封装好了的类Card来表示,Card有两个属性:Type和Num。Type表示麻将的种类(条、万、筒),Num表示某一类麻将牌面的大小。

Win函数(胡牌函数)主要包含七对 和 "3,3,3,3,2"这两种普通的种类,其中 "3,3,3,3,2"主要是通过递归算法来实现。

 bool Win (Card ca[]){//胡牌函数//先判断是否七对int number = SelectNum(ca) + 1;//先找到是一方手上麻将的数目int count = 0;if(number == 14){for(int i=0;i<=number-1;i+=2){if(ca[i].Num!=ca[i+1].Num || ca[i].Type!=ca[i+1].Type){break;}else{count ++;}}if(count == 7){return true;//七对成功 }}int num = 0;//每方的麻将有3类的时候,用一个二维数组来表示int allPai[4][10]={​{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}};for(int k=0;k<14 && ca[k].Num<=9;k++){if(ca[k].Type == 1)//万{num = ca[k].Num;allPai[0][num] +=1;allPai[0][0] +=1;}else if(ca[k].Type == 2)//饼{num = ca[k].Num;allPai[1][num] +=1;allPai[1][0] +=1;}else if(ca[k].Type == 0)//条{num = ca[k].Num;allPai[2][num] +=1;allPai[2][0] +=1;}}int jiangPos = 0;//“ 将”的位置int yuShu = 0;//余数bool jiangExisted=false;//是否满足3,3,3,3,2模型for(int i=0;i<4;i++){yuShu=(int)fmod(allPai[i][0],3);//求余数,余数为0或者是2才有可能基本的保证有可能胡牌if (yuShu==1) { return false;}if (yuShu==2) {if (jiangExisted) {//这个时候jiangExisted 为true的话,表示有手上的两类麻将与3相除得到的余数都是2,很显然达不到胡牌的条件return false;}jiangPos=i;//找到将得位置(种类)jiangExisted=true;}}for(i=0;i<4;i++){if (i!=jiangPos) {//找到不是将的其他几类牌if (!Analyze(allPai[i],i==3)){return false;}}}//该类牌中要包含将,因为要对将进行轮询,效率较低,放在最后bool success=false;//指示除掉“将”后能否通过for(int j=1;j<10;j++)//对列进行操作,用j表示{if (allPai[jiangPos][j]>=2){//除去这2张将牌(尝试着去找到将牌,然后暂时除去这两张麻将)allPai[jiangPos][j]-=2;allPai[jiangPos][0]-=2;if(Analyze(allPai[jiangPos],jiangPos==3)){success=true;}//还原这2张将牌allPai[jiangPos][j]+=2;allPai[jiangPos][0]+=2;if (success)break; }}return success;} 

 

Analyze(int aKindPai[],bool ziPai)函数主要是判断手上的麻将是不是全是由刻牌和顺牌组成的,是的话返回true,不是的话返回false。程序主要是递归算法来实现的。

 bool Analyze(int aKindPai[],bool ziPai){if (aKindPai[0]==0){//递归函数的出口return true;}//寻找第一张牌for(int j=1;j<10;j++){if (aKindPai[j]!=0){break;}}bool result;if (aKindPai[j]>=3)//作为刻牌(3张牌完全相同){//除去这3张刻牌aKindPai[j]-=3;aKindPai[0]-=3;result=Analyze(aKindPai,ziPai);//还原这3张刻牌aKindPai[j]+=3;aKindPai[0]+=3;return result;}//作为顺牌if ((!ziPai)&&(j<8)&&(aKindPai[j+1]>0)&&(aKindPai[j+2]>0)) {//除去这3复杂的老师牌aKindPai[j]--;aKindPai[j+1]--;aKindPai[j+2]--;aKindPai[0]-=3;result=Analyze(aKindPai,ziPai);//还原这3复杂的老师牌aKindPai[j]++;aKindPai[j+1]++;aKindPai[j+2]++;aKindPai[0]+=3;return result;}return false;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。