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

📄 managers.cpp

📁 用MFC实现一个麻将功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Managers.cpp: implementation of the Managers class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "program.h"
#include "Managers.h"
#include "ProgramDoc.h"
#include "ProgramView.h"
#include "Num.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
bool operator ==(const Card &a,const Card &t)
{
	if(a.Type==t.Type && a.Num==t.Num)
		return true;
	return false;
}
/////////////////////////////////////////////////////////

Managers::Managers()
{
	srand(time(NULL));
	Game_State=-2;
	LastWiner=0;
	OutCard.Num=10;
	OutPlayer=4;
	Power[0]=1;
	Power[1]=1;
	Power[2]=1;
	Power[3]=1;
	PlayPoints[0]=100;
	PlayPoints[1]=100;
	PlayPoints[2]=100;
	PlayPoints[3]=100;
	PlayCards[0][13].Num=10;
	leftstart=-1;
	leftend=-1;
	PointPlayer=0;
	isPlayBkmusic = false;
}

Managers::~Managers()
{

}

void Managers::GameStart()
{
	leftstart=-1;
	leftend=-1;
	OutCard.Num=10;
	OutPlayer=(LastWiner+3)%4+1;
	int i,j;
	for(i=0;i<4;i++)
	{
		Outsnum[i]=0;
		for(j=0;j<20;j++)
		{
			PushCards[i][j].Num=10;
			PlayOuts[i][j].Num=10;
		}
	}
	Game_State=LastWiner;
	PointPlayer=LastWiner;
	Power[0]=1;
	Power[1]=1;
	Power[2]=1;
	Power[3]=1;
	LeftNum=55;
//	if(MainComputer)
	{
		SendCard();
		for(i=0;i<4;i++)
			SortCard(PlayCards[i]);
		leftstart=rand()%54*2;
		leftend=(leftstart+55)%108;
	}
	isPlayBkmusic = true;
}


////////////////////////////////////////////////////////////////////////
/*
* 函数名称:SendCard()
* 函数介绍:发牌,完成初始化各玩家的牌
* 输入参数:无
* 输出参数:无
* 返回值  :无
*/
void Managers::SendCard()
{
	int x,y,k;
	bool cards[108]={false};
	for(x=0;x<4;x++)
	{
		for(y=0;y<13;y++)
		{
			do
			{
				k=rand()%108;
			}
			while(cards[k]);
			cards[k]=true;
			PlayCards[x][y].Num=k%9+1;
			PlayCards[x][y].Type=k/36;
			PlayCards[x][y].Click=false;
		}
	}
	PlayCards[0][13].Num=10;
	PlayCards[1][13].Num=10;
	PlayCards[2][13].Num=10;
	PlayCards[3][13].Num=10;

	do
	{
		k=rand()%108;
	}
	while(cards[k]);
	Card te;
	te.Num=k%9+1;
	te.Type=k/36;
	te.Click=false;
	if(LastWiner==PlayerAc)
		Actions=Cardinfo(PlayCards[LastWiner],PushCards[LastWiner],LastWiner,te,LastWiner);
	else
		Actions=0;
	PlayCards[LastWiner][13]=te;
	cards[k]=true;
	y=0;
	while(y<55)
	{
		do
		{
			k=rand()%108;
		}
		while(cards[k]);
		Sendleft[y].Num=k%9+1;
		Sendleft[y].Type=k/36;
		Sendleft[y].Click=false;
		y++;
		cards[k]=true;
	}
	Sendleft[y].Num=10;
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:DoMSG(	int num		//第几的一张牌
					int action)	//行为
* 函数介绍:消息响应
* 输入参数:action含义 
	  1过 2 出牌 3吃 4碰 5杠 9和
* 输出参数:bool
* 返回值  :true 表示响应成功 false为失败
*/
bool Managers::DoMsg(int num, int action)
{
	Card *ca=PlayCards[PlayerAc];
	if(Game_State==PlayerAc)
	{
		if(action==1 && OutCard.Num<=9 && OutPlayer!=PlayerAc && Actions!=0)
		{
			if(!MainComputer)
				pControl->SendCard(1,NULL);
			else
				pControl->BroadcastCard(1,NULL);
			Updata();	
			pView->PrintAll();
			PlaySound(action);
			return true;
		}

		if(action==2 && OutCard.Num==10 && Game_State==PlayerAc)
		{
			PlayOuts[PlayerAc][Outsnum[PlayerAc]]=ca[num];
			Outsnum[PlayerAc]++;
			PlayOuts[PlayerAc][Outsnum[PlayerAc]].Num=10;
			OutCard=ca[num];
			OutCard.Click=true;
			OutPlayer=PlayerAc;
			Carddelete(num,ca,1);
			SortCard(ca);
			PlayCards[PlayerAc][13].Num=10;
			if(!pControl->m_Isserver)
				pControl->SendCard(2,&OutCard);
			else
				pControl->BroadcastCard(2,&OutCard);
			Updata();	
			pView->PrintAll();
			PlaySound(action);
			return true;
		}
		if(action==3)
		{
			return false;//在这里,本麻将不准许“吃”
		}
		if(action==4 && Actions%10==1)//碰
		{
			int i;
			for(i=0;ca[i+1].Num<10 && i<14;i++)
				if(ca[i]==OutCard && ca[i+1]==OutCard)
				{
					char st[100];
					if(ca[i].Type==0)
						sprintf(st,"您是要碰%d条吗?",ca[i].Num);
					else if(ca[i].Type==1)
						sprintf(st,"您是要碰%d万吗?",ca[i].Num);
					else if(ca[i].Type==2)
						sprintf(st,"您是要碰%d饼吗?",ca[i].Num);
					int k;
					k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
					if(k!=1)
						break;
					Card te=OutCard;
					OutCard.Click=true;

					Cardinsert(OutCard,PushCards[PlayerAc],3);
					Carddelete(i,ca,2);
					OutCard.Num=10;
					PlayOuts[OutPlayer][Outsnum[OutPlayer]-1].Num=10;
					Outsnum[OutPlayer]--;
					
					if(!MainComputer)
						pControl->SendCard(4,&te);
					else
						pControl->BroadcastCard(4,&te);
					PointPlayer=PlayerAc;
					Actions=0;	
					pView->PrintAll();
					PlaySound(action);
					return true;
				}
		}
		if(action==5 && Actions%100>=10)//杠在 这里分4种讨论,这会影响到后面的UpData
		{
			int i;
			for(i=0;ca[i+2].Num<10 && i<13;i++)//用别人出的牌杠
				if(ca[i]==OutCard && ca[i+1]==OutCard && ca[i+2]==OutCard)
				{
					char st[100];
					if(ca[i].Type==0)
						sprintf(st,"您是要杠%d条吗?",ca[i].Num);
					else if(ca[i].Type==1)
						sprintf(st,"您是要杠%d万吗?",ca[i].Num);
					else if(ca[i].Type==2)
						sprintf(st,"您是要杠%d饼吗?",ca[i].Num);
					int k;
					k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
					if(k!=1)
						break;

					Card te=OutCard;
					OutCard.Click=true;

					Cardinsert(OutCard,PushCards[PlayerAc],4);
					Carddelete(i,ca,3);
					OutCard.Num=10;
					PlayOuts[OutPlayer][Outsnum[OutPlayer]-1].Num=10;
					Outsnum[OutPlayer]--;

					if(!MainComputer)
						pControl->SendCard(5,&te);
					else
						pControl->BroadcastCard(5,&te);

					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;	
					pView->PrintAll();
					PlaySound(action);
					return true;
				}
			for(i=0;ca[i+2].Num<10 && i<13;i++)//自己摸的牌暗杠
				if(ca[i]==ca[13] && ca[i+1]==ca[13] && ca[i+2]==ca[13])
				{
					char st[100];
					if(ca[i].Type==0)
						sprintf(st,"您是要杠%d条吗?",ca[i].Num);
					else if(ca[i].Type==1)
						sprintf(st,"您是要杠%d万吗?",ca[i].Num);
					else if(ca[i].Type==2)
						sprintf(st,"您是要杠%d饼吗?",ca[i].Num);
					int k;
					k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
					if(k!=1)
						break;

					Card te=ca[13];
					ca[13].Click=false;

					Cardinsert(ca[13],PushCards[PlayerAc],4);
					Carddelete(13,ca,1);
					Carddelete(i,ca,3);

					if(!MainComputer)
						pControl->SendCard(6,&te);
					else
						pControl->BroadcastCard(6,&te);

					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 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;	
					pView->PrintAll();
					PlaySound(action);
					return true;
				}
			for(i=0;ca[i+3].Num<10 && i<14;i++)//自己本来就有的牌暗杠
				if(ca[i]==ca[i+1] && ca[i]==ca[i+2] && ca[i]==ca[i+3])
				{
					char st[100];
					if(ca[i].Type==0)
						sprintf(st,"您是要杠%d条吗?",ca[i].Num);
					else if(ca[i].Type==1)
						sprintf(st,"您是要杠%d万吗?",ca[i].Num);
					else if(ca[i].Type==2)
						sprintf(st,"您是要杠%d饼吗?",ca[i].Num);
					int k;
					k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
					if(k!=1)
						continue;
					Card te=ca[i];
					ca[i].Click=false;

					Cardinsert(ca[i],PushCards[PlayerAc],4);
					Carddelete(i,ca,4);

					if(!pControl->m_Isserver)
						pControl->SendCard(7,&te);
					else
						pControl->BroadcastCard(7,&te);

					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 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;
				}
			//补花(也是杠的一种)
			for(i=0;PushCards[PlayerAc][i+2].Num<10 && i<14;i++)
				if(PushCards[PlayerAc][i+2]==PushCards[PlayerAc][i] && PushCards[PlayerAc][i+2]==PushCards[PlayerAc][i+1])
				{
					if(PushCards[PlayerAc][i]==PushCards[PlayerAc][i+3])
					{
						i+=3;
						continue;
					}
					int j;
					for(j=0;ca[j].Num<10 && j<14;j++)
						if(ca[j]==PushCards[PlayerAc][i])
							break;
					if(ca[13]==PushCards[PlayerAc][i])
					{
						j=13;
					}
					else if(ca[j].Num>=10)
					{
						i+=2;
						continue;
					}
					char st[100];
					if(ca[j].Type==0)
						sprintf(st,"您是要杠%d条吗?",ca[j].Num);
					else if(ca[j].Type==1)
						sprintf(st,"您是要杠%d万吗?",ca[j].Num);
					else if(ca[j].Type==2)
						sprintf(st,"您是要杠%d饼吗?",ca[j].Num);
					int k;
					k=MessageBox(GetActiveWindow(),st,"询问",MB_OKCANCEL);
					if(k!=1)
					{
						i+=2;
						continue;
					}

					Card te=ca[j];
					te.Click=true;
					Cardinsert(te,PushCards[PlayerAc],1);
					Carddelete(j,ca,1);

					if(!pControl->m_Isserver)
						pControl->SendCard(8,&te);
					else
						pControl->BroadcastCard(6,&te);

					if(LeftNum==0)
					{
						Game_State=10;
						if(MainComputer)
						{
							pControl->m_ready[0]=false;

⌨️ 快捷键说明

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