⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmajianggamedlg.cpp

📁 一个完整的麻将游戏原代码,可以学到很多东西
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			m_nMjUser[m_nStartPosUser+1]=pai;
			m_nMjUser[m_nStartPosUser]=pai;

			m_nMjUser[m_nStartPosUser+3]=m_nChupaiUser;

			m_nGangUser[m_nStartPosUser/3]=1;
			m_nStartPosUser+=3;

			m_nChupaiUser=GetRndMj();

			SortMj(m_nMjUser,m_nStartPosUser);;
		//	SortMj(m_nMjUser,0);
			DrawPai();
			UpdateFrame();

			return ;
		}


}

void CCMajiangGameDlg::CheckEat(int nPai)
{
		int pos1,pos2;
		int pai1,pai2;
		int i;
		if( nPai%9==0 )
		{
			pos1=FindPaiPos(nPai+1,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+2,pos1+1);

			pai2=m_nMjUser[pos2];
			for( i=pos2;i>m_nStartPosUser+1;i-- )
				m_nMjUser[i]=m_nMjUser[i-1];;

			m_nMjUser[m_nStartPosUser+1]=pai2;

			m_nChupaiUser=m_nMjUser[15];
			for( i=15;i>m_nStartPosUser+1;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_nStartPosUser+=3;
	

			DrawPai();
			UpdateFrame();


		}
		
		else if( (nPai+1)%9==0 )
		{
			pos1=FindPaiPos(nPai-2,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-1,pos1+1);
			pai2=m_nMjUser[pos2];
			for( i=pos2;i>m_nStartPosUser+1;i-- )
				m_nMjUser[i]=m_nMjUser[i-1];;

			m_nMjUser[m_nStartPosUser+1]=pai2;

			m_nChupaiUser=m_nMjUser[15];
			for( i=15;i>m_nStartPosUser+1;i-- )
				m_nMjUser[i]=m_nMjUser[i-1];;

			
			m_nMjUser[m_nStartPosUser+2]=nPai;
			m_nMjUser[m_nStartPosUser+1]=pai2;
			m_nMjUser[m_nStartPosUser]=pai1;
			
			m_nStartPosUser+=3;
			DrawPai();
			UpdateFrame();
		}
		else
		{
			int m1=0,m2=0,m3=0;
			int pos3,pos4,pos5,pos6;

			pos1=FindPaiPos(nPai-1,m_nStartPosUser);
			pos2=FindPaiPos(nPai+1,pos1+1);
			if( pos1!=-1 && pos2!=-1 )m1=1;
	
			if( nPai%9<=6 )
			{
				pos3=FindPaiPos(nPai+1,m_nStartPosUser);
				pos4=FindPaiPos(nPai+2,pos3+1);
				if( pos3!=-1 && pos4!=-1 )m2=1;
			}
			if( nPai%9>=2 )
			{
				pos5=FindPaiPos(nPai-2,m_nStartPosUser);
				pos6=FindPaiPos(nPai-1,pos5+1);
				if( pos5!=-1 && pos6!=-1 )m3=1;
			}
			m_nEatTeam=m1+m2+m3;
			if( m_nEatTeam==1 )
			{
				if( m1 )
				{
					pai1=m_nMjUser[pos1];
					for( i=pos1;i>m_nStartPosUser;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;
					m_nMjUser[m_nStartPosUser]=pai1;

					pai2=m_nMjUser[pos2];
					for( i=pos2;i>m_nStartPosUser+1;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;

					m_nMjUser[m_nStartPosUser+1]=pai2;

					m_nChupaiUser=m_nMjUser[15];
					for( i=15;i>m_nStartPosUser+1;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;

					
					m_nMjUser[m_nStartPosUser+2]=pai2;
					m_nMjUser[m_nStartPosUser+1]=nPai;
					m_nMjUser[m_nStartPosUser]=pai1;
					
	
				}
				else if( m2)
				{
					pai1=m_nMjUser[pos3];
					for( i=pos3;i>m_nStartPosUser;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;
					m_nMjUser[m_nStartPosUser]=pai1;

					pai2=m_nMjUser[pos4];
					for( i=pos4;i>m_nStartPosUser+1;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;

					m_nMjUser[m_nStartPosUser+1]=pai2;

					m_nChupaiUser=m_nMjUser[15];
					for( i=15;i>m_nStartPosUser+1;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;
	
				}
				else
				{
					pai1=m_nMjUser[pos5];
					for( i=pos5;i>m_nStartPosUser;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;
					m_nMjUser[m_nStartPosUser]=pai1;

					pai2=m_nMjUser[pos6];
					for( i=pos6;i>m_nStartPosUser+1;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;

					m_nMjUser[m_nStartPosUser+1]=pai2;

					m_nChupaiUser=m_nMjUser[15];
					for( i=15;i>m_nStartPosUser+1;i-- )
						m_nMjUser[i]=m_nMjUser[i-1];;

					
					m_nMjUser[m_nStartPosUser+2]=nPai;
					m_nMjUser[m_nStartPosUser+1]=pai1;
					m_nMjUser[m_nStartPosUser]=pai2;
	
				}

				m_nStartPosUser+=3;
				DrawPai();
				UpdateFrame();
		}////只可以有一种吃法的
        else///有两种或者三种吃法的,定时提示....
		{
			int k=0;
			if( m1 )
			{
				m_nEatPos[k++]=pos1;
				m_nEatPos[k++]=pos2;
			}
			if( m2 )
			{
				m_nEatPos[k++]=pos3;
				m_nEatPos[k++]=pos4;
			}
			if( m3 )
			{
				m_nEatPos[k++]=pos5;
				m_nEatPos[k++]=pos6;
			}
	
			m_nEatSelect=0;//m_nEatTeam;
		//	ReDrawBG(m_nEatPos[0],TRUE);
		//	ReDrawBG(m_nEatPos[1],TRUE);
			SetTimer(TIME_SELECT,1000,NULL);
			OnTimer(TIME_SELECT);
		//	CClientDC dc(this);
		//	dc.BitBlt(107+m_nEatPos[m_nEatSelect*2]*39,575,32,18,&m_dcBG,372,78,SRCCOPY);
		//	dc.BitBlt(107+m_nEatPos[m_nEatSelect*2+1]*39,575,32,18,&m_dcBG,420,78,SRCCOPY);
	

			
		}

	}
		
}

void CCMajiangGameDlg::CheckPeng(int nPai)
{
	int pos1,pos2;
		int pai1,pai2;
		int i;
			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];;

			m_nMjUser[m_nStartPosUser+1]=pai2;

			m_nChupaiUser=m_nMjUser[15];
			for( i=15;i>m_nStartPosUser+1;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_nStartPosUser+=3;
	

			DrawPai();
			UpdateFrame();


	
		
}

void CCMajiangGameDlg::OnTimer(UINT nIDEvent) 
{
		// TODO: Add your message handler code here and/or call default

	if( nIDEvent==TIME_SELECT )//吃牌提示效果
	{
		UpdateFrame();
		CClientDC dc(this);
		dc.BitBlt(102+m_nEatPos[m_nEatSelect*2]*39,572,32,18,&m_dcBG,372,78,SRCCOPY);
		dc.BitBlt(102+m_nEatPos[m_nEatSelect*2+1]*39,572,32,18,&m_dcBG,420,78,SRCCOPY);

		m_nEatSelect++;
		if( m_nEatSelect>=m_nEatTeam )m_nEatSelect=0;

	}
	else if( nIDEvent==TIME_DELAY ) //空闲统计
	{

		m_nDelay++;
		if( m_nDelay>= 8 )
		{
			CString strFile;
			m_nDelay=0;
			strFile.Format("Sound\\g_Hurry%02d.wav",rand()%11);
			::sndPlaySound(strFile,SND_ASYNC|SND_NODEFAULT);
			DrawEyes(E_BUNAI);
			DrawFace(F_OPEN1);
			Sleep(500);
			UpdateFrame();

		}
	}
	else if( nIDEvent==TIME_FLASH ) //空闲统计
	{
		static int step=0;
		step>=10000?step=0:step++;
		CClientDC dc(this);
		if( step%2 )
			dc.BitBlt(647-(m_nOutPaiComputerNumber-1)*31,422,31,48,&m_dcMem, 647-(m_nOutPaiComputerNumber-1)*31,422,SRCCOPY);

		else
		{
			if( m_nOutPaiUserNumber<10 )
				dc.BitBlt(647-(m_nOutPaiComputerNumber-1)*31,422,31,48,&m_dcBG,647-(m_nOutPaiComputerNumber-1)*31,422,SRCCOPY);
			else
				dc.BitBlt(647-(m_nOutPaiComputerNumber-1)*31,422,31,34,&m_dcBG,647-(m_nOutPaiComputerNumber-1)*31,422,SRCCOPY);
		}

	}
	CDialog::OnTimer(nIDEvent);
}

void CCMajiangGameDlg::CheckPengSelect( int nPai)
{
	int i;
	int pai1,pai2;
	int pos1,pos2;
	if( m_nEatSelect==0 )m_nEatSelect=m_nEatTeam-1;
	else m_nEatSelect--;
	pos1=m_nEatPos[m_nEatSelect*2];
	pos2=m_nEatPos[m_nEatSelect*2+1];

	pai1=m_nMjUser[pos1];
	for( i=pos1;i>m_nStartPosUser;i-- )
		m_nMjUser[i]=m_nMjUser[i-1];	
	m_nMjUser[m_nStartPosUser]=pai1;

	
			pai2=m_nMjUser[pos2];
			for( i=pos2;i>m_nStartPosUser+1;i-- )
				m_nMjUser[i]=m_nMjUser[i-1];;

			m_nMjUser[m_nStartPosUser+1]=pai2;

			m_nChupaiUser=m_nMjUser[15];
			for( i=15;i>m_nStartPosUser+1;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_nStartPosUser+=3;
	
			DrawPai();
			UpdateFrame();

}


void CCMajiangGameDlg::ShowOver(int type)
{
	CString str;
	m_bOver=TRUE;
	KillTimer(TIME_DELAY);
	m_dcMem.BitBlt(725,300,65,50*4,&m_dcBG,725,300,SRCCOPY);
	switch(type)
	{
	case S_LIU:
		str="流  局";
		break;
	case S_ZIMO:
		str="自  摸";
		break;
	case S_HU:
		str="胡";
		break;
	}

	DrawPai();

	CFont ft,*oldft;
	CRect rect(10,160,800,600);
	ft.CreatePointFont(800,"隶书",NULL);
	oldft=m_dcMem.SelectObject(&ft);
	m_dcMem.SetTextColor(RGB(255,0,0));
	m_dcMem.SetBkMode(TRANSPARENT);
	m_dcMem.DrawText(str,rect,DT_CENTER | DT_SINGLELINE | DT_VCENTER     );
	m_dcMem.SelectObject(oldft);

	CPicture pic2;
	pic2.Load("images\\start1.jpg");
	pic2.Render(&m_dcMem,m_rtBtRestart);

	UpdateFrame();



	
}

void CCMajiangGameDlg::PlayPaiSound(int nPai,BOOL bGirl)
{
	CString strFile;
	if( nPai<9 )
		strFile.Format("One%02d.wav",nPai%9+1);
	else if( nPai<18 )
		strFile.Format("Ton%02d.wav",nPai%9+1);
	else if( nPai<27 )
		strFile.Format("Sou%02d.wav",nPai%9+1);
	else
	{
		switch(nPai)
		{
		case 27:
			strFile="Wind_E.wav";
			break;
		case 28:
			strFile="Wind_S.wav";
			break;
		case 29:
			strFile="Wind_W.wav";
			break;
		case 30:
			strFile="Wind_N.wav";
			break;
		case 31:
			strFile="Word_Jone.wav";
			break;
		case 32:
			strFile="Word_Far.wav";
			break;
		case 33:
			strFile="Word_Bai.wav";
			break;
		}
	}
	if( bGirl )
		strFile="g_"+strFile;
	else
		strFile="b_"+strFile;

	::sndPlaySound("sound\\"+strFile,SND_ASYNC|SND_NODEFAULT);		

}

void CCMajiangGameDlg::PlayChessSound(int type,BOOL bGirl,BOOL bNor)
{
	CString strFile;
	switch(type)
	{
	case S_HU:
		strFile="Op_Hu.wav";
		break;
	case S_GUN:
		strFile="Op_Gun.wav";
		break;
	case S_ZIMO:
		strFile="Op_Jimo.wav";
		break;
	case S_EAT:
		strFile="Op_Eat.wav";
		break;
	case S_PON:
		strFile="Op_Pon.wav";
		break;
	case S_LIU:
		strFile="Luju.wav";
		break;
	case S_STATE:
		strFile="Others03.wav";
		break;
	case S_MOU:
		strFile="Others00.wav";
		break;
	case S_DAO:
		strFile="Others07.wav";
		break;


	}
	if( !bNor )
	{
		::sndPlaySound("sound\\"+strFile,SND_ASYNC|SND_NODEFAULT);
		return;
	}

	if( bGirl )
		strFile="g_"+strFile;
	else
		strFile="b_"+strFile;
	
	::sndPlaySound("sound\\"+strFile,SND_ASYNC|SND_NODEFAULT);		

}

void CCMajiangGameDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	::SetCursor(m_hCursorDown);
	m_bHandDown=TRUE;
	CDialog::OnLButtonDown(nFlags, point);
	MSG message;
	while(::PeekMessage(&message,this->m_hWnd,WM_LBUTTONDOWN,WM_LBUTTONDOWN,PM_REMOVE));

}

void CCMajiangGameDlg::MouseMoveOnTitle(CPoint point)
{
	BOOL bFind=FALSE;
	for( int i=0;i<4;i++ )
		if( m_rtTitle[i].PtInRect(point) )
		{
			if( m_nMouseOnTitle==i )return;
		//	Invalidate();
			CClientDC dc(this);
			CPicture pic;
			pic.Load("images\\title2.jpg");
			pic.Render(&m_dcMem);
			dc.BitBlt(m_rtTitle[i].left,m_rtTitle[i].top,m_rtTitle[i].right-m_rtTitle[i].left,m_rtTitle[i].bottom-m_rtTitle[i].top,&m_dcMem,m_rtTitle[i].left,m_rtTitle[i].top,SRCCOPY);
			m_nMouseOnTitle=i;
			PlayChessSound(S_MOU,TRUE,FALSE);
			bFind=TRUE;
			break;
		}
	if( m_nMouseOnTitle!=-1 && bFind==FALSE )
	{
		m_nMouseOnTitle=-1;
		Invalidate();
	}
	
	
}

void CCMajiangGameDlg::OnClickTitle()
{

	switch( m_nMouseOnTitle )
	{
	case 0:
		m_bTitle=FALSE;
		ResetMj();
		break;
	case 2:
		EndDialog(IDOK);
		break;
	case 3:
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
		break;

	}
}

void CCMajiangGameDlg::DrawFace(int type)
{
	CString strFile;
	switch( type )
	{
	case F_OPEN1:
		strFile="Open1.jpg";
		break;
	case F_OPEN2:
		strFile="Open2.jpg";
		break;
	case F_CLOSE:
		strFile="close.jpg";
		break;

	}
	CClientDC dc(this);
	CPicture pic;
	pic.Load("images\\"+strFile);
	pic.Render(&m_dcBuffer);
	dc.BitBlt(388,127,50,20,&m_dcBuffer,388,127,SRCCOPY);

}

void CCMajiangGameDlg::DrawEyes(int type)
{
	CString strFile;
	switch( type )
	{
	
	case E_XI:
		strFile="E_XI.jpg";
		break;
	case E_SAI:
		strFile="E_SAI.jpg";
		break;
	case E_NU:
		strFile="E_NU.jpg";
		break;
	case E_LE:
		strFile="E_LE.jpg";
		break;
	case E_BUNAI:
		strFile="E_BUNAI.jpg";
		break;
	case E_YUYE:
		strFile="E_YUYE.jpg";
		break;


	}
	CClientDC dc(this);
	CPicture pic;
	pic.Load("images\\"+strFile);
	pic.Render(&m_dcBuffer);
	dc.BitBlt(355,35,108,134,&m_dcBuffer,355,35,SRCCOPY);
}

void CCMajiangGameDlg::PlayMinganSound(int type)
{
	CString strFile;
	switch( type )
	{
	
	case E_NU:
		strFile.Format("g_hate%02d.wav",rand()%3);
		break;
	case E_LE:
		strFile.Format("g_Touch%02d.wav",rand()%4);
		break;
	case E_YUYE:
		strFile.Format("g_Sexy%02d.wav",rand()%5);
		break;

	}

	::sndPlaySound("sound\\"+strFile,SND_ASYNC|SND_NODEFAULT);
}

void CCMajiangGameDlg::SetTrans(int pos,BOOL who)
{
	COLORREF cr;
	int r1,g1,b1;

	for( int i=0;i<31;i++ )
		for( int j=0;j<48;j++ )
		{
			if( who )
				cr=m_dcMj.GetPixel(m_nOutPaiUser[pos]*31+i,129+j);//m_dcBG.GetPixel(95+pos*39+i,518+j);
			else
				cr=m_dcMj.GetPixel(m_nOutPaiComputer[pos]*31+i,176+j);//m_dcBG.GetPixel(95+pos*39+i,518+j);
			r1=100;//GetRValue(cr)*0.8;
			g1=GetGValue(cr);//*0.8;
			b1=GetBValue(cr);//*0.8;
	//		cr=m_dcMj.GetPixel(m_nMjUser[m_nPai[pos]]*39+i,64+j);
	//		r2=0;//GetRValue(cr)*0.2;
	//		g2=GetGValue(cr)*0.2;
	//		b2=GetBValue(cr)*0.2;
			if( who )
				m_dcMem.SetPixel(120+pos*31+i,456+j,RGB(r1,g1,b1));
			else
				m_dcMem.SetPixel(647-pos*31+i,422+j,RGB(r1,g1,b1));

		}
}

int CCMajiangGameDlg::ComputerThink(int pai)
{
//	return 0;
	int a[17],i;
//	CMajiangHufa mf;
	CThinkPklang bb;
	for(i=0;i<16-m_nStartPosComputer;i++)
		a[i]=m_nMjComputer[i+m_nStartPosComputer];
	a[16-m_nStartPosComputer]=pai;

	bb.SetMjPaiArray(a,16-m_nStartPosComputer+1);
	bb.Think();

	for( i=0;i<m_arrComHupai.GetSize();i++ )
		if( pai==m_arrComHupai.GetAt(i) )
		{
			bb.GetHupaiTeam(m_nHupaiTeam);
			return 1000;
		}

	m_nComputerGoodScore=bb.GetMaxScore();
	int ret=bb.GetBadly();
    if( pai!=ret )
	{
		for( i=m_nStartPosComputer;i<16;i++ )
			if( m_nMjComputer[i]==ret )
			{
				m_nMjComputer[i]=pai;
				
				break;
			}
		SortMj(m_nMjComputer,m_nStartPosComputer);
	}
	return ret;


}

void CCMajiangGameDlg::FindHu()
{
		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);
				UpdateFrame();
				break;
			}

}

int CCMajiangGameDlg::CheckNeedGet(int pai)
{
//	return -1;
	

	int a[17],i,j;
	CThinkPklang bb;
	for(i=0;i<16-m_nStartPosComputer;i++)
		a[i]=m_nMjComputer[i+m_nStartPosComputer];


	a[16-m_nStartPosComputer]=pai;
	bb.SetMjPaiArray(a,17-m_nStartPosComputer);
	bb.Think();

	for( i=0;i<m_arrComHupai.GetSize();i++ )
		if( pai==m_arrComHupai.GetAt(i) )
		{
			bb.GetHupaiTeam(m_nHupaiTeam);
			return 1000;
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -