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

📄 managers.cpp

📁 一个局域网的斗地主游戏
💻 CPP
字号:
// Managers.cpp: implementation of the Managers class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "program.h"
#include "Managers.h"

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

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

Managers::Managers()
{
	Game_State=-2;
}

Managers::~Managers()
{

}

void Managers::GameStart()
{
	int k;
	for(k=0;k<20;k++)
		PlayCards[1][k].Click=false;
	for(k=0;k<3;k++)
		Sendleft[k].Click=true;
	if(MainComputer)
	{
		Power=10;
		OutCards[0].Num=16;
		PlayerMaininfo=0;
		SendCard();
		PlayerMain=rand()%3;
		Game_State=-1;
	}
	else
	{
	//	GetCard();
	}
}

bool Managers::CheckCard(int pl)
{
	Card *Ca=PlayCards[pl];//用Ca 指针来代替Player[pl],使程序简单容易理解
	int i,j;
	int num1,min1,type1;
	int num2,min2,type2;
	j=0;
	for(i=0;i<20 && Ca[i].Num<=15;i++)
		if(Ca[i].Click)
		{	PreOut[j]=Ca[i];
			j++;
		}
	if(j==0)
		return false;
	else if(j!=20)
	{
		PreOut[j].Num=16;//表示此后的都没有牌了
	}
	Ca=PreOut;//现在把CA指到这里
	CardsInfo(Ca,num2,min2,type2);
	if(OutCards[0].Num==16)//上次没有人走牌
	{
		if((type2==4 && num2==4)|| type2==5)
			Power*=2;
		if(type2!=0)	
			return true;
	}
	if(OutPlayer==PlayerAc)//上次走牌的人 OutPlayer就是自己,那么自己可以随便走什么
	{//改变
		if((type2==4 && num2==4)|| type2==5)
			Power*=2;
		if(type2!=0)
			return true;
	}
	if(type2==0)
		return false;
	CardsInfo(OutCards,num1,min1,type1);
	if(type1==5)//双鬼
		return false;
	if(type2==5)
	{
		Power*=2;
		return true;
	}
	if(type1==4 && type2==4)
	{
		if(num2==num1)
		{
			if (min1<min2)
			{
				if (num1==4)
					Power*=2;
				return true;
			}
			else
				return false;
		}
	}
	if(num2==4 && type2==4)
	{
		Power*=2;
		return true;
	}
	if(type2==type1)
	{
		if(num1==num2)
		{
			if(min1<min2)
				return true;
			else
				return false;
		}
		else
			return false;
	}
	return false;
}

void Managers::SendCard()
{
	int i,j,k;
	bool Cards[55]={false};	//对应54张扑克,其中Cards[54]做初始化用 必须为true;
							//其中0-51为4个1-13 52是小王 53是大王
	Cards[54]=true;
	for(j=0;j<17;j++)
		for(i=0;i<3;i++)
		{
			Card &Ca=PlayCards[i][j];
			k=54;//保证必进入While循环进行随机
			while(Cards[k])
				k=rand()%54;
			Cards[k]=true;
			Ca.Click=false;
			if(k==53 || k==52)
			{
				Ca.Num=k-38;
				Ca.Pow=k-38;
				Ca.Type=4;
				Ca.Click=false;
			}
			else
			{
				Ca.Click=false;
				Ca.Num=k%13+1;
				Ca.Type=k/13;
				if(Ca.Num==1 || Ca.Num==2)
					Ca.Pow=Ca.Num+11;
				else
					Ca.Pow=Ca.Num-2;
			}
		}
	i=0;
	for(k=0;k<54;k++)
		if(!Cards[k])
		{
			Card &Ca=Sendleft[i];
			i++;
			if(k==53 || k==52)
			{
				Ca.Num=k-38;
				Ca.Pow=k-38;
				Ca.Type=4;
				Ca.Click=true;
			}
			else
			{
				Ca.Num=k%13+1;
				Ca.Type=k/13;
				Ca.Click=true;
				if(Ca.Num==1 || Ca.Num==2)
					Ca.Pow=Ca.Num+11;
				else
					Ca.Pow=Ca.Num-2;
			}
		}
	Sendleft[i].Num=16;
	PlayCards[0][17].Num=16;
	PlayCards[1][17].Num=16;
	PlayCards[2][17].Num=16;
	
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:DoMSG(	int num		//第几的一张牌
					int action)	//行为
* 函数介绍:消息响应
* 输入参数:action含义 
	 1点牌  3放弃出牌 4出牌(或接受当地主)
* 输出参数:bool
* 返回值  :true 表示响应成功 false为失败
*/
bool Managers::DoMsg(int num, int action)
{

	if(action==1)//唯一用得到前面1个参数的地方
	{
		Card &Ca=PlayCards[PlayerAc][num];
		if(Ca.Click)
			Ca.Click=false;
		else
			Ca.Click=true;
		return true;
	}	
	if(Game_State==-1 && PlayerMain==PlayerAc)
	{
		if(action==4)
		{
			PlayCards[PlayerAc][17]=Sendleft[0];
			PlayCards[PlayerAc][18]=Sendleft[1];
			PlayCards[PlayerAc][19]=Sendleft[2];
			SortCard(PlayCards[PlayerAc]);
			Game_State=PlayerAc;
			OutPlayer=PlayerAc;//改变
			return true;
		}
		if(action==3)
		{
			PlayerMain=(PlayerMain+1)%3;
			PlayerMaininfo++;
			if(PlayerMaininfo==3)
				Game_State=-2;
			return true;
		}
	}
	if(Game_State!=PlayerAc)
		return false;
	else if(action==4)
	{
		if(CheckCard(Game_State))
		{
			//能出牌当然出牌咯
			int i,j;
			for(i=0;i<20 && PreOut[i].Num<=15;i++)
				OutCards[i]=PreOut[i];
			if(i!=20)
				OutCards[i].Num=16;
			j=0;
			Card *Ca=PlayCards[Game_State];
			for(i=0;i<20 && Ca[i].Num<=15;i++)
				if(!Ca[i].Click)
				{
					Ca[j]=Ca[i];
					j++;
				}
			OutPlayer=Game_State;
			Ca[j].Num=16;
			Updata();
			return true;
		}
		else
			return false;
	}
	else if(action==3 && OutPlayer!=PlayerAc)
	{
		Game_State=(Game_State+1)%3;//直接更改游戏玩家
		return true;
	}

	return false;
}

void Managers::Updata()
{
	int j;
	Card *ca=PlayCards[Game_State];
	for(j=0;j<20 && ca[j].Num<=15;j++);
	if(j!=0)
		Game_State=(Game_State+1)%3;
	else
	{
		//改变
		if(Game_State==PlayerMain)
			MessageBox(GetActiveWindow(),"地主胜利!","胜利",0);
		else
			MessageBox(GetActiveWindow(),"农民胜利!","胜利",0);
		Game_State+=3;
	}
}
////////////////////////////////////////////////////////////////////////
/*
* 函数名称:CardsInfo(Card ca[],int &num,int &min,int &type)
* 函数介绍:把ca中的牌信息反应出来
* 输入参数:ca[]需要反应的牌信息
* 输出参数:int &num,int &max,int &type
* 返回值  :num表示有多少张牌,min表示起作用的牌中值最小的一个的大小
例如3个5带一个8,那么起作用的就是5 min=5,num=3,type表示类型 
1:3带1、2      2:4带2(4带2、两对)             3:连子 
4:全相同       5:双鬼炸弹                     6:飞机
7:三顺         0:错牌!不能走出去的
*/

void Managers::CardsInfo(Card ca[],int &num,int &min,int &type)
{
	int i,k,n;		
	int same[10]={0};
	int nsame[10]={0};

	for(n=0;n<20 && ca[n].Num<=15;n++);
	type=0;
	num=n;
	if(n>=5)
	{
		for(k=0;k<n-1;k++)//连牌
			if(ca[k].Pow!=ca[k+1].Pow-1)
				break;
		if(k==n-1 && ca[k].Pow<=12)//牌不能连到2 2的pow就是12
		{
			min=ca[0].Pow;
			type=3;
			return;
		}

		i=-1;
		for(k=0;k<n;k++)
		{
			if(i<0 || ca[k].Pow!=same[i])
				i++;
			if(i>2)
				break;
			same[i]=ca[k].Pow;
			nsame[i]++;
		}
		if(i>=2)
		{
			int tem;
			for(tem=0;tem<i;tem++)
				if(nsame[tem]!=2 && same[tem]!=same[tem+1]-1)
					break;
			if(nsame[tem]==2)
				tem++;
			if(tem>i)//三顺
			{
				type=7;
				min=same[0];
			}
			int ty1=0,ty2=0,num3=0;
			int kmin=0;

			for(tem=0;tem<=i;tem++)//飞机
				if(nsame[tem]==1)
				{
					ty1++;
				}
				else if(nsame[tem]==2)
				{
					ty2++;
				}
				else if(nsame[tem]==3 && kmin==0)
				{
					kmin=same[tem];
					for(;tem<i;tem++)
						if(nsame[tem]==3 && same[tem]==same[tem+1]-1)
							num3++;
						else 
							break;
					if(tem==i && nsame[tem]==3)
						num3++;
				}
				else
					break;
			if((ty1==0 || ty2==0) && tem>i)
			{
				if((num3==ty1 || num3==ty2 || ty1==ty2)&& num3!=0)
				{
					type=6;
					min=kmin;
				}
			}
		}
		if(i<2)//3带n 或 4带n
		{
			int maxnum=-1;
			for(k=0;k<=2;k++)
				if(nsame[k]>maxnum)
				{
					maxnum=nsame[k];
					i=k;
				}
			if(maxnum==3 && n==5)
			{
				type=1;
				min=same[i];
				return;
			}
			else if(maxnum==4)
			{
				type=2;
				min=same[i];
				return;
			}
		}
	}
	else if (n>2)
	{
		i=-1;
		for(k=0;k<n;k++)
		{
			if(i<0 || ca[k].Pow!=same[i])
				i++;
			if(i>2)
				break;
			same[i]=ca[k].Pow;
			nsame[i]++;
		}
		if(i<=2)
		{
			int maxnum=-1;
			for(k=0;k<=2;k++)
				if(nsame[k]>maxnum)
				{
					maxnum=nsame[k];
					i=k;
				}
			if(maxnum==3 && n==4)
			{
				type=1;
				min=same[i];
				return;
			}
			else if(maxnum==3 && n==3)
			{
				type=4;
				min=same[i];
				return;
			}
			else if(maxnum==4 && n==4)
			{
				type=4;
				min=same[i];
				return;
			}
		}
	}
	else if (n==2)
	{
		if(ca[0].Pow==ca[1].Pow)
		{
			type=4;
			min=ca[0].Pow;
		}
		else if(ca[0].Pow==14 && ca[1].Pow==15)
		{
			type=5;
			min=ca[1].Pow;
		}
	}
	else if (n==1)
	{
		min=ca[0].Pow;
		type=4;
	}
}

void Managers::SortCard(Card ca[])
{
	int i,j;
	Card temp;
	for(i=0;i<20 && ca[i].Num<=15;i++)
		for(j=i+1;j<20 && ca[j].Num<=15;j++)
			if(ca[i].Pow>ca[j].Pow)
			{
				temp=ca[i];
				ca[i]=ca[j];
				ca[j]=temp;
			}
}

⌨️ 快捷键说明

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