📄 cmajianggamedlg.cpp
字号:
int ret=bb.GetBadly();
if( ret==pai )return -1;
if( bb.GetMaxScore() > m_nComputerGoodScore+150 )
{
m_nComputerGoodScore=bb.GetMaxScore()+m_arrComHupai.GetSize()*1000;
int pai1,pai2,pai3,pos1,pos2,posbad;
bb.GetGoodTeam(pai1,pai2,pai3);
posbad=FindPaiComPos(ret,m_nStartPosComputer);
// m_nMjComputer[posbad]=m_nMjComputer[m_nStartPosComputer];;
if( pai1==pai2 )
{
pos1=FindPaiComPos(pai1,m_nStartPosComputer);
pos2=FindPaiComPos(pai1,pos1+1);
PlayChessSound(S_PON);
}
else
{
PlayChessSound(S_EAT);
if( pai1== pai )
{
pos1=FindPaiComPos(pai2,m_nStartPosComputer);
pos2=FindPaiComPos(pai3,m_nStartPosComputer);
}
else if( pai2==pai )
{
pos1=FindPaiComPos(pai1,m_nStartPosComputer);
pos2=FindPaiComPos(pai3,m_nStartPosComputer);
}
else
{
pos1=FindPaiComPos(pai1,m_nStartPosComputer);
pos2=FindPaiComPos(pai2,m_nStartPosComputer);
}
}
/* if( posbad==-1 || pos1==-1 || pos2==-1 )
{
CString str;
str.Format("%d,%d,%d",pai1,pai2,pai3);
AfxMessageBox(str);
}
*/
m_nMjComputer[posbad]=-1;//m_nMjComputer[m_nStartPosComputer];
m_nMjComputer[pos1]=-1;//m_nMjComputer[m_nStartPosComputer+1];
m_nMjComputer[pos2]=-1;//m_nMjComputer[m_nStartPosComputer+2];;
for( i=m_nStartPosComputer;i<16;i++ )
{
if( m_nMjComputer[i]==-1 )
{
for( j=i;j>m_nStartPosComputer;j-- )
m_nMjComputer[j]=m_nMjComputer[j-1];
}
}
m_nMjComputer[m_nStartPosComputer+2]=pai3;
m_nMjComputer[m_nStartPosComputer+1]=pai2;
m_nMjComputer[m_nStartPosComputer]=pai1;
m_nStartPosComputer+=3;
SortMj(m_nMjComputer,m_nStartPosComputer);
return ret;//-1;
}
return -1;
}
int CCMajiangGameDlg::CalculateTaiNumber(int who,BOOL bZimo)
{
CString huname[10];
int n=0,taishu[10],totaltai=0,ret;
if( bZimo==TRUE )
{
if( GetMenqing(who) )
{
huname[n]="门清自摸";
taishu[n]=2;
n++;
}
else
{
huname[n]="自摸";
taishu[n]=1;
n++;
}
}//zimo
else
{
if( GetMenqing(who) )
{
huname[n]="门清";
taishu[n]=1;
n++;
}
}
if( GetQuanqiu(who) )
{
huname[n]="全求";
taishu[n]=2;
n++;
}
if( GetDuting(who) )
{
huname[n]="独听";
taishu[n]=1;
n++;
}
if( GetHaidilaoyue(who) )
{
huname[n]="海底捞月";
taishu[n]=1;
n++;
}
if( GetPengpenghu(who) )
{
huname[n]="碰碰胡";
taishu[n]=4;
n++;
}
if( GetPinghu(who) )
{
huname[n]="平胡";
taishu[n]=2;
n++;
}
ret=GetSixiPai(who);
if( ret==16 )
{
huname[n]="大四喜";
taishu[n]=16;
n++;
}
else if( ret==8 )
{
huname[n]="小四喜";
taishu[n]=8;
n++;
}
ret=GetSanyuanpai(who);
if( ret==8 )
{
huname[n]="大三元";
taishu[n]=8;
n++;
}
else if( ret==4 )
{
huname[n]="小三元";
taishu[n]=4;
n++;
}
else if( ret>0 )
{
huname[n]="三元牌";
taishu[n]=ret;
n++;
}
ret=GetQingyise(who);
if( ret==8 )
{
huname[n]="清一色";
taishu[n]=8;
n++;
}
else if( ret==4 )
{
huname[n]="混一色";
taishu[n]=4;
n++;
}
ret=GetSananke(who);
if( ret==5 )
{
huname[n]="五暗刻";
taishu[n]=8;
n++;
}
else if( ret==4 )
{
huname[n]="四暗刻";
taishu[n]=4;
n++;
}
else if( ret==3 )
{
huname[n]="三暗刻";
taishu[n]=4;
n++;
}
if( m_bGangSKH )
{
huname[n]="杠上开花";
taishu[n]=1;
n++;
}
if( n==0 )
{
huname[n]="推倒胡";
taishu[n]=1;
n++;
}
CPicture pic;
pic.Load("images\\HupaiTable.JPG");
pic.Render(&m_dcMem,CRect(198,136,426+198,213+136));
CFont ft,*oldft;
CString str;
CRect rect(10,160,800,600);
ft.CreatePointFont(200,"隶书",NULL);
oldft=m_dcMem.SelectObject(&ft);
m_dcMem.SetTextColor(RGB(255,255,255));
m_dcMem.SetBkMode(TRANSPARENT);
int col=n/5;
for( int i=0;i<col;i++ )
for( int j=0;j<5;j++ )
{
str.Format("%-8s%2d台",huname[i*5+j],taishu[i*5+j]);
m_dcMem.TextOut(230+i*200,166+j*25,str);
totaltai+=taishu[i*5+j];
}
for( i=0;i<n%5;i++ )
{
str.Format("%-8s%2d台",huname[col*5+i],taishu[col*5+i]);
m_dcMem.TextOut(230+col*200,166+i*25,str);
totaltai+=taishu[col*5+i];
}
m_dcMem.SetTextColor(RGB(255,255,0));
str.Format("合计%6d台",totaltai);
m_dcMem.TextOut(230,176+5*25,str);
m_dcMem.SelectObject(oldft);
POINT pt;
::GetCursorPos(&pt);
SetCursorPos(pt.x,pt.y);
UpdateFrame();
/*
CString str;;
int col=n/5;
for( int i=0;i<col;i++ )
for( int j=0;j<5;j++ )
{
str=str+huname[i*5+j];
str+="\r\n";
}
for( i=0;i<n%5;i++ )
{
str=str+huname[col*5+i];
str+="\r\n";
}
AfxMessageBox(str);
*/
return 0;
}
////////计算[成牌台数
int CCMajiangGameDlg::GetMenqing(int type)//门清
{
int n=0;
if( type==1 )
{
for( int i=0;i<5;i++)
if( m_nGangUser[i]==1 )n++;
if( m_nStartPosUser-n*3==0 )return 1;
}
else
{
for( int i=0;i<5;i++)
if( m_nGangComputer[i]==1 )n++;
if( m_nStartPosComputer-n*3==0 )return 1;
}
return 0;
}
int CCMajiangGameDlg::GetSanyuanpai(int type)//三元牌
{
int ret=0,pos1,pos2,pos3;
BOOL bFind[3],bXiaosnayuan=FALSE;//小三元
bFind[0]=bFind[1]=bFind[2]=FALSE;
if( type==2 )
{
for( int i=0;i<3;i++ )
{
pos1=FindPaiComPos(31+i);
pos2=FindPaiComPos(31+i,pos1+1);
pos3=FindPaiComPos(31+i,pos2+1);
if( pos1!=-1 && pos2!=-1 && pos3!=-1 )
{
bFind[i]=TRUE;
ret++;
}
}
if( ret==2 )
{
if( bFind[0]==FALSE )
{
pos1=FindPaiComPos(31);
pos2=FindPaiComPos(31,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaosnayuan=TRUE;
}
else if( bFind[1]==FALSE )
{
pos1=FindPaiComPos(32);
pos2=FindPaiComPos(32,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaosnayuan=TRUE;
}
else
{
pos1=FindPaiComPos(33);
pos2=FindPaiComPos(33,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaosnayuan=TRUE;
}
}
}
else
{
for( int i=0;i<3;i++ )
{
pos1=FindPaiPos(31+i);
pos2=FindPaiPos(31+i,pos1+1);
pos3=FindPaiPos(31+i,pos2+1);
if( pos1!=-1 && pos2!=-1 && pos3!=-1 )
{
bFind[i]=TRUE;
ret++;
}
}
if( ret==2 )
{
if( bFind[0]==FALSE )
{
pos1=FindPaiPos(31);
pos2=FindPaiPos(31,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaosnayuan=TRUE;
}
else if( bFind[1]==FALSE )
{
pos1=FindPaiPos(32);
pos2=FindPaiPos(32,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaosnayuan=TRUE;
}
else
{
pos1=FindPaiPos(33);
pos2=FindPaiPos(33,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaosnayuan=TRUE;
}
}
}
if( ret==3 ) return 8;//大三元
if( ret==2 && bXiaosnayuan==TRUE )return 4;//是小三元
return ret;
}
int CCMajiangGameDlg::GetPinghu(int type)//平胡
{
int i;
if( type==1 )
{
for( i=0;i<m_nStartPosUser/3;i++ )
if( m_nMjUser[i*3]==m_nMjUser[i*3+1] )return 0;
for( i=0;i<(15-m_nStartPosUser)/3;i++ )
if( m_nHupaiTeam[i*3]==m_nHupaiTeam[i*3+1] )return 0;
}
else
{
for( i=0;i<m_nStartPosComputer/3;i++ )
if( m_nMjComputer[i*3]==m_nMjComputer[i*3+1] )return 0;
for( i=0;i<(15-m_nStartPosComputer)/3;i++ )
if( m_nHupaiTeam[i*3]==m_nHupaiTeam[i*3+1] )return 0;
}
return 2;
}
int CCMajiangGameDlg::GetSananke(int type)//N暗刻
{
int i,n=0;
if( type==1 )
{
for( i=0;i<m_nStartPosUser/3;i++ )
if( m_nGangUser[i]==1 && m_nMjUser[i*3]==m_nMjUser[i*3+1] )n++;
for( i=0;i<(15-m_nStartPosUser)/3;i++ )
if( m_nHupaiTeam[i*3]==m_nHupaiTeam[i*3+1] )n++;
}
else
{
for( i=0;i<m_nStartPosComputer/3;i++ )
if( m_nGangComputer[i]==1 && m_nMjComputer[i*3]==m_nMjComputer[i*3+1] )n++;
for( i=0;i<(15-m_nStartPosComputer)/3;i++ )
if( m_nHupaiTeam[i*3]==m_nHupaiTeam[i*3+1] )n++;
}
return n;
}
int CCMajiangGameDlg::GetPengpenghu(int type)//碰碰胡
{
int i,n=0;
if( type==1 )
{
for( i=0;i<m_nStartPosUser/3;i++ )
if( m_nMjUser[i*3]==m_nMjUser[i*3+1] )n++;
for( i=0;i<(15-m_nStartPosUser)/3;i++ )
if( m_nHupaiTeam[i*3]==m_nHupaiTeam[i*3+1] )n++;
}
else
{
for( i=0;i<m_nStartPosComputer/3;i++ )
if( m_nMjComputer[i*3]==m_nMjComputer[i*3+1] )n++;
for( i=0;i<(15-m_nStartPosComputer)/3;i++ )
if( m_nHupaiTeam[i*3]==m_nHupaiTeam[i*3+1] )n++;
}
if( n==5 )
return 4;
return 0;
}
int CCMajiangGameDlg::GetQingyise(int type)//清一色
{
int i,n=0;
if( type==1 )
{
for( i=0;i<15;i++ )
if( m_nMjUser[i]<27 && m_nMjUser[i+1]<27)
{
if(m_nMjUser[i]/9==m_nMjUser[i+1]/9 )n++;
else return 0;
}
}
else
{
for( i=0;i<15;i++ )
if( m_nMjComputer[i]<27 && m_nMjComputer[i+1]<27 )
{
if(m_nMjComputer[i]/9==m_nMjComputer[i+1]/9 )n++;
else return 0;
}
}
if( n>=15 )
return 8;//清一色
return 4;//混一色
}
int CCMajiangGameDlg::GetSixiPai(int type)//大四喜或小四喜
{
int ret=0,pos1,pos2,pos3;
BOOL bFind[4],bXiaoSixi=FALSE;//小四喜
bFind[0]=bFind[1]=bFind[2]=bFind[3]=FALSE;
if( type==2 )
{
for( int i=0;i<4;i++ )
{
pos1=FindPaiComPos(27+i);
pos2=FindPaiComPos(27+i,pos1+1);
pos3=FindPaiComPos(27+i,pos2+1);
if( pos1!=-1 && pos2!=-1 && pos3!=-1 )
{
bFind[i]=TRUE;
ret++;
}
}
if( ret==3 )
{
if( bFind[0]==FALSE )
{
pos1=FindPaiComPos(27);
pos2=FindPaiComPos(27,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
else if( bFind[1]==FALSE )
{
pos1=FindPaiComPos(28);
pos2=FindPaiComPos(28,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
else if( bFind[2]==FALSE )
{
pos1=FindPaiComPos(29);
pos2=FindPaiComPos(29,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
else
{
pos1=FindPaiComPos(30);
pos2=FindPaiComPos(30,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
}
}
else
{
for( int i=0;i<4;i++ )
{
pos1=FindPaiPos(27+i);
pos2=FindPaiPos(27+i,pos1+1);
pos3=FindPaiPos(27+i,pos2+1);
if( pos1!=-1 && pos2!=-1 && pos3!=-1 )
{
bFind[i]=TRUE;
ret++;
}
}
if( ret==3 )
{
if( bFind[0]==FALSE )
{
pos1=FindPaiPos(27);
pos2=FindPaiPos(27,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
else if( bFind[1]==FALSE )
{
pos1=FindPaiPos(28);
pos2=FindPaiPos(28,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
else if( bFind[2]==FALSE )
{
pos1=FindPaiComPos(29);
pos2=FindPaiComPos(29,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
else
{
pos1=FindPaiPos(30);
pos2=FindPaiPos(30,pos1+1);
if( pos1!=-1 && pos2!=-1 )bXiaoSixi=TRUE;
}
}
}
if( ret==4 ) return 16;//大四喜
if( ret==3 && bXiaoSixi==TRUE )return 8;//是小四喜
return 0;
}
int CCMajiangGameDlg::GetHaidilaoyue(int type)//海底捞月
{
if( type==1 )
{
if( m_nOutPaiUserNumber==17 )return 1;
}
else
{
if( m_nOutPaiComputerNumber==17 )return 1;
}
return 0;
}
int CCMajiangGameDlg::GetDuting(int type)//独听
{
if( type==1 )
{
if( m_arrHupai.GetSize()==1 )return 1;
}
else
{
if( m_arrComHupai.GetSize()==1 )return 1;
}
return 0;
}
int CCMajiangGameDlg::GetQuanqiu(int type)//全求
{
if( type==1 )
{
if( m_nStartPosUser==15 )return 1;
}
else
{
if( m_nStartPosComputer==15 )return 1;
}
return 0;
}
void CCMajiangGameDlg::Damanguan(BOOL m_bUser)
{
int a[10][16]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,31,31,31,32,32,33,33},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,31,31,31,32,33,33},
{ 0, 0, 1, 1, 2, 3, 4, 4, 6, 6, 7,-1,-1,-1,-1,-1},
{ 0, 1, 2, 2, 2, 3, 4, 4, 5,27,27,28,29,-1,-1,-1},
{ 9,10,10,11,13,15,16,17,13,17,-1,-1,-1,-1,-1,-1},
{ 9,10,10,10,14,14,15,17,13,17,15,-1,-1,-1,-1,-1},
{18,18,19,20,20,23,24,26,26,-1,-1,-1,-1,-1,-1,-1},
{18,19,19,20,23,23,24,25,26,27,27,29,-1,-1,-1,-1},
{11,11,28, 30,30,26,26,27,27,27,28,29,29,30,-1,-1},
{27, 27, 30, 19,20,27,30,28,28,28,28,29,29,-1,-1,-1},
};
int n=rand()%10;
int *p;
if( m_bUser )
p=m_nMjUser;
else p=m_nMjComputer;
for( int i=0;i<16;i++ )
{
if( a[n][i]==-1 )
p[i]=GetRndMj();
else
{
if( GetFixMj(a[n][i]) )
p[i]=a[n][i];
else p[i]=GetRndMj();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -