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

📄 programview.cpp

📁 一个麻将的简单程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	else if(start>=54&&start<=79)
	{
		if(end>=54&&end<=79)
			DrawPart(start,end,pDC);
		else if(end>=80&&end<=107)
		{
			DrawPart(start,79,pDC);
			DrawPart(80,end,pDC);
		}
	}
	else if(start>=80&&start<=107)
		DrawPart(start,end,pDC);
}

void CProgramView::DrawWall(int start, int end, CDC *pDC)
{
	if(end>=start)
		DrawWhole(start,end,pDC);
	else
	{
		DrawWhole(start,107,pDC);
		DrawWhole(0,end,pDC);
	}
}

void CProgramView::DrawStandCards(CDC *pDC)
{
	//当前玩家站立麻将 45*71
	int	i;
	int	k=SelectNum()-1;
	Cards.SelectObject(&m_mystand);

	for(i=0;i<=k;i++)
	{
		pDC->BitBlt(750-i*45,500-manager.PlayCards[manager.PlayerAc][k-i].Click*10,45,71,&Cards,manager.PlayCards[manager.PlayerAc][k-i].Type*405+(manager.PlayCards[manager.PlayerAc][k-i].Num-1)*45,0,SRCCOPY);
	}
	if(manager.PlayCards[manager.PlayerAc][13].Num<=9)
		pDC->BitBlt(800,500-manager.PlayCards[manager.PlayerAc][13].Click*10,45,71,&Cards,manager.PlayCards[manager.PlayerAc][13].Type*405+(manager.PlayCards[manager.PlayerAc][13].Num-1)*45,0,SRCCOPY);
	//右边玩家站立的麻将 14*47 20间距
	Back.SelectObject(&m_bright);
	for(i=0;manager.PlayCards[(manager.PlayerAc+1)%4][i].Num<=9&&i<=13;i++)
	{
		pDC->BitBlt(780,40+20*i,14,47,&Back,0,0,SRCCOPY);
	}
	posright=40+20*(i-1);
	//左边玩家站立的麻将 14*47 20间距
	Back.SelectObject(&m_bleft);
	for(i=0;manager.PlayCards[(manager.PlayerAc+3)%4][i].Num<=9&&i<=13;i++)
	{
		pDC->BitBlt(100,40+20*i,14,47,&Back,0,0,SRCCOPY);
	}
	posleft=40+20*(i-1);
	//中间玩家站立的麻将 14*47 20间距
	Back.SelectObject(&m_bface);
	for(i=0;manager.PlayCards[(manager.PlayerAc+2)%4][i].Num<=9&&i<=13;i++)
	{
		pDC->BitBlt(200+24*i,30,24,36,&Back,0,0,SRCCOPY);
	}	

}

void CProgramView::DrawFallCards(CDC *pDC)
{
	//当前玩家倒立麻将 40*61
	int	i;
	Cards.SelectObject(&m_myfall);
	for(i=0;manager.PushCards[manager.PlayerAc][i].Num<=9&&i<=15;i++)
	{	if(!(manager.PushCards[manager.PlayerAc][i].Click))
			pDC->BitBlt(10+i*40,505,40,61,&Cards,1720,0,SRCCOPY);
		else
			pDC->BitBlt(10+i*40,505,40,61,&Cards,manager.PushCards[manager.PlayerAc][i].Type*360+(manager.PushCards[manager.PlayerAc][i].Num-1)*40,0,SRCCOPY);
	}
	//右边倒立的麻将	30*27 间距20
	Cards.SelectObject(&m_xline);
	for(i=0;manager.PushCards[(manager.PlayerAc+1)%4][i].Num<=9&&i<=15;i++)
	{	if(!(manager.PushCards[(manager.PlayerAc+1)%4][i].Click))
			pDC->BitBlt(780,posright+20*i,30,27,&Cards,1290,0,SRCCOPY);
		else
			pDC->BitBlt(780,posright+20*i,30,27,&Cards,manager.PushCards[(manager.PlayerAc+1)%4][i].Type*270+(manager.PushCards[(manager.PlayerAc+1)%4][i].Num-1)*30,27,SRCCOPY);
	}
	//左边倒立的麻将	
	for(i=0;manager.PushCards[(manager.PlayerAc+3)%4][i].Num<=9&&i<=15;i++)
	{	if(!(manager.PushCards[(manager.PlayerAc+3)%4][i].Click))
			pDC->BitBlt(100,posleft+20*i,30,27,&Cards,1290,0,SRCCOPY);
		else
			pDC->BitBlt(100,posleft+20*i,30,27,&Cards,manager.PushCards[(manager.PlayerAc+3)%4][i].Type*270+(manager.PushCards[(manager.PlayerAc+3)%4][i].Num-1)*30,0,SRCCOPY);
	}
	//对家倒立的麻将	24*36 间距25
	Cards.SelectObject(&m_yline);
	for(i=0;manager.PushCards[(manager.PlayerAc+2)%4][i].Num<=9&&i<=15;i++)
	{
		if(!(manager.PushCards[(manager.PlayerAc+2)%4][i].Click))
			pDC->BitBlt(670-25*i,30,24,36,&Cards,1032,0,SRCCOPY);
		else
			pDC->BitBlt(670-25*i,30,24,36,&Cards,manager.PushCards[(manager.PlayerAc+2)%4][i].Type*216+(manager.PushCards[(manager.PlayerAc+2)%4][i].Num-1)*24,0,SRCCOPY);
	}
}

void CProgramView::DrawOutCards(CDC *pDC)
{
		int i;
		int k;
		int	num;
	//当前玩家已经出的麻将
		Cards.SelectObject(&m_yline);
		for(i=0,num=0;i<=2;i++)
		{
			for(k=0;k<=9&&manager.PlayOuts[manager.PlayerAc][num].Num<=9;k++,num++)
			{
				pDC->BitBlt(315+25*k,390-i*36,24,36,&Cards,manager.PlayOuts[manager.PlayerAc][num].Type*216+(manager.PlayOuts[manager.PlayerAc][num].Num-1)*24,36,SRCCOPY);
			}
		}
	//右边玩家已经出的麻将
		Cards.SelectObject(&m_xline);
		for(i=0,num=0;i<=2;i++)
		{
			for(k=0;k<=9&&manager.PlayOuts[(manager.PlayerAc+1)%4][num].Num<=9;k++,num++)
			{
				pDC->BitBlt(650-i*30,130+20*k,30,27,&Cards,manager.PlayOuts[(manager.PlayerAc+1)%4][num].Type*270+(manager.PlayOuts[(manager.PlayerAc+1)%4][num].Num-1)*30,27,SRCCOPY);
			}
		}
	//左边玩家已经出的麻将	
		for(i=0,num=0;i<=2;i++)
		{
			for(k=0;k<=9&&manager.PlayOuts[(manager.PlayerAc+3)%4][num].Num<=9;k++,num++)
			{
				pDC->BitBlt(200+i*30,130+20*k,30,27,&Cards,manager.PlayOuts[(manager.PlayerAc+3)%4][num].Type*270+(manager.PlayOuts[(manager.PlayerAc+3)%4][num].Num-1)*30,0,SRCCOPY);
			}
		}
	//对家已经出的牌
		Cards.SelectObject(&m_yline);
		for(i=0,num=0;i<=2;i++)
		{
			for(k=0;k<=9&&manager.PlayOuts[(manager.PlayerAc+2)%4][num].Num<=9;k++,num++)
			{
				pDC->BitBlt(315+24*k,130+36*i,24,36,&Cards,manager.PlayOuts[(manager.PlayerAc+2)%4][num].Type*216+(manager.PlayOuts[(manager.PlayerAc+2)%4][num].Num-1)*24,0,SRCCOPY);
			}
		}	


}

void CProgramView::PrintAll()
{
	CDC	*pDC=GetDC();
	Back.SelectObject(&m_background);
	Buffer.BitBlt(0,0,900,620,&Back,0,0,SRCCOPY);
	DrawWall(manager.leftstart,manager.leftend,&Buffer);
//	DrawWall(manager.leftstart,manager.leftend,&Buffer);
	DrawStandCards(&Buffer);
	DrawFallCards(&Buffer);
	DrawOutCards(&Buffer);
	PrintState(&Buffer);
	
	Back.SelectObject(&m_button);
	if(manager.Game_State>=0&&manager.Game_State<=3)
	{
		if(manager.Actions%10==1)
			Buffer.BitBlt(580,435,40,40,&Back,0,0,SRCCOPY);
		if(manager.Actions>=100)
			Buffer.BitBlt(630,435,40,40,&Back,40,0,SRCCOPY);
		if(manager.Actions%100>=10)
			Buffer.BitBlt(680,435,40,40,&Back,80,0,SRCCOPY);
		if( manager.OutCard.Num<=9 && manager.OutPlayer!=manager.PlayerAc && manager.Actions!=0)
			Buffer.BitBlt(730,435,40,40,&Back,120,0,SRCCOPY);
	}
	if(manager.Game_State<0||manager.Game_State>3)
		Buffer.BitBlt(800,435,60,40,&Back,160,0,SRCCOPY);


	pDC->BitBlt(0,0,900,620,&Buffer,0,0,SRCCOPY);
	m_gn.Invalidate(true);
	m_go.Invalidate(true);
	m_hu.Invalidate(true);
	m_ci.Invalidate(true);
	m_start.Invalidate(true);

	if(manager.isPlayBkmusic&&!manager.m_backmusic.IsPlaying())
	{
		manager.m_backmusic.SeekToStart();
		manager.m_backmusic.Play();
	}
	ReleaseDC(pDC);
}

void CProgramView::PrintState(CDC *pDC)
{

	CString	st;
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(205,45,20));

	Back.SelectObject(&m_cross);
	if(manager.Game_State==-2)
	{	st.Format("游戏还没开始");
		pDC->TextOut(390,260,st);
	}
	else if(manager.Game_State==-1)
	{	st.Format("游戏准备中,还没丢筛子");
		pDC->TextOut(390,260,st);
	}
	else if(manager.PointPlayer==manager.PlayerAc)
	{
		pDC->BitBlt(410,240,73,73,&Back,0,73,MERGEPAINT);
		pDC->BitBlt(410,240,73,73,&Back,0,0,SRCAND);
	}
	else if(manager.PointPlayer==(manager.PlayerAc+1)%4)
	{
		pDC->BitBlt(410,240,73,73,&Back,73,73,MERGEPAINT);
		pDC->BitBlt(410,240,73,73,&Back,73,0,SRCAND);
	}
	else if(manager.PointPlayer==(manager.PlayerAc+2)%4)
	{
		pDC->BitBlt(410,240,73,73,&Back,146,73,MERGEPAINT);
		pDC->BitBlt(410,240,73,73,&Back,146,0,SRCAND);
	}
	else if(manager.PointPlayer==(manager.PlayerAc+3)%4)
	{
		pDC->BitBlt(410,240,73,73,&Back,219,73,MERGEPAINT);
		pDC->BitBlt(410,240,73,73,&Back,219,0,SRCAND);
	}
	else if(manager.Game_State>=4&&manager.Game_State<=7)
	{
		st.Format("玩家%d胜利",manager.Game_State-4);
			pDC->TextOut(390,260,st);
	}


	pDC->TextOut(370,480,PlayerNames[0]);
	pDC->TextOut(760,10,PlayerNames[1]);
	pDC->TextOut(390,5,PlayerNames[2]);
	pDC->TextOut(50,10,PlayerNames[3]);
	
}

int CProgramView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	CEnter	enter;
	if(enter.DoModal()==IDOK)
	{
		PlayerNames[0]=enter.m_name;
	}
	m_pControl->OnSorc();

	// TODO: Add your specialized creation code here
	m_gn.Create("杠",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
		CRect(580,435,620,475),this,ID_GN);
	m_go.Create("过",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
		CRect(630,435,670,475),this,ID_GO);
	m_ci.Create("碰",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
		CRect(680,435,720,475),this,ID_CI);
	m_hu.Create("胡",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
		CRect(730,435,770,475),this,ID_HU);
	m_start.Create("开始",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
		CRect(800,435,860,475),this,ID_START);
		
	m_gn.ShowWindow(SW_HIDE);
	m_go.ShowWindow(SW_HIDE);
	m_ci.ShowWindow(SW_HIDE);
	m_hu.ShowWindow(SW_HIDE);
	m_start.ShowWindow(SW_HIDE);

	manager.PlaySound(0);
	return 0;
}

void CProgramView::OnGn()
{
	MessageBox("杠");
	manager.DoMsg(0,5);
}

void CProgramView::OnGo()
{
	MessageBox("过");
	manager.DoMsg(0,1);
}

void CProgramView::OnCi()
{
	MessageBox("碰");
	manager.DoMsg(0,4);
}

void CProgramView::OnHu()
{
	MessageBox("胡");
	manager.DoMsg(0,9);
}

void CProgramView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	int	mx=point.x;
	int	my=point.y;
	
	if(mx>=580&&my>=435&&mx<=620&&my<=475)
	{
		manager.DoMsg(0,4);
	}
	else if(mx>=630&&my>=435&&mx<=670&&my<=475)
	{
		manager.DoMsg(0,9);
	}
	else if(mx>=680&&my>=435&&mx<=720&&my<=475)
	{
		manager.DoMsg(0,5);
	}
	else if(mx>=730&&my>=435&&mx<=770&&my<=475)
	{
		manager.DoMsg(0,1);
	}
	else if(mx>=800&&my>=435&&mx<=860&&my<=475)
	{
		if(m_pControl->m_Isserver && (manager.Game_State<0 || manager.Game_State>3))
		{	
			m_pControl->m_ready[0]=true;
			int k;
			for(k=0;k<4;k++)
				if(!m_pControl->m_ready[k])
					break;
			if(k==4)
			{
				//游戏开始
				char st[1000]="majiangstcad";
				do
				{
				manager.GameStart();
				m_pControl->MakeStartCards(st+12);
				if(strlen(st)!=122)
				{
					MessageBox(st,"sss",1);
				//	return;
				}
				}
				while (strlen(st)!=122);
				m_pControl->Broadcast(st);
			}
		}
		else
			m_pControl->SendGetReady();
	}


	CView::OnLButtonDown(nFlags, point);
}

void CProgramView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int	mx=point.x;
	int	my=point.y;
	if(mx>=165&&my>=500&&mx<=845&&my<=571)
	{
		if(mx>=795&&mx<=845)
			mx=13;
		else
			mx=(mx-795+(SelectNum()+1)*45)/45-1;
		if(manager.DoMsg(mx,2))
		{
			PrintAll();
		}
	
	}	
	
	CView::OnLButtonUp(nFlags, point);
}

int CProgramView::SelectNum()
{
	int	k(0);
	for(;manager.PlayCards[manager.PlayerAc][k].Num<=9&&k<=12;k++);
	return	k;
}

void CProgramView::OnStart()
{
	if(m_pControl->m_Isserver)
	{	
		m_pControl->m_ready[0]=true;
		int k;
		for(k=0;k<4;k++)
			if(!m_pControl->m_ready[k])
				break;
		if(k==4)
		{
			//游戏开始
			char st[1000]="majiangstcad";
			manager.GameStart();
			m_pControl->MakeStartCards(st+12);
			m_pControl->Broadcast(st);
		}
	}
	else
		m_pControl->SendGetReady();
}

⌨️ 快捷键说明

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