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

📄 cmajianggamedlg.cpp

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

	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 + -