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

📄 game.cpp

📁 无聊的时候编写的
💻 CPP
字号:
#include "StdAfx.h"
#include "Game.h"

CGame::CGame(void)
{
	m_curPlayer	=	PS_BOTTOM;
	m_OutCards	=	CARDS_UNKNOW;
	m_seatBeyond=	PS_BOTTOM;
	m_bBanker[0]  = FALSE;
	m_bBanker[1]  = TRUE;
	m_bBanker[2]  = FALSE;
	m_PBank	   = NULL;
	m_bBanker[3]  = true;
	m_Rdown = true;

	m_BankerPt[0].x = 120;
	m_BankerPt[0].y = 250;
	m_BankerPt[1].x = 680;
	m_BankerPt[1].y = 250;
	m_BankerPt[2].x = 350;
	m_BankerPt[2].y = 450;
}

inline	bool	__SortIndex(const CCards& left,const CCards& right)
{
	return	left.m_iIndex < right.m_iIndex;
}
CGame::~CGame(void)
{
}

void	CGame::Init(HWND hWnd)
{
	m_hWnd		=	hWnd;
	m_arPlayers.resize(3);
	for (size_t i = 0 ; i < m_arPlayers.size() ; ++ i )
	{
		m_arPlayers[i].Init(hWnd);
	}
	m_pCards	=	Image::FromFile(_T("Data/cards.bmp"));
	m_pBk		=	Image::FromFile(_T("Data/poker1.jpg"));
	m_PBank	   = Image::FromFile(_T("Data/choose_lord.bmp"));



}
void	CGame::StardGame()
{
	//!	首先洗牌
	Shuffle();
	size_t iSelf		=	rand() % m_arPlayers.size();
	size_t iZemender	=	rand() % m_arPlayers.size();
	for (size_t i = 0 ; i < m_arPlayers.size() ; ++ i)
	{
		m_arPlayers[i].SetSelf(FALSE);
		m_arPlayers[i].SetZeminder(FALSE);
	}
	m_arPlayers[iSelf].SetSelf(TRUE);
	switch(iSelf)
	{
	case 0:
		{
			m_arPlayers[2].SetSeat(PS_LEFT);
			m_arPlayers[1].SetSeat(PS_RIGHT);
			m_arPlayers[0].SetSeat(PS_BOTTOM);
		}
		break;
	case 1:
		{
			m_arPlayers[0].SetSeat(PS_LEFT);
			m_arPlayers[2].SetSeat(PS_RIGHT);
			m_arPlayers[1].SetSeat(PS_BOTTOM);
		}
		break;
	case 2:
		{
			m_arPlayers[0].SetSeat(PS_LEFT);
			m_arPlayers[1].SetSeat(PS_RIGHT);
			m_arPlayers[2].SetSeat(PS_BOTTOM);
		}
		break;
	}
	m_arPlayers[iZemender].SetZeminder(TRUE);
	m_curPlayer	=	m_arPlayers[iZemender].GetSeat();
}

void	CGame::EndGame()
{
	for (size_t i = 0 ; i < m_arPlayers.size() ; ++ i)
	{
		m_arPlayers[i].Reset();
	}
}

void	CGame::Shuffle()
{
	m_arCards.clear();
	while (m_arCards.size() < 54)
	{
		CCards card;
		card.m_iIndex	=	rand() %54;
		card.m_color	=	(ECARD_COLOR)(card.m_iIndex%4);
		if (card.m_iIndex >51)
		{
			card.m_iValue	=	card.m_iIndex;
		}
		else
		{
			card.m_iValue	=	3 + card.m_iIndex/4;
		}

		ArrayCards::iterator itr = find(m_arCards.begin(),m_arCards.end(),card);
		if ( itr == m_arCards.end())
		{
			m_arCards.push_back(card);
		}
	}
	//!	计算底牌的位置
	RECT	rt;
	GetClientRect(m_hWnd,&rt);
	m_arUnknow.clear();
	int		iBegin	=	((rt.right - rt.left) - 3 * 82 ) /2;
	for (size_t i = 0 ; i < 3 ; ++ i)
	{
		m_arCards[51 + i].m_vPos	=	PointF(iBegin + i*80,0);
		m_arUnknow.push_back(m_arCards[51 + i]);
	}
	
}

void	CGame::SendAppointed(PLAYERSEATS player)
{
	Shuffle();
	std::sort(m_arCards.begin(),m_arCards.end(),__SortIndex);
	size_t	arIndex[] = { 37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53};
	for (size_t j = 0 ; j < 17 ; ++ j)
	{
		m_arPlayers[2].m_arHands.push_back(m_arCards[arIndex[j]]);
	}
	Shuffle();
	for (size_t i = 0 ; i < 17 ; ++ i)
	{
		ArrayCards::iterator itr = std::find(m_arCards.begin(),m_arCards.end(),arIndex[i]);
		if ( itr != m_arCards.end() )
		{
			m_arCards.erase(itr);
		}
	}
	CRect	rect;
	::GetClientRect(m_hWnd,&rect);
	size_t	iPlayer		=	m_arPlayers.size();
	for (size_t i = 0 ; i < 34 ; i += 2 )
	{
		for (size_t j = 0 ; j < 2 ; ++ j)
		{
			m_arPlayers[j].SortCards();
			m_arPlayers[j].Deal(m_arCards[i + j],rect);			
		}
	}
	for (size_t j = 0 ; j < m_arPlayers.size() ; ++ j)
	{
		m_arPlayers[j].SortCards();
	}

	//!	计算底牌的位置
	RECT	rt;
	GetClientRect(m_hWnd,&rt);
	m_arUnknow.clear();
	int		iBegin	=	((rt.right - rt.left) - 3 * 82 ) /2;
	for (size_t i = 0 ; i < 3 ; ++ i)
	{
		m_arCards[31 + i].m_vPos	=	PointF(iBegin + i*80,0);
		m_arUnknow.push_back(m_arCards[31 + i]);
	}

}

void	CGame::Deal()
{
	CRect	rect;
	::GetClientRect(m_hWnd,&rect);
	size_t	iPlayer		=	m_arPlayers.size();
	for (size_t i = 0 ; i < 51 ; i += iPlayer )
	{
		for (size_t j = 0 ; j < m_arPlayers.size() ; ++ j)
		{
			m_arPlayers[j].SortCards();
			m_arPlayers[j].Deal(m_arCards[i + j],rect);			
		}
	}
	for (size_t j = 0 ; j < m_arPlayers.size() ; ++ j)
	{
		m_arPlayers[j].SortCards();
	}
}

void	CGame::Draw(Graphics& grp)
{
	
	grp.DrawImage(m_pBk,0,0);
	if (!m_bBanker[0])
	{
		for (size_t i = 0; i < m_arUnknow.size() ; ++ i)
		{
			grp.DrawImage(m_pCards,
				(int)m_arUnknow[i].m_vPos.X,
				(int)m_arUnknow[i].m_vPos.Y,
				54*82,
				0,
				82,
				114,
				UnitPixel);
		}
	}else
	{
		for (size_t i = 0; i < m_arUnknow.size() ; ++ i)
		{
			grp.DrawImage(m_pCards,
				(int)m_arUnknow[i].m_vPos.X,
				(int)m_arUnknow[i].m_vPos.Y,
				m_arUnknow[i].m_iIndex*82,
				0,
				82,
				114,
				UnitPixel);
		}
	}

	for (size_t i = 0 ; i < m_arPlayers.size(); ++ i)
	{
		m_arPlayers[i].Draw(grp,m_pCards);
	}
	
}

BOOL	CGame::OnLButtonDown(POINT pt)
{

	for (size_t i = 0 ; i < m_arPlayers.size() ; ++ i)
	{
		m_arPlayers[i].OnLButtonDown(pt);
	}
	return	TRUE;
}
BOOL	CGame::OnRButtonDown(POINT pt)
{
	for (size_t i = 0 ; i < m_arPlayers.size() ; ++ i)
	{
		if (m_arPlayers[i].GetSeat() == m_curPlayer )
		{
			//!	如果当前牌的拥有者和下一个要出牌的人是同一个人
			if (m_seatBeyond == GetNextPlayer(m_curPlayer))
			{
				m_arOutCards.clear();
			}
			if (m_arPlayers[i].OnRButtonDown(pt,m_arOutCards))
			{
				SetNextPlayer();
 				m_seatBeyond	=	m_curPlayer;
				return	TRUE;
				m_Rdown = TRUE;
			}
		}
		
	}
	return	FALSE;
	m_Rdown = false;
}
BOOL	CGame::OnMouseMove(POINT pt)
{
	//m_Dlg.OnMouseMove(pt);
	return	TRUE;
}
PLAYERSEATS	CGame::GetNextPlayer(PLAYERSEATS player)
{
	switch(player)
	{
	case PS_LEFT:
		{
			m_rect	=	CRect(250,550,320,590);
			return	PS_BOTTOM;
		}
		break;
	case PS_RIGHT:
		{
			m_rect	=	CRect(100,120,170,160);
			return	PS_LEFT;
		}
		break;
	case PS_BOTTOM:
		{
			m_rect	=	CRect(800,120,870,160);
			return	PS_RIGHT;
		}
		break;
	}
	return	player;
}
void	CGame::SetNextPlayer()
{
	switch(m_curPlayer)
	{
	case PS_LEFT:
		{
			m_rect	=	CRect(250,550,320,590);
			m_curPlayer	=	PS_BOTTOM;

		}
		break;
	case PS_RIGHT:
		{
			m_rect	=	CRect(100,120,170,160);
			m_curPlayer	=	PS_LEFT;
		}
		break;
	case PS_BOTTOM:
		{
			m_rect	=	CRect(800,120,870,160);
			m_curPlayer	=	PS_RIGHT;
		}
		break;
	}
}
PLAYERSEATS pTemp;
void	CGame::GiveupOutCards()
{
	PLAYERSEATS	seatTemp = GetNextPlayer(m_curPlayer);
	m_bBanker[2] = TRUE;
	if (m_Player.m_Temp ==1)
	{
		 pTemp = m_curPlayer;
	}
	if (pTemp == seatTemp && m_Player.m_Temp >=2)
	{
		m_bBanker[3] = false;
		return;
	}
	SetNextPlayer();
}
void CGame::IsBnaker(POINT pt)
{
	size_t m_temp;
	for (size_t i = 0 ; i < m_arPlayers.size() ; ++ i)
	{
		if (m_arPlayers[i].IsZeminder())
		{
			//这里选择地主if
			m_temp = i;
			m_arPlayers[i].m_arHands.push_back(m_arUnknow[0]);
			m_arPlayers[i].m_arHands.push_back(m_arUnknow[1]);
			m_arPlayers[i].m_arHands.push_back(m_arUnknow[2]);
			m_arPlayers[i].SortCards();
			m_bBanker[0] = true;
			m_bBanker[1] = false;
			break;
		}
	}
	
}
bool CGame::DrawIsBanker(POINT pt[] ,Graphics& grp)
{
	grp.DrawImage(m_PBank , pt[2].x , pt[2].y);
	return TRUE;
}

⌨️ 快捷键说明

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