通过子程序match对牌的序列进行一一对应的匹配,并给相应变量赋值
通过整型数组存储牌序号,为便于调用,令万字数牌为0~8,条字数牌为10~18,筒字数牌为20~28,东南西北中发白分别为30,31,32,33,34,35,36.在调用时将牌数组首地址传入子程序
由于匹配关系为一一对应,因此在算番时只需读入匹配数据即可判定为何种牌
int existm(int mb,int pp,int factor)//返回牌列中某种牌的未匹配数目 { int sum,i; sum=0; for(i=0;i<20;i++) if(*(mb+i)==factor&&*(pp+i)==0)sum++; return sum; }
int findzero(int mb)//返回牌列中0(即开始无牌)的位置 { int inde,i; for(i=0;i<20;i++) if(*(mb+i)==0){inde=i;break;} return inde; }
int findnext(int mb,int pp,int factor,int start,int end)//查找牌列中指定牌的未匹配的下一张位置 { int ifget,i; if(existm(mb,pp,factor)<1)return 0; for(i=start;i<end&&ifget==0;i++) if(*(mb+i)==factor&&*(pp+i)==0) {ifget=1;return i;} }
int match(int mb,int pp,int zero)//匹配指定牌列 { int i,j,xh,ssy; jiang=0; xh=0; ssy=0; while(i<zero) { if(existm(mb,pp,*(mb+i))>=3&&jiang>=1)//一种牌存在3张 {*(pp+i)=1;*(pp+findnext(mb,pp,*(mb+i),i+1,zero))=1;//匹配关系1代表刻子 *(pp+findnext(mb,pp,*(mb+i),findnext(mb,pp,*(mb+i),i+1,zero),zero))=1; } if(existm(mb,pp,*(mb+i))>=2)//一种牌存在2张 {*(pp+i)=3;*(pp+findnext(mb,pp,*(mb+i),i+1,zero))=3;jiang++;//匹配关系3代表将牌 if(*(mb+i)==0||*(mb+i)==8||*(mb+i)==10||*(mb+i)==18||*(mb+i)==20||*(mb+i)==28||*(mb+i)==30||*(mb+i)==31||*(mb+i)==32||*(mb+i)==33||*(mb+i)==34||*(mb+i)==35||*(mb+i)==36) ssy=1; } if(existm(mb,pp,*(mb+i))==1)//一种牌存在1张 { if((*(mb+i)%10+1)>0&&(*(mb+i)%10+1)<10&&*(mb+i)<30)//数字牌 { if((*(mb+i)%10+1)>2&&existm(mb,pp,*(mb+i)-1)>0&&existm(mb,pp,*(mb+i)-2)>0)//与左边成顺 { *(pp+i)=2;//匹配关系2代表顺子 *(pp+findnext(mb,pp,*(mb+i)-1,0,zero))=2; *(pp+findnext(mb,pp,*(mb+i)-2,0,zero))=2; } else if((*(mb+i)%10+1)<8&&existm(mb,pp,*(mb+i)+1)>0&&existm(mb,pp,*(mb+i)+2)>0)//与右边成顺 { *(pp+i)=2; *(pp+findnext(mb,pp,*(mb+i)+1,0,zero))=2; *(pp+findnext(mb,pp,*(mb+i)+2,0,zero))=2; } else if((*(mb+i)%10+1)>1&&(*(mb+i)%10+1)<9&&existm(mb,pp,*(mb+i)+1)>0&&existm(mb,pp,*(mb+i)-1)>0)//与左右成顺 { *(pp+i)=2; *(pp+findnext(mb,pp,*(mb+i)+1,0,zero))=2; *(pp+findnext(mb,pp,*(mb+i)-1,0,zero))=2; } } }//if i++; }//while //13幺牌型 for(j=0;j<7;j++) if(existm(mb,pp,30+j)==0)xh++; if(existm(mb,pp,0)==0)xh++; if(existm(mb,pp,8)==0)xh++; if(existm(mb,pp,10)==0)xh++; if(existm(mb,pp,18)==0)xh++; if(existm(mb,pp,20)==0)xh++; if(existm(mb,pp,28)==0)xh++;//当缺少13幺的指定牌时,xh自增 if(xh==1&&ssy==1) {for(j=0;j<zero;j++) *(pp+j)=4;//匹配关系4代表13幺牌型 } xh=0; for(j=0;j<zero;j++) if(*(pp+i)==0)xh++;//若有未匹配的,xh自增 if((xh==0&&jiang==1)||jiang>=7)return *(pp+zero-1);//有将并全匹配或将为7(7对)时,返回最后一张牌的匹配状态(即胡的牌) else { return 0; } }

|