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

📄 managers.cpp

📁 用MFC实现一个麻将功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
							pControl->m_ready[1]=false;
							pControl->m_ready[2]=false;
							pControl->m_ready[3]=false;
						}
						return true;
					}
					LeftNum--;
					if(LeftNum!=0)
					{
						Actions=Cardinfo(ca,PushCards[Game_State],Game_State,Sendleft[LeftNum],Game_State);
						ca[13]=Sendleft[LeftNum];
						leftstart=(leftstart+1)%108;

						Power[PlayerAc]*=2;
						PointPlayer=PlayerAc;
					}
					else
						Game_State=10;
				//	OutCard.Num=10;		
					pView->PrintAll();
					PlaySound(action);	
					return true;
				}
		}
		if(action==9 && Actions>=100)
		{		
			CNum	score;
			score.m_cstring.Format("恭喜你胜利了!");
			char st[100];
			sprintf(st,"majiangdoing%c%c%c",PlayerAc+100,109,(Actions/100));
			if(!MainComputer)
				pControl->SendMsg(pControl->m_pSocket,st);
			else
			{
				pControl->Broadcast(st,NULL);
			}
			GameOver(Actions/100);
			score.m_player1=pView->PlayerNames[(4-PlayerAc)%4];
			score.m_player2=pView->PlayerNames[(5-PlayerAc)%4];
			score.m_player3=pView->PlayerNames[(6-PlayerAc)%4];
			score.m_player4=pView->PlayerNames[(7-PlayerAc)%4];
			score.m_score1.Format("%d",PlayPoints[0]);
			score.m_score2.Format("%d",PlayPoints[1]);
			score.m_score3.Format("%d",PlayPoints[2]);
			score.m_score4.Format("%d",PlayPoints[3]);
			score.DoModal();	
			pView->PrintAll();
			PlaySound(action);
		}
	}
	return false;
}

void Managers::Updata()
{
	if(OutCard.Num==10)//没有人出牌,就等Game_State出牌咯 Game_State不改变
		return ;
	//现在有玩家OutPlayer出了牌,判断有没有玩家需要这牌,当然出牌的玩家是不会要这张牌了
	int i,j;
	for(i=(Game_State+1)%4;i!=OutPlayer;i=(i+1)%4)
	{
		j=Cardinfo(PlayCards[i],PushCards[i],OutPlayer,OutCard,i);
		if(j!=0)
		{
			Game_State=i;
			if(Game_State!=PlayerAc)
				Actions=0;
			else
				Actions=j;
			return;
		}
		
	}
	Game_State=(OutPlayer+1)%4;
	OutCard.Num=10;
	leftstart=(leftstart+1)%108;
	if(LeftNum==0)
	{
		Game_State=10;
		if(MainComputer)
		{
			pControl->m_ready[0]=false;
			pControl->m_ready[1]=false;
			pControl->m_ready[2]=false;
			pControl->m_ready[3]=false;
		}
		return;
	}

	if(Game_State==PlayerAc)
	{
		Actions=Cardinfo(PlayCards[Game_State],PushCards[Game_State],Game_State,Sendleft[LeftNum-1],Game_State);
	}
	else
	{
		Actions=0;
	}
	PlayCards[Game_State][13]=Sendleft[LeftNum-1];
	PlayCards[Game_State][13].Click=false;
	LeftNum--;
	PointPlayer=(OutPlayer+1)%4;
	OutCard.Num=10;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:SortCard(Card ca[])
* 函数介绍:理牌
* 输入参数:需要整理的牌数组
* 输出参数:无
* 返回值  :无
*/
void Managers::SortCard(Card ca[])
{
	int i,j;
	Card temp;
	if(ca[13].Num<=9)
	{
		for(j=0;j<13;j++)
			if(ca[j].Num==10)
				break;
		ca[j]=ca[13];
		ca[j+1].Num=10;
	}
	for(i=0;i<14 && ca[i].Num<=9;i++)
		for(j=i+1;j<14 && ca[j].Num<=9;j++)
			if(ca[i].Type*10+ca[i].Num>ca[j].Type*10+ca[j].Num)
			{
				temp=ca[i];
				ca[i]=ca[j];
				ca[j]=temp;
			}
}

void Managers::Cardinsert(const Card inc, Card ca[],int num)
{
	int t,k;
	for(k=0;k<20 && ca[k].Num<=9;k++);
	for(t=k;t<k+num;t++)
		ca[t]=inc;
	SortCard(ca);
}

void Managers::Carddelete(int start, Card ca[],int num)
{
	int t;
	if(start==13)
	{	
		ca[13].Num=10;
		return;
	}
	for(t=start;t<20 && ca[t+num].Num<=9;t++)
		ca[t]=ca[t+num];
	ca[t].Num=10;
}


////////////////////////////////////////////////////////////////////////
/*
* 函数名称:Cardinfo(Card ca[],Card pushca[],//手上的和桌子上自己打的牌
			int inp, Card inc	//摸或者别人打出来的牌 以及摸或者打牌的人
			int player)			//ca所属于的玩家
* 函数介绍:获得牌信息
* 输入参数:略
* 输出参数:int
* 返回值  :个位:时候能碰 十位 是否能杠,百位极以 如果能和牌那么他是多少翻
*/
int Managers::Cardinfo(Card ca[],Card pushca[],int inp, Card inc,int player)
{
	
	Card cad[14];//存储如果别人打的牌在用户手里会有什么结果
	int num;
	int state=0;
	int i,j;

	//复制所有牌,为判断和牌做准备
	for(num=0;ca[num].Num<10 && num<14;num++)
	{
		cad[num]=ca[num];
		cad[num].Click=false;
	}	
	ca[num].Num=10;
	//杠 如果是inc引起的杠
	j=0;
	for(i=0;ca[i+2].Num<=9;i++)
	{
		if(inc==ca[i] && inc==ca[i+1] && inc==ca[i+2]) 
		{
			state+=10;
			break;
		}
	}
	//杠 如果本身牌就有杠

	for(i=0;ca[i+3].Num<=9 && inp==player;i++)
	{
		if(ca[i]==ca[i+1] && ca[i]==ca[i+2] && ca[i]==ca[i+3]) 
		{
			state+=10;
			break;
		}
	}
	//杠 补花,即把自己的碰牌补充为杠
	for(i=0;pushca[i+2].Num<=9 && inp==player;i++)
	{
		if(pushca[i+2]==pushca[i] && pushca[i+2]==pushca[i+1]) 
		{
			if(pushca[i+3]==pushca[i])
			{
				i+=3;
				continue;
			}
		/*	if(inc==ca[i])
			{
				state+=10;
				break;
			}*/
			for (j=0;ca[j].Num<10 && j<14;j++)
				if(ca[j]==pushca[i])
				{
					state+=10;
					break;
				}
			if(inc==pushca[i])
			{
				state+=10;
				break;
			}
			i+=2;
		}
	}
	//碰
	{
		for(i=0;ca[i+1].Num<=9 && inp!=player;i++)
			if(inc==ca[i] && inc==ca[i+1])
			{
				state+=1;
				break;
			}
	}
	//吃
/*	{
		for(i=0;ca[i+1].Num<=9 && inp==(player+3)%4;i++)
			if(inc.Type==ca[i].Type && inc.Type==ca[i+1].Type &&
				((inc.Num==ca[i].Num-1 && inc.Num==ca[i+1].Num-2)|| 
				(inc.Num==ca[i].Num+1 && inc.Num==ca[i+1].Num-1)||
				(inc.Num==ca[i].Num+2 && inc.Num==ca[i+1].Num+1)))
			{
				state+=5;
				break;
			}
	}*/

	
	

	//和牌判断
	j=0;
	inc.Click=false;
	Cardinsert(inc,cad,1);//把inc插如牌序列
	num++;
	if (num==14)
	{
		j=0;
		//七对判断
		for(i=0;i<=num-1;i+=2)
		{
			if(cad[i].Num!=cad[i+1].Num || cad[i].Type!=cad[i+1].Type)
				break;
			if(cad[i].Num==cad[i+3].Num && cad[i].Type==cad[i+3].Type)
				j++;//龙七对
		}
		if(i==12)
		{
			//七对成功如果j>=1则龙七对成功 
			state+=300;
		}
	}

	i=0;
	i=GetNext(cad,num,true,cad[0].Type+1,true);
	if(i>0)
	{
		//和牌,或者准确点说叫可以和牌了
		state+=i*100;
	}
	
	return state;
}

int Managers::GetNext(Card *ca, int num,bool dou,int type,bool fu)
{
	int k,tem,i,j,temp;
	tem=0;
	k=0;
	if(num==0)
	{
		k=1;
		if(fu)//对子福
			k*=2;
		i=type%10;//判断是否是清一色
		while(type!=0)
		{	
			if(type%10!=i)
				break;
			type/=10;
		}
		if(type==0)//这也是
			k*=3;
	}
	else if(num>=2)
	{
		for(i=1;i<num-1 && ca[i].Type == ca[0].Type;i++)
			if(!ca[i].Click)
			{
				ca[i].Click=true;
				for(j=i+1;j<num && ca[j].Type == ca[0].Type;j++)
					if(!ca[j].Click)
					{	
						ca[j].Click=true;
						for(temp=1;temp<num && ca[temp].Click;temp++);

						if(ca[0].Num==ca[i].Num && ca[0].Num==ca[j].Num)
							tem=GetNext(ca+temp,num-temp,(dou && true),ca[0].Type+1+type*10,(fu && true));
						if (tem>k)
							k=tem;

						if(ca[0].Num==ca[i].Num-1 && ca[0].Num==ca[j].Num-2)
							tem=GetNext(ca+temp,num-temp,(dou && true),ca[0].Type+1+type*10,false);
						if(tem>k)
							k=tem;

						ca[j].Click=false;
					}
				ca[i].Click=false;			
			}	
		if(ca[0]==ca[1] && dou)
			tem=GetNext(ca+2,num-2,false,ca[0].Type+type*10,(fu && true));
		if(tem>k)
			k=tem;
	}
	return k;
}

int Managers::SearchCard(Card ca[],Card cad)
{
	int i;
	for(i=0;ca[i].Num<10;i++)
		if(ca[i]==cad)
			return i;
	if(ca[13]==cad)
		return 13;
	return -1;
}

void Managers::GameOver(int num)
{
	
	if(MainComputer)
	{
		pControl->m_ready[0]=false;
		pControl->m_ready[1]=false;
		pControl->m_ready[2]=false;
		pControl->m_ready[3]=false;
	}
	LastWiner=Game_State;
	//算分
	if(OutCard.Num<10)//有人点炮
	{
		PlayPoints[OutPlayer]-=3*Power[Game_State]*num;
		PlayPoints[Game_State]+=3*Power[Game_State]*num;
		int i;
		for(i=0;i<4;i++)
			if(i!=OutPlayer)
				LastPoints[i]=0;
			else if(i==OutPlayer)
				LastPoints[i]=-3*Power[Game_State]*num;
			else
				LastPoints[i]=3*Power[Game_State]*num;
	}
	else//自摸
	{
		PlayPoints[Game_State]+=9*Power[Game_State]*num;
		LastPoints[Game_State]=9*Power[Game_State]*num;
		int i;
		for(i=0;i<4;i++)
			if(i!=Game_State)
			{
				PlayPoints[i]-=3*Power[Game_State]*num;
				LastPoints[i]=-3*Power[Game_State]*num;
			}
	}
	
	Power[0]=1;
	Power[1]=1;
	Power[2]=1;
	Power[3]=1;
	Game_State+=4;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:PlaySound
* 函数介绍:播放声音
* 输入参数:action含义 
	  1过 2 出牌 3吃 4碰 5杠 9和
* 输出参数:无
* 返回值  :无			int Num;//牌面数目 1-9 大与9表示此牌不存在
						int Type;//牌的类型 条=0 万=1 饼=2
*/
void Managers::PlaySound(int action)
{	
	TCHAR szFilePath[MAX_PATH + 1];
	GetModuleFileName(NULL, szFilePath, MAX_PATH);
	(_tcsrchr(szFilePath, '\\'))[1] = '\0'; //删除文件名,只获得路径
	switch(action)
	{
	case -1:
		strcpy(szFilePath+strlen(szFilePath), "sound\\dice.wav");
		m_sound.PlayWaveSound(szFilePath);
		break;
	case 0:
		m_backmusic.Play();
		break;
	case 1:
		strcpy(szFilePath+strlen(szFilePath), "sound\\wrong.wav");
		m_sound.PlayWaveSound(szFilePath);
		break;
	case 2:
		strcpy(szFilePath+strlen(szFilePath), "sound\\click.wav");
		m_sound.PlayWaveSound(szFilePath);
		break;
	case 3:
		strcpy(szFilePath+strlen(szFilePath), "sound\\give.wav");
		m_sound.PlayWaveSound(szFilePath);
		break;
	case 4:
		strcpy(szFilePath+strlen(szFilePath), "sound\\give.wav");
		m_sound.PlayWaveSound(szFilePath);
		break;
	case 5:
		strcpy(szFilePath+strlen(szFilePath), "sound\\give.wav");
		m_sound.PlayWaveSound(szFilePath);
		break;
	case 9:
		strcpy(szFilePath+strlen(szFilePath), "sound\\win.wav");
		m_backmusic.Stop();
		isPlayBkmusic=false;
		m_sound.PlayWaveSound(szFilePath);
		break;
	default:
		break;
	}
}

⌨️ 快捷键说明

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