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

📄 programview.cpp

📁 一个局域网的斗地主游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int	i;
	//点到中间若轮到主机发牌则发牌(暂无动画)
/*	if(isgoon && mx>=300&&my>=220&&mx<=476&&my<=312&&(pControl->m_Isserver)&&manager.Game_State==-1)
	{	MessageBox("主机发牌");
		pControl->StartCards();
	}
*/

//将牌点起来
	if(isgoon && mx>=100&&my>=440 && mx<=455&&my<=575)
	{
		CDC	*pdc=GetDC();
		for(i=0;manager.PlayCards[manager.PlayerAc][i].Num<=15;i++);
		if(mx<=100+(i-1)*15+71&&my<=576&&mx>=100&&my>=440)
		{
			i=SelectNum(i,mx,my);//判断点中的是第几张牌
			if(manager.DoMsg(i,1))
				PrintAll();
		}
		ReleaseDC(pdc);
	}
	

	CView::OnLButtonDown(nFlags, point);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:SelectNum(int	num,int	mx,int	my)
函数介绍:判断点中的是第几张牌
输入参数:int	num,int	mx,int	my(当前玩家手中牌的数量,光标横坐标,光标纵坐标)
输出参数:无
返回值	:无
*/
int CProgramView::SelectNum(int num,int	mx,int	my)
{
		if(mx>=100+(num-1)*15)
			return	num-1;
		else
			return	(mx-100)/15;
}
//////////////////////////////////////////////////////////////////
/*
函数名称:OnSendCard()
函数介绍:响应出牌按钮
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::OnSendCard()
{
	if(isgoon && manager.DoMsg(15,4))
	{
		int	k;
		for(k=0;k<20&&manager.OutCards[k].Num<=15;k++)
			OutCards[1][k]=manager.OutCards[k];
		if(k!=20)
			OutCards[1][k].Num=16;
		PrintAll();
		pControl->SendCards(manager.OutCards,4);
	}
}
//////////////////////////////////////////////////////////////////
/*
函数名称:OnPass()
函数介绍:响应过牌按钮
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::OnPass()
{
	if(isgoon && manager.DoMsg(16,3))
	{
		OutCards[1][0].Num=16;
		PrintAll();
		pControl->SendCards(NULL,3);
	}
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawPlayername(char	*s)
函数介绍:绘出玩家的姓名
输入参数:玩家姓名的字符串
输出参数:无
返回值	:无
*/
void CProgramView::DrawPlayername()
{
	CDC	*pdc=GetDC();
	pdc->SetBkMode(TRANSPARENT); //设置背景为透明
//	pDC->SetTextColor(RGB(255,255,255));//设置字体颜色

	pdc->TextOut(40,400,PlayerName[0]);
	pdc->TextOut(90,500,PlayerName[1]);
	pdc->TextOut(660,400,PlayerName[2]);

	ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawLeft()
函数介绍:绘出地主牌的情况,如果还没叫主,则是牌的背面,如果叫主,则为牌的正面
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::DrawLeft()
{
	CDC	*pdc=GetDC();
	int	i;
	if(manager.Game_State==-1)
	{	for(i=0;i<3;i++)
		pdc->BitBlt(300+i*40,25,72,97,&Mcard,142,384,SRCCOPY);
	}
	else if(manager.Game_State>=0&&manager.Game_State<=5)
	{
			for(i=0;i<3;i++)
		{
			if(manager.Sendleft[i].Num<14)
				pdc->BitBlt(300+i*40,25,71,96,&Mcard,(manager.Sendleft[i].Num-1)*71,manager.Sendleft[i].Type*96,SRCCOPY);
			else if(manager.Sendleft[i].Num<=15)
				pdc->BitBlt(300+i*40,25,71,96,&Mcard,(manager.Sendleft[i].Num-14)*71,384,SRCCOPY);
		}
	}
	ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawCardOut()
函数介绍:绘出当前玩家出的牌
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::DrawCardOut(int	k)
{
	int	i;
	CDC	*pdc=GetDC();
	if(k==1||k==3)
	{
		pdc->BitBlt(100,330,360,96,&Background,0,0,SRCCOPY);
		for(i=0;i<20&&OutCards[1][i].Num<=15;i++)
		{	
			if(OutCards[1][i].Num<=13)
				pdc->BitBlt(100+i*15,330,71,96,&Mcard,(OutCards[1][i].Num-1)*71,OutCards[1][i].Type*96,SRCCOPY);
			else if(OutCards[1][i].Num<=15)
				pdc->BitBlt(100+i*15,330,71,96,&Mcard,(OutCards[1][i].Num-14)*71,384,SRCCOPY);
		}
	}
	if(k==2||k==3)
	{
		pdc->BitBlt(550,0,71,300,&Background,0,0,SRCCOPY);
		for(i=0;i<20&&OutCards[2][i].Num<=15;i++)
		{	
			if(OutCards[2][i].Num<14)
			{
				pdc->BitBlt(550,i*15,71,96,&Mcard,(OutCards[2][i].Num-1)*71,OutCards[2][i].Type*96,SRCCOPY);
			}
			else if(OutCards[2][i].Num<=15)
			{	
				pdc->BitBlt(550,i*15,71,96,&Mcard,(OutCards[2][i].Num-14)*71,384,SRCCOPY);
			}
		}

	}
	if(k==0||k==3)
	{
		pdc->BitBlt(170,0,71,300,&Background,0,0,SRCCOPY);
		for(i=0;i<20&&OutCards[0][i].Num<=15;i++)
		{	
			if(OutCards[0][i].Num<14)
			{
				pdc->BitBlt(170,i*15,71,96,&Mcard,(OutCards[0][i].Num-1)*71,OutCards[0][i].Type*96,SRCCOPY);
			}
			else if(OutCards[0][i].Num<=15)
			{	
				pdc->BitBlt(170,i*15,71,96,&Mcard,(OutCards[0][i].Num-14)*71,384,SRCCOPY);
			}
		}

	}

	ReleaseDC(pdc);
}

void CProgramView::PrintState()
{
	CDC	*pdc=GetDC();
	pdc->SetBkMode(TRANSPARENT);
	if(manager.Game_State==-2)
		pdc->TextOut(266,5,"游戏还没开始");
	else if(manager.Game_State==-1)
	{	pdc->TextOut(266,5,"还在选择地主");
	}
	if(manager.PlayerMain==(manager.PlayerAc+1)%3)
		pdc->TextOut(490,5,"右边的是地主");
	else if(manager.PlayerMain==manager.PlayerAc)
		pdc->TextOut(490,5,"你现在是地主");
	else if(manager.PlayerMain==(manager.PlayerAc+2)%3)
		pdc->TextOut(490,5,"左边的是地主");
	if(manager.Game_State==manager.PlayerAc)
		pdc->TextOut(100,5,"到你出牌了");
	else if(manager.Game_State==(manager.PlayerAc+1)%3)
		pdc->TextOut(100,5,"右边的出牌");
	else if(manager.Game_State==(manager.PlayerAc+2)%3)
		pdc->TextOut(100,5,"左边的出牌");

	DrawPlayername();
	ReleaseDC(pdc);
}


void CProgramView::PlayerPos()
{
	cardmiddle=manager.PlayCards[manager.PlayerAc];
	if(manager.PlayerAc==0)
	{	
		cardleft=manager.PlayCards[2];
		cardright=manager.PlayCards[1];
	}
	else if(manager.PlayerAc==1)
	{	cardleft=manager.PlayCards[0];
				cardright=manager.PlayCards[2];
	}	
	else if(manager.PlayerAc==2)
	{	cardleft=manager.PlayCards[1];
		cardright=manager.PlayCards[0];
	}
}

//重载PrintAll()实现发牌动画
void CProgramView::PrintAll(int type)
{
	timer = 0;
	isgoon = false;
	SetTimer(1, 20, NULL);
}

//发牌动画
void CProgramView::OnTimer(UINT nIDEvent)
{
	CDC	*pdc=GetDC();
	static int i(1);
	int j;
	static int x, y;
	x = 300+54*2, y = 220;
	if(timer<18)
	{
		//画没发出去的牌,飞行途中
		pdc->BitBlt(300+(53-timer*3)*2,220,100,200,&Background,300+(53-timer*3)*2,220,SRCCOPY);
		for(j=0;j<54-timer*3;j++)
			pdc->BitBlt(300+j*2,220,72,97,&Mcard,142,384,SRCCOPY);
		x -= timer*3*2;

		//画发出去的牌
		if(manager.PlayCards[manager.PlayerAc][timer].Num<14)
		{
			//擦除上次画的牌,用背景覆盖
			if(i-1>0)
				pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
					x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),SRCCOPY);
			//画当前显示的牌
			pdc->BitBlt(x+(100+timer*15-x)/10*i,y+(480-y)/10*i,71,96,&Mcard,
				(manager.PlayCards[manager.PlayerAc][timer].Num-1)*71,
				manager.PlayCards[manager.PlayerAc][timer].Type*96,SRCCOPY);
		}
		else if(manager.PlayCards[manager.PlayerAc][timer].Num<=15)
		//画大小鬼
		{
			if(i-1>0)
				pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
					x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),SRCCOPY);
			pdc->BitBlt(x+(100+timer*15-x)/10*i,y+(480-y)/10*i,71,96,&Mcard,
				(manager.PlayCards[manager.PlayerAc][timer].Num-14)*71,384,SRCCOPY);
		}	

		if(cardleft[timer].Num<=15)
		{
			if(i-1>0)
				pdc->BitBlt(x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
					&Background,x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
			pdc->BitBlt(x+(55-x)/10*i,y+(55+timer*10-y)/10*i,97,75,&Mcard,214,408,SRCCOPY);
		}
		if(cardright[timer].Num<=15)
		{
			if(i-1>0)
				pdc->BitBlt(x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
					&Background,x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
			pdc->BitBlt(x+(630-x)/10*i,y+(55+timer*10-y)/10*i,97,75,&Mcard,214,408,SRCCOPY);
		}
		i++;
		if(i==10)
		//牌已经飞到指定位置
		{	
			//檫除上一帧画的牌
			if(manager.PlayCards[manager.PlayerAc][timer].Num<14)
			{
				pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
					x+(100+timer*15-x)/10*i,y+(480-y)/10*i,SRCCOPY);
			}
			else if(manager.PlayCards[manager.PlayerAc][timer].Num<=15)
			{
				pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
					x+(100+timer*15-x)/10*i,y+(480-y)/10*i,SRCCOPY);
			}	

			if(cardleft[timer].Num<=15)
			{
				pdc->BitBlt(x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
					&Background,x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
			}
			if(cardright[timer].Num<=15)
			{
				pdc->BitBlt(x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
					&Background,x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
			}
			i=0;
			
			//重画被背景覆盖的牌
			if(timer>13)
			{
				if(manager.PlayCards[manager.PlayerAc][(timer-1)].Num<14)
				{
					pdc->BitBlt(100+(timer-1)*15,480,71,96,&Mcard,
						(manager.PlayCards[manager.PlayerAc][(timer-1)].Num-1)*71,
						manager.PlayCards[manager.PlayerAc][(timer-1)].Type*96,SRCCOPY);
				}
				else if(manager.PlayCards[manager.PlayerAc][(timer-1)].Num<=15)
				{	
					pdc->BitBlt(100+(timer-1)*15,480,71,96,&Mcard,
						(manager.PlayCards[manager.PlayerAc][(timer-1)].Num-14)*71,384,SRCCOPY);
				}
			}
			
			//画出飞到的牌
			if(manager.PlayCards[manager.PlayerAc][timer].Num<14)
			{
				pdc->BitBlt(100+timer*15,480,71,96,&Mcard,
					(manager.PlayCards[manager.PlayerAc][timer].Num-1)*71,
					manager.PlayCards[manager.PlayerAc][timer].Type*96,SRCCOPY);
			}
			else if(manager.PlayCards[manager.PlayerAc][timer].Num<=15)
			{	
				pdc->BitBlt(100+timer*15,480,71,96,&Mcard,
					(manager.PlayCards[manager.PlayerAc][timer].Num-14)*71,384,SRCCOPY);
			}
			if(cardleft[timer].Num<=15)
			{
				pdc->BitBlt(55,55+timer*10,97,75,&Mcard,214,408,SRCCOPY);
				pdc->BitBlt(630,55+timer*10,97,75,&Mcard,214,408,SRCCOPY);
			}
			timer++;
		}

	}
	else
	{
		KillTimer(1);
		for(j=0;j<3;j++)
			manager.SortCard(manager.PlayCards[j]);
		PrintAll();
		isgoon = true;
	}
	ReleaseDC(pdc);
}

⌨️ 快捷键说明

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