if (Tmp34Card[0]>0) and (Tmp34Card[8]>0) and (Tmp34Card[9]>0) and
(Tmp34Card[17]>0) and (Tmp34Card[18]>0) and (Tmp34Card[26]>0) and
(Tmp34Card[27]>0) and (Tmp34Card[28]>0) and (Tmp34Card[29]>0) and
(Tmp34Card[30]>0) and (Tmp34Card[31]>0) and (Tmp34Card[32]>0) and
(Tmp34Card[33]>0) and
(
(Tmp34Card[0]=2) or (Tmp34Card[8]=2) or (Tmp34Card[9]=2) or
(Tmp34Card[17]=2) or (Tmp34Card[18]=2) or (Tmp34Card[26]=2) or
(Tmp34Card[27]=2) or (Tmp34Card[28]=2) or (Tmp34Card[29]=2) or
(Tmp34Card[30]=2) or (Tmp34Card[31]=2) or (Tmp34Card[32]=2) or
(Tmp34Card[33]=2)
) then
begin
TmpZimo := true;
j:=243;
end;
// 十三么检测结束
while j<=242 do // 242次循环开始(3进制转换算法)
begin
m:=0;
// 将113/243种胡牌组合中取一种组合赋予给Test[i]
Test[0] := j div 81; // 第一组的组合形式(将,刻,顺)
if Test[0]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
Test[1]:= (j-(Test[0]*81)) div 27; // 第二组的组合形式
if Test[1]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
Test[2]:= (j-(Test[0]*81)-(Test[1]*27)) div 9; //第3组
if Test[2]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
Test[3]:= (j-(Test[0]*81)-(Test[1]*27)-(Test[2]*9)) div 3; //第4组
if Test[3]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
Test[4]:= j-(Test[0]*81)-(Test[1]*27)-(Test[2]*9)-(Test[3]*3); //第5组
if Test[4]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
// 上面段是从所有胡牌组合中取出一种可能组合并赋予Test[i]
if m>1 then // 将牌不能超过一组,否则舍去此种组合,并重新循环
begin
inc(j,1);
continue;
end;
// ==把待检测的14张牌转换成位置数组
for i :=0 to 33 do // 初始化,全部置零值
Tmp34Card[i]:=0;
for i :=0 to 13 do // 将麻将牌号换算为位置
inc(Tmp34Card[(VInput[i]-1) div 4],1); //(本句已通过验证)
{
s:='';
for n :=0 to 33 do
s:=s+' '+inttostr(Tmp34Card[n]);
ShowMessage(s);
}
Sn:=0; // 首张牌的位置号.置零
i:=0; // 胡牌组合的第几组
// 将113种胡牌组合中取一种组合代入待检牌
// 可胡性检测开始
while i<=4 do // 每一手可胡的麻将可拆分为五组牌
begin
k:=0; // 找到(剩下牌中)首张牌的位置
while k <= 33 do // 每一轮检测后都要在数组中减去已成功组合
begin // 的牌,所以要重新测定首张牌的位置
if Tmp34Card[k]<>0 then
begin
Sn:=k; // 检测到后打上标志
k:=34; // 首张牌的位置号 eg: 9是一索
end;
inc(k,1);
end;
// 对子 2
if Test[i]=0 then // 待检参数为将牌(对子)=>进入此段检测
begin
if Tmp34Card[Sn]>1 then // 可以配成对子
begin
Dec(Tmp34Card[Sn],2); // 在检测序列中减去两张牌
TestSuccess:=1; // 本轮检测是否通过参数
end;
end;
// 刻子 3
if Test[i]=1 then // 待检参数为刻子=>进入此段检测
begin
if Tmp34Card[Sn]>2 then // 可以配成刻子
begin
Dec(Tmp34Card[Sn],3); // 在检测序列中减去三张牌
TestSuccess:=1; // 本轮检测是否通过参数
end;
end;
// 顺子 123
if Test[i]=2 then // 待检参数为顺子=>进入此段检测
begin
if (Tmp34Card[Sn+1]<>0) and (Tmp34Card[Sn+2]<>0) then // 可以配成顺子
begin
Dec(Tmp34Card[Sn],1); // 在检测序列中减去
Dec(Tmp34Card[Sn+1],1); // 在检测序列中减去
Dec(Tmp34Card[Sn+2],1); // 在检测序列中减去
TestSuccess:=1; // 本轮检测是否通过参数
end;
end;
学学,帮你顶呀!!
数组 1W......9W
1T......9T
1B......9B
dong xi nan bei zhong fa bai
必须有一对完全一样的 2 5 8作长儿
一共13个牌,我觉得最好是把所有胡牌的14棵的可能都找出来,然后把手中的牌与之比较完全一只要完全一样就听牌,听这14个中没有的那几个!!