[参考]关于麻将听牌的算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;
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=(0,0,1,1,1,0,3,0,0, 1,2,2,1,0,2,0,0,0, ......)
// 十三么检测开始(鸡胡里没有十三么)
关于麻将听牌的算法
假设有:
二万,三万,四万,五万,六万,七万ຫໍສະໝຸດ 八万 如果听牌的话有下列:
1,(二万,三万,四万)+(五万,六万,七万)+八万---->听八万
2,(二万,三万,四万)+(六万,七万,八万)+五万---->听五万
// 每一手可胡的麻将可拆分为五组牌,这五组牌分别由顺子,刻子和
// 有且唯一的将牌(即对子)组成,
// 所以每一手可胡的麻将牌理论上可能的胡牌组合=3的5次方=243种.
// 实际上胡牌的可能组合为112种(因为将牌的特殊原因)
// 设置循环方式,将112种胡牌组合依次代入,组合成功时退出.
// 先计算出本次循环要代入的胡牌组合代数
// ==把待检测的14张牌转换成位置数组
for i :=0 to 33 do // 初始化,置零值
Test[1]:= (j-(Test[0]*81)) div 27; // 第二组的组合形式
if Test[1]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
function ZiMo(VInput:array of integer):bool;
var
TmpZimo:bool;
Test:array[0..4] of integer; // 胡牌组合检测参数
while j<=242 do // 242次循环开始(3进制转换算法)
begin
m:=0;
// 将113/243种胡牌组合中取一种组合赋予给Test[i]
(Tmp34Card[33]=2)
) then
begin
TmpZimo := true;
j:=243;
end;
// 十三么检测结束
(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
Test[2]:= (j-(Test[0]*81)-(Test[1]*27)) div 9; //第3组
if Test[2]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
Test[0] := j div 81; // 第一组的组合形式(将,刻,顺)
if Test[0]=0 then inc(m,1); // 每发现一组将牌,则参数m+1;
// 上面段是从所有胡牌组合中取出一种可能组合并赋予Test[i]
if m>1 then // 将牌不能超过一组,否则舍去此种组合,并重新循环
begin
for n :=0 to 33 do
s:=s+' '+inttostr(Tmp34Card[n]);
ShowMessage(s);
}
Sn:=0; // 首张牌的位置号.置零
begin
k:=0; // 找到(剩下牌中)首张牌的位置
while k <= 33 do // 每一轮检测后都要在数组中减去已成功组合
inc(j,1);
continue;
end;
// ==把待检测的14张牌转换成位置数组
for i :=0 to 33 do // 初始化,全部置零值
i:=0; // 胡牌组合的第几组
// 将113种胡牌组合中取一种组合代入待检牌
// 可胡性检测开始
while i<=4 do // 每一手可胡的麻将可拆分为五组牌
Tmp34Card:array[0..33] of integer; // 14张牌的位置数组
i,j,k,m,Sn,TestSuccess:integer; // Sn用来存首张牌的位置
// JiangNo是将牌的组数
Tmp34Card[i]:=0;
for i :=0 to 13 do // 将麻将牌号换算为位置
inc(Tmp34Card[(VInput[i]-1) div 4],1); //(本句已通过验证)
// s:string;
begin
TmpZimo := false; // 赋予初值
j:=0;
MySort(VInput,14); // 排序
(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[27]>0) and (Tmp34Card[28]>0) and (Tmp34Card[29]>0) and
(Tmp34Card[30]>0) and (Tmp34Card[31]>0) and (Tmp34Card[32]>0) and
// ==转换完成
// 经过上循环,得出状如下列的数组
// Tmp34Card=(0,0,1,1,1,0,3,0,0, 1,2,2,1,0,2,0,0,0, ......)
{
s:='';
3,(三万,四万,五万)+(六万,七万,八万) +二万---->听二万
就要判断出上面的三组听牌可能,上面的牌都有一个对应值,分别是(2,3,4,5,6,7,8)
你能谈谈你的思路吗?????
// [函数] 自摸检测(鸡胡)
Tmp34Card[i]:=0;
for i :=0 to 13 do // 将麻将牌号换算为位置
inc(Tmp34Card[(VInput[i]-1) div 4],1); //(本句已通过验证)