📄 cmajianggamedlg.cpp
字号:
/* if( m_nMouseOnPai>=BUTTON_HU )
{
if( m_nMouseOnPai==BUTTON_HU && m_bZimo )
m_dcMem.BitBlt(725,300+50*(m_nMouseOnPai-100),65,40,&m_dcState,1,53*4+1,SRCCOPY);
else
m_dcMem.BitBlt(725,300+50*(m_nMouseOnPai-100),65,40,&m_dcState,1,53*(m_nMouseOnPai-100)+1,SRCCOPY);
}*/
m_nMouseOnPai=BUTTON_HU;
if( m_bZimo )
m_dcMem.BitBlt(725,300+50*3,65,40,&m_dcState,68,1+53*4,SRCCOPY);
else
m_dcMem.BitBlt(725,300+50*3,65,40,&m_dcState,68,1+53*3,SRCCOPY);
UpdateFrame();
bFind=TRUE;
PlayChessSound(S_STATE,TRUE,FALSE);
}
}
}
if( bFind==FALSE && m_nMouseOnPai>=BUTTON_EAT )
{
if( m_nMouseOnPai==BUTTON_HU && m_bZimo )
m_dcMem.BitBlt(725,300+50*(m_nMouseOnPai-100),65,40,&m_dcState,1,53*4+1,SRCCOPY);
else
m_dcMem.BitBlt(725,300+50*(m_nMouseOnPai-100),65,40,&m_dcState,1,53*(m_nMouseOnPai-100)+1,SRCCOPY);
// m_dcMem.BitBlt(725,300+50*(m_nMouseOnPai-100),65,40,&m_dcState,1,53*(m_nMouseOnPai-100)+1,SRCCOPY);
UpdateFrame();
m_nMouseOnPai=-1;
}
bFind=FALSE;
if( m_nChupaiUser!=-1 )
{
CRect rt;
// if( )m_nMouseOnPai=-1;
if( m_nMouseOnPai!=-1 && m_nMouseOnPai<BUTTON_EAT)
{
rt.SetRect( 95+m_nMouseOnPai*39,495, 95+m_nMouseOnPai*39+39,65+495+10 );
if( rt.PtInRect( point ) )
{
bFind=TRUE;
return ;
}
}
for( int i=m_nStartPosUser;i<16;i++ )
{
rt.SetRect( 95+i*39,505, 95+i*39+39,65+505 );
if( rt.PtInRect( point ) )
{
if( m_nMouseOnPai!=-1 )
{
UpdateFrame();
//ReDrawBG( m_nMouseOnPai,TRUE);
//DrawPai();
}
DrawPaiUp(i);
m_nMouseOnPai=i;
bFind=TRUE;
PlayChessSound(S_MOU,TRUE,FALSE);
}
}
if( bFind==FALSE )
{
if( m_nMouseOnPai==16 && m_nMouseOnPai<BUTTON_EAT )
rt.SetRect( 725,495, 725+39,495+65+10 );
else
rt.SetRect( 725,505, 725+39,505+65 );
if( rt.PtInRect( point ) )
{
if( m_nMouseOnPai!=-1 )
UpdateFrame();//ReDrawBG( m_nMouseOnPai,TRUE);
DrawPaiUp(16);
m_nMouseOnPai=16;
bFind=TRUE;
}
}
if( bFind== FALSE && m_nMouseOnPai!=-1 && m_nMouseOnPai<100 )
{
// ReDrawBG( m_nMouseOnPai,TRUE);
UpdateFrame();
m_nMouseOnPai=-1;
}
}
}
void CCMajiangGameDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonUp(nFlags, point);
MSG message;
while(::PeekMessage(&message,this->m_hWnd,WM_LBUTTONUP,WM_LBUTTONUP,PM_REMOVE));
::SetCursor(m_hCursor);
m_bHandDown=FALSE;
if( m_bTitle )
{
// MouseMoveOnTitle();
OnClickTitle();
return;
}
////////////如果是结束了就重新开始
if( m_bOver )
{
if( m_bOnBtRestart )
ResetMj();
return;
}
//////////////是否点在敏感部位$%^*&^*&(*(
for( int i=0;i<3;i++ )
{
if( m_rtMingan[i].PtInRect(point) )
{
switch( i)
{
case 0:
DrawEyes(E_NU);
PlayMinganSound(E_NU);
break;
case 1:
DrawEyes(E_LE);
PlayMinganSound(E_LE);
break;
case 2:
DrawEyes(E_YUYE);
PlayMinganSound(E_YUYE);
break;
}
Sleep(600);
UpdateFrame();
return;
}
}
////是否是在待选择吃牌状态
if( m_nEatTeam>1 )
{
KillTimer(TIME_SELECT);
CheckPengSelect( m_nOutPaiComputer[ m_nOutPaiComputerNumber-1 ] );
m_nEatTeam=-1;
return;
}
m_nDelay=-5;
//////是否有可以吃碰胡杠标志
if( m_bEat||m_bPeng||m_bGang||m_bHu )
{
m_bEat=m_bPeng=m_bGang=m_bHu=FALSE;
m_dcMem.BitBlt(725,300,65,50*4,&m_dcBG,725,300,SRCCOPY);
UpdateFrame();
KillTimer(TIME_FLASH);
}
//是否鼠标点在吃碰胡杠标志
if( m_nMouseOnPai>=BUTTON_EAT )
{
switch( m_nMouseOnPai )
{
case BUTTON_EAT:
CheckEat( m_nOutPaiComputer[ m_nOutPaiComputerNumber-1 ] );
PlayChessSound(S_EAT,FALSE);
m_bCheckComputer[ m_nOutPaiComputerNumber-1 ]=TRUE;
break;
case BUTTON_PENG:
CheckPeng( m_nOutPaiComputer[ m_nOutPaiComputerNumber-1 ] );
PlayChessSound(S_PON,FALSE);
m_bCheckComputer[ m_nOutPaiComputerNumber-1 ]=TRUE;
break;
case BUTTON_GANG:
if( m_nChupaiUser==-1 )
{
CheckGang( m_nOutPaiComputer[ m_nOutPaiComputerNumber-1 ] );
m_bCheckComputer[ m_nOutPaiComputerNumber-1 ]=TRUE;
}
else
CheckGangSelf( m_nChupaiUser );
PlayChessSound(S_GUN,FALSE);
FindHu();
m_bGangSKH=TRUE;
break;
case BUTTON_HU:
if( m_nChupaiUser==-1 )
{
m_nChupaiUser=m_nOutPaiComputer[ m_nOutPaiComputerNumber-1 ];
ShowOver(S_HU);
PlayChessSound(S_HU,FALSE);
GetUserHupaiTeam();
CalculateTaiNumber(1,FALSE);
}
else
{
ShowOver(S_ZIMO);
PlayChessSound(S_ZIMO,FALSE);
GetUserHupaiTeam();
CalculateTaiNumber(1,TRUE);
}
return;
break;
}
CheckHupai();
m_nMouseOnPai=-1;
// UpdateFrame();
return;
}
m_bGangSKH=FALSE; //把杠上开花标志去掉
//是否是在出牌状态
if( m_nChupaiUser==-1 )
{
if( m_nOutPaiUserNumber>=18 )
{
ShowOver(S_LIU);
PlayChessSound(S_LIU,FALSE);
return;
}
m_nChupaiUser=GetRndMj();
DrawPai();
POINT pt;
::GetCursorPos(&pt);
SetCursorPos(pt.x,pt.y);
if( isCanGangSelf(m_nChupaiUser) )
{
m_bGang=TRUE;
m_dcMem.BitBlt(725,300+50*2,65,40,&m_dcState,1,53*2+1,SRCCOPY);
}
for( int i=0;i<m_arrHupai.GetSize();i++ )
if( m_nChupaiUser==m_arrHupai.GetAt(i) )
{
m_bHu=TRUE;
m_bZimo=TRUE;
m_dcMem.BitBlt(725,300+50*3,65,40,&m_dcState,1,53*4+1,SRCCOPY);
break;
}
UpdateFrame();
}
else//不是出牌状态时就出来一个牌
{
if( m_nMouseOnPai!=-1 )
{
if( m_nMouseOnPai==16 )
{
m_nOutPaiUser[ m_nOutPaiUserNumber ]=m_nChupaiUser;
}
else
{
m_nOutPaiUser[ m_nOutPaiUserNumber ]= m_nMjUser[m_nMouseOnPai];
m_nMjUser[ m_nMouseOnPai ]=m_nChupaiUser;
SortMj(m_nMjUser,m_nStartPosUser);
CheckHupai();
}
}
else
{
m_nOutPaiUser[ m_nOutPaiUserNumber ]=m_nChupaiUser;
m_nMouseOnPai=16;
}
m_nOutPaiUserNumber++;
m_nChupaiUser=-1;
// DrawPaiUp(m_nMouseOnPai);
// ReDrawBG(,TRUE);
m_nMouseOnPai=-1;
DrawPai();
UpdateFrame();
PlayPaiSound(m_nOutPaiUser[ m_nOutPaiUserNumber-1 ],FALSE);
Sleep(200);
//m_dcMem.BitBlt(90,356, 31,48,&m_dcMj,35*31,129,SRCCOPY);
int rnd;
rnd=CheckNeedGet( m_nOutPaiUser[ m_nOutPaiUserNumber-1 ] );
if( rnd==1000 )
{
m_nChupaiComputer=m_nOutPaiUser[ m_nOutPaiUserNumber-1 ];
ShowOver(S_HU);
PlayChessSound(S_HU);
CalculateTaiNumber(2,FALSE);
return;
}
if( rnd==-1 )//看需不需要吃碰的
{
rnd=GetRndMj();
int rett=ComputerThink(rnd);
if( rett==1000 )
{
Sleep(200);
m_nChupaiComputer=rnd;
ShowOver(S_ZIMO);
PlayChessSound(S_ZIMO);
CalculateTaiNumber(2,TRUE);
return;
}
rnd=rett;
m_dcMem.BitBlt(90,356, 31,48,&m_dcMj,35*31,129,SRCCOPY);
UpdateFrame();
Sleep(300);
}
else
{
m_bCheckUser[ m_nOutPaiComputerNumber ]=TRUE;
}
Sleep(200);
CheckComputerHupai();
m_nOutPaiComputerNumber++;
m_nChupaiComputer=-1;
m_nOutPaiComputer[ m_nOutPaiComputerNumber-1 ]=rnd;
if( m_nOutPaiUserNumber!=18 )
CheckPai( rnd );
for( int i=0;i<m_arrHupai.GetSize();i++ )
if( rnd==m_arrHupai.GetAt(i) )
{
m_bHu=TRUE;
m_bZimo=FALSE;
m_dcMem.BitBlt(725,300+50*3,65,40,&m_dcState,1,53*3+1,SRCCOPY);
break;
}
// ReDrawBG(m_nMouseOnPai,TRUE);
m_nChupaiUser=-1;
DrawPai();
// DrawPaiUp(16);
// ReDrawBG(16,FALSE);
m_nMouseOnPai=-1;
UpdateFrame();
DrawFace(F_OPEN1);
PlayPaiSound(rnd,TRUE);
DrawFace(F_OPEN2);
Sleep(100);
DrawFace(F_CLOSE);
if( m_nOutPaiUserNumber>=18 && m_bHu==FALSE )
{
ShowOver(S_LIU);
PlayChessSound(S_LIU,FALSE);
return;
}
}
}
void CCMajiangGameDlg::DrawPaiUp(int pos)
{
//
// CClientDC dc(this);
UpdateFrame();
CClientDC dc(this);
if( pos==16 )
{
dc.BitBlt(725,505, 39,65,&m_dcBG,725,505,SRCCOPY);
if( m_nChupaiUser!=-1 )
dc.BitBlt(725,495, 39,65,&m_dcMj,m_nChupaiUser*39,1,SRCCOPY);
}
else
{
dc.BitBlt(95+pos*39,505, 39,65,&m_dcBG,95+pos*39,505,SRCCOPY);
dc.BitBlt(95+pos*39,495, 39,65,&m_dcMj,m_nMjUser[pos]*39,1,SRCCOPY);
}
}
BOOL CCMajiangGameDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if( m_bHandDown )
::SetCursor(m_hCursorDown);
else
::SetCursor(m_hCursor);
return TRUE;//
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
BOOL CCMajiangGameDlg::isCanEat(int nPai)
{
// return FALSE;
if( nPai<27 )
{
int pos1,pos2;
//0-8 万
//9-17 筒
//18-26 条
if( nPai%9==0 )
{
pos1=FindPaiPos(nPai+1,m_nStartPosUser);
pos2=FindPaiPos(nPai+2,pos1+1);
return ( pos1!=-1 && pos2!=-1 );
}
else if( (nPai+1)%9==0 )
{
pos1=FindPaiPos(nPai-2,m_nStartPosUser);
pos2=FindPaiPos(nPai-1,pos1+1);
return ( pos1!=-1 && pos2!=-1 );
}
else
{
pos1=FindPaiPos(nPai-1,m_nStartPosUser);
pos2=FindPaiPos(nPai+1,pos1+1);
if( pos1!=-1 && pos2!=-1 )return TRUE;
if( nPai%9<=6 )
{
pos1=FindPaiPos(nPai+1,m_nStartPosUser);
pos2=FindPaiPos(nPai+2,pos1+1);
if( pos1!=-1 && pos2!=-1 )return TRUE;
}
if( nPai%9>=2 )
{
pos1=FindPaiPos(nPai-2,m_nStartPosUser);
pos2=FindPaiPos(nPai-1,pos1+1);
if( pos1!=-1 && pos2!=-1 )return TRUE;
}
}
}
return FALSE;
}
BOOL CCMajiangGameDlg::isCanPeng(int nPai)
{
int pos1,pos2;
pos1=FindPaiPos(nPai,m_nStartPosUser);
pos2=FindPaiPos(nPai,pos1+1);
return ( pos1!=-1 && pos2!=-1 );
}
BOOL CCMajiangGameDlg::isCanGang(int nPai)
{
int pos1,pos2,pos3;
pos1=FindPaiPos(nPai,m_nStartPosUser);
pos2=FindPaiPos(nPai,pos1+1);
pos3=FindPaiPos(nPai,pos2+1);
return ( pos1!=-1 && pos2!=-1 && pos3!=-1 );
}
BOOL CCMajiangGameDlg::isCanGangSelf(int nPai)
{
int i,pos1,pos2,pos3;
pos1=FindPaiPos(nPai,m_nStartPosUser);
pos2=FindPaiPos(nPai,pos1+1);
pos3=FindPaiPos(nPai,pos2+1);
if ( pos1!=-1 && pos2!=-1 && pos3!=-1 ) return TRUE;
pos1=FindPaiPos(nPai,0,m_nStartPosUser);
pos2=FindPaiPos(nPai,pos1+1,m_nStartPosUser);
pos3=FindPaiPos(nPai,pos2+2,m_nStartPosUser);
if ( pos1!=-1 && pos2!=-1 && pos3!=-1 ) return TRUE;
for( i=0;i<m_nStartPosUser/3;i++ )
if( m_nMjUser[i*3]== m_nMjUser[i*3+1] && m_nMjUser[i*3]== m_nMjUser[i*3+2] )
if( FindPaiPos( m_nMjUser[i*3],m_nStartPosUser )!=-1 )return TRUE;
for( i=m_nStartPosUser;i<16-3;i++ )
if( m_nMjUser[i]==m_nMjUser[i+1] &&
m_nMjUser[i]==m_nMjUser[i+2] &&
m_nMjUser[i]==m_nMjUser[i+3] ) return TRUE;
return FALSE;
}
int CCMajiangGameDlg::FindPaiPos(int nPai,int nStart,int nEnd)
{
for( int i=nStart;i<nEnd;i++ )
if( m_nMjUser[i]==nPai )
return i;
return -1;
}
int CCMajiangGameDlg::FindPaiComPos(int nPai,int nStart,int nEnd)
{
for( int i=nStart;i<nEnd;i++ )
if( m_nMjComputer[i]==nPai )
return i;
return -1;
}
void CCMajiangGameDlg::GetUserHupaiTeam()
{
int a[17],i;
CThinkPklang bb;
for(i=0;i<16-m_nStartPosUser;i++)
a[i]=m_nMjUser[i+m_nStartPosUser];
a[16-m_nStartPosUser]=m_nChupaiUser;
bb.SetMjPaiArray(a,17-m_nStartPosUser);
bb.Think();
bb.GetHupaiTeam(m_nHupaiTeam);
}
void CCMajiangGameDlg::CheckPai(int nPai)
{
if( isCanEat(nPai) )
{
m_bEat=TRUE;
m_dcMem.BitBlt(725,300+50*0,65,40,&m_dcState,1,53*0+1,SRCCOPY);
UpdateFrame();
}
if( isCanPeng(nPai) )
{
m_bPeng=TRUE;
m_dcMem.BitBlt(725,300+50*1,65,40,&m_dcState,1,53*1+1,SRCCOPY);
UpdateFrame();
}
if( isCanGang(nPai) )
{
m_bGang=TRUE;
m_dcMem.BitBlt(725,300+50*2,65,40,&m_dcState,1,53*2+1,SRCCOPY);
UpdateFrame();
}
if( m_bEat||m_bPeng||m_bGang )
{
SetTimer(TIME_FLASH,300,NULL);
OnTimer(TIME_FLASH);
}
}
void CCMajiangGameDlg::CheckComputerHupai()
{
int a[16],i;
CMajiangHufa mf;
for(i=0;i<16-m_nStartPosComputer;i++)
a[i]=m_nMjComputer[i+m_nStartPosComputer];
m_arrComHupai.RemoveAll();
mf.SetMjPaiArray(a,16-m_nStartPosComputer);
mf.GetHupai(&m_arrComHupai);
}
void CCMajiangGameDlg::CheckHupai()
{
int a[16],i;
m_arrHupai.RemoveAll();
CMajiangHufa mf;
m_dcMem.BitBlt(700-13*31,250, 31+15*31,48,&m_dcBG,700-13*31,250,SRCCOPY);
for(i=0;i<16-m_nStartPosUser;i++)
a[i]=m_nMjUser[i+m_nStartPosUser];
mf.SetMjPaiArray(a,16-m_nStartPosUser);
mf.GetHupai(&m_arrHupai);
for( i=0;i<m_arrHupai.GetSize();i++ )
m_dcMem.BitBlt(700-i*31,250, 31,48,&m_dcMj,m_arrHupai.GetAt(m_arrHupai.GetSize()-i-1)*31,129,SRCCOPY);
if( m_arrHupai.GetSize() )
{
CPicture pic;
pic.Load("images\\tingpai.jpg");
pic.Render(&m_dcMem,CRect(740,250,740+51,250+18));
}
}
void CCMajiangGameDlg::CheckGang(int nPai)
{
int i;
int pos1,pos2,pos3;
int pai1,pai2,pai3;
pos1=FindPaiPos(nPai,m_nStartPosUser);
pai1=m_nMjUser[pos1];
for( i=pos1;i>m_nStartPosUser;i-- )
m_nMjUser[i]=m_nMjUser[i-1];
m_nMjUser[m_nStartPosUser]=pai1;
pos2=FindPaiPos(nPai,pos1+1);
pai2=m_nMjUser[pos2];
for( i=pos2;i>m_nStartPosUser+1;i-- )
m_nMjUser[i]=m_nMjUser[i-1];
pos3=FindPaiPos(nPai,pos2+1);
pai3=m_nMjUser[pos3];
for( i=pos3;i>m_nStartPosUser+2;i-- )
m_nMjUser[i]=m_nMjUser[i-1];
m_nMjUser[m_nStartPosUser+2]=pai2;
m_nMjUser[m_nStartPosUser+1]=pai1;
m_nMjUser[m_nStartPosUser]=nPai;
m_nGangUser[m_nStartPosUser/3]=-1;
m_nStartPosUser+=3;
m_nChupaiUser=GetRndMj();
DrawPai();
UpdateFrame();
}
void CCMajiangGameDlg::CheckGangSelf(int nPai)
{
int i,pos1,pos2,pos3;
pos1=FindPaiPos(nPai,m_nStartPosUser);
pos2=FindPaiPos(nPai,pos1+1);
pos3=FindPaiPos(nPai,pos2+1);
if ( pos1!=-1 && pos2!=-1 && pos3!=-1 )
{
m_nMjUser[pos1]=m_nMjUser[m_nStartPosUser];
m_nMjUser[pos2]=m_nMjUser[m_nStartPosUser+1];
m_nMjUser[pos3]=m_nMjUser[m_nStartPosUser+2];
m_nMjUser[m_nStartPosUser+2]=nPai;
m_nMjUser[m_nStartPosUser+1]=nPai;
m_nMjUser[m_nStartPosUser]=nPai;
m_nGangUser[m_nStartPosUser/3]=1;
m_nStartPosUser+=3;
m_nChupaiUser=GetRndMj();
SortMj(m_nMjUser,m_nStartPosUser);
DrawPai();
UpdateFrame();
return ;
}
pos1=FindPaiPos(nPai,0,m_nStartPosUser);
pos2=FindPaiPos(nPai,pos1+1,m_nStartPosUser);
pos3=FindPaiPos(nPai,pos2+1,m_nStartPosUser);
if ( pos1!=-1 && pos2!=-1 && pos3!=-1 )
{
m_nGangUser[pos1/3]=-1;
m_nChupaiUser=GetRndMj();
SortMj(m_nMjUser,m_nStartPosUser);
DrawPai();
UpdateFrame();
// MessageBox("kao");
return ;
}
for( i=0;i<m_nStartPosUser/3;i++ )
if( m_nMjUser[i*3]== m_nMjUser[i*3+1] && m_nMjUser[i*3]== m_nMjUser[i*3+2] )
{
pos1=FindPaiPos( m_nMjUser[i*3],m_nStartPosUser );
if( pos1!=-1 )
{
m_nGangUser[i]=-1;
m_nMjUser[pos1]=m_nChupaiUser;
m_nChupaiUser=GetRndMj();
SortMj(m_nMjUser,m_nStartPosUser);
// SortMj(m_nMjUser,0);
DrawPai();
UpdateFrame();
return ;
}
}
for( i=m_nStartPosUser;i<16-3;i++ )
if( m_nMjUser[i]==m_nMjUser[i+1] &&
m_nMjUser[i]==m_nMjUser[i+2] &&
m_nMjUser[i]==m_nMjUser[i+3] )
{
int pai= m_nMjUser[i];
m_nMjUser[i]=m_nMjUser[m_nStartPosUser];
m_nMjUser[i+1]=m_nMjUser[m_nStartPosUser+1];
m_nMjUser[i+2]=m_nMjUser[m_nStartPosUser+2];
m_nMjUser[i+3]=m_nMjUser[m_nStartPosUser+3];
m_nMjUser[m_nStartPosUser+2]=pai;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -