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

📄 player.cpp

📁 无聊的时候编写的
💻 CPP
字号:
#include "StdAfx.h"
#include "Player.h"
size_t CPlayer::m_Temp =0;
CPlayer::CPlayer(void)
{
	m_bSelf	=	FALSE;
	m_pHead[0] = NULL;
	m_pHead[1] = NULL;
}

CPlayer::~CPlayer(void)
{
}

//!	该函数在初始化的时候调用,传递窗口句柄目的是得到窗口的大小使用
void	CPlayer::Init(HWND hWnd)
{
	m_hWnd	=	hWnd;
	m_pHead[0] = Image::FromFile(_T("Data/face1.bmp"));
	m_pHead[1] = Image::FromFile(_T("Data/face3.bmp"));
	m_pHead[2] = Image::FromFile(_T("Data/face2.bmp"));
}
//!	该函数由Game类调用,功能得到一张牌
void	CPlayer::Deal(const CCards& card,const RECT& rect)
{
	m_arHands.push_back(card);
	CalcCardsPos(rect);
}

void	CPlayer::SetSelf(BOOL bSelf)
{
	m_bSelf	=	bSelf;
}
BOOL	CPlayer::IsSelf()
{
	return	m_bSelf;
}

void	CPlayer::SetZeminder(BOOL bZeminder)
{
	m_bZeminder	=	bZeminder;
}
BOOL	CPlayer::IsZeminder()
{
	return	m_bZeminder;
}


void	CPlayer::SetSeat(PLAYERSEATS seat)
{
	m_Seat	=	seat;
}
PLAYERSEATS	CPlayer::GetSeat()
{
	return	m_Seat;
}
void	CPlayer::Reset()
{
	m_bZeminder	=	FALSE;
	m_bSelf		=	FALSE;
	m_arHands.clear();
	m_arOut.clear();
	m_arWaiting.clear();
}

inline	bool	__Sort(const CCards& left,const CCards& right)
{
	return	left.m_iValue	< right.m_iValue;
}
void	CPlayer::SortCards()
{
	RECT	rect;
	GetClientRect(m_hWnd,&rect);
	std::sort(m_arHands.begin(),m_arHands.end() ,__Sort);
	CalcCardsPos(rect);
}
//!	计算牌的位置
void	CPlayer::CalcCardsPos(const RECT& rt,ArrayCards* pCards /* = NULL */)
{
	ArrayCards*	pCurCards	=	&m_arHands;
	if ( pCards != NULL)
	{
		pCurCards	=	pCards;
	}
	int		iHeight	=	rt.bottom - rt.top;
	int		iWidth	=	rt.right - rt.left;

	int		iSpaceX	=	0;
	int		iSpaceY	=	0;
	switch(m_Seat)
	{
	case PS_LEFT:
		{
			iSpaceX	=	rt.left;
			iSpaceY	=	rt.top + (iHeight - (int)(*pCurCards).size() * CCards::SPACE ) / 2-50;
		}
		break;
	case PS_RIGHT:
		{
			iSpaceX	=	rt.right - 80;
			iSpaceY	=	rt.top + (iHeight - (int)(*pCurCards).size() * CCards::SPACE ) / 2-50;
		}
		break;
	case PS_BOTTOM:
		{
			iSpaceX	=	rt.left + (iWidth - (int)(*pCurCards).size() * CCards::SPACE ) / 2-50;
			iSpaceY	=	rt.bottom - 114;
		}
		break;
	}

	float	fX	=	0;
	float	fY	=	0;
	for (size_t	i = 0 ; i < (*pCurCards).size() ; ++ i)
	{
		switch(m_Seat)
		{
		case PS_LEFT:
			{
				fX	=	float(iSpaceX);
				fY	=	float(iSpaceY + i * CCards::SPACE);
				(*pCurCards)[i].m_vPos		=	PointF(fX,fY);
			}
			break;
		case PS_RIGHT:
			{
				fX	=	float(iSpaceX);
				fY	=	float(iSpaceY + i * CCards::SPACE);
				(*pCurCards)[i].m_vPos		=	PointF(fX,fY);
			}
			break;
		case PS_BOTTOM:
			{
				fX	=	float(iSpaceX + i * CCards::SPACE);
				fY	=	float(iSpaceY) ;
				(*pCurCards)[i].m_vPos		=	PointF(fX,fY);
			}
			break;
		}
		
	}
}
//!绘制牌
void	CPlayer::Draw(Graphics& grp,Image* pCards)
{

	for	(size_t i = 0 ; i < m_arHands.size() ; ++ i )
	{
		grp.DrawImage(pCards,
			(int)m_arHands[i].m_vPos.X,
			(int)m_arHands[i].m_vPos.Y,
			m_arHands[i].m_iIndex*82,
			0,
			82,
			114,
			UnitPixel);
	}
	for (size_t i = 0 ; i < m_arOut.size() ; ++ i)
	{
		grp.DrawImage(pCards,
			(int)m_arOut[i].m_vPos.X,
			(int)m_arOut[i].m_vPos.Y,
			m_arOut[i].m_iIndex*82,
			0,
			82,
			114,
			UnitPixel);
	}
	grp.DrawImage(m_pHead[0] , 0 , 0);
	grp.DrawImage(m_pHead[1] , 150 , 540);
	grp.DrawImage(m_pHead[2] , 920 , 0);
}

BOOL	CPlayer::ClickCards(POINT pt, CCards& card)
{

	RECT	rt;
	rt.left		=	card.m_vPos.X;
	rt.right	=	rt.left +84;
	rt.top		=	card.m_vPos.Y;
	rt.bottom	=	rt.top + 114;
	switch(m_Seat)
	{
	case PS_LEFT:
		{
			if (PtInRect(&rt,pt))
			{
				if (card.m_bState)
				{
					card.m_vPos.X	-=	CCards::SPACE;
					card.m_bState	=	FALSE;
					ArrayCards::iterator itr = std::find(m_arWaiting.begin(),m_arWaiting.end(),card.m_iIndex);
					m_arWaiting.erase(itr);				
				}
				else
				{
					card.m_vPos.X	+=	CCards::SPACE;
					card.m_bState	=	TRUE;
					m_arWaiting.push_back(card);
				}
				return	TRUE;
			}
		}
		break;
	case PS_RIGHT:
		{
			if (PtInRect(&rt,pt))
			{
				if (card.m_bState)
				{
					card.m_vPos.X	+=	CCards::SPACE;
					card.m_bState	=	FALSE;
					ArrayCards::iterator itr = std::find(m_arWaiting.begin(),m_arWaiting.end(),card.m_iIndex);
					m_arWaiting.erase(itr);
				}
				else
				{
					card.m_vPos.X	-=	CCards::SPACE;
					card.m_bState	=	TRUE;
					m_arWaiting.push_back(card);
				}
				return	TRUE;
			}
		}
		break;
	case PS_BOTTOM:
		{
			if (PtInRect(&rt,pt))
			{
				if (card.m_bState)
				{
					card.m_vPos.Y	+=	CCards::SPACE;
					card.m_bState	=	FALSE;
					ArrayCards::iterator itr = std::find(m_arWaiting.begin(),m_arWaiting.end(),card.m_iIndex);
					m_arWaiting.erase(itr);
				}
				else
				{
					card.m_vPos.Y	-=	CCards::SPACE;
					card.m_bState	=	TRUE;
					m_arWaiting.push_back(card);
				}
				return	TRUE;
			}
		}
		break;
	}
	return	FALSE;
}

ArrayCards&	CPlayer::GetWaitingOutCards()
{
	return	m_arWaiting;
}
BOOL	CPlayer::OnLButtonDown(POINT pt)
{
	int	i=	(int)m_arHands.size() - 1;
	for ( ; i >= 0 ;  --i)
	{
		if (ClickCards(pt,m_arHands[i]))
		{
			return	TRUE;
		}
	}
	return	FALSE;
	
}
BOOL	CPlayer::OnRButtonDown(POINT pt,ArrayCards& arCards)
{
	
	//!	如果没有待出牌就不直接返回
	if (m_arWaiting.size()==0)
	{
		return	FALSE;
	}
	//!	如果上一把没有牌,说明是第一次出牌
	if (arCards.size() == 0)
	{
		if (CARDS_UNKNOW == CCardRule::GetCardsType(m_arWaiting))
		{
			return	FALSE;
		}		
	}
	else
	{
		if (!CCardRule::CheckIfCanOut(arCards,m_arWaiting))
		{
			return	FALSE;
		}
		//!	这里比较要出派的大小,如果要出的牌比当前牌小,就不能出,否则能出
}
	//!	保存牌信息
	arCards	=	m_arWaiting;
	//!	如果有待出的牌就首先把待出的牌放到已出牌的数组中,然后在从手中的
	//!	牌中把已经出的牌删除
	for (size_t i = 0 ; i < m_arWaiting.size() ; ++ i)
	{
		ArrayCards::iterator itr = std::find(m_arHands.begin(),m_arHands.end(),m_arWaiting[i]);
		m_arOut.push_back(*itr);
		m_arHands.erase(itr);
	}
	m_Temp = 0;
	//!	计算已出牌的位置。
	//!	排序手中的牌
	m_Temp = 0;
	SortCards();
	//!	删除待出牌
	m_arWaiting.clear();
	//!	排序已经出的牌
	RECT	rt;
	GetClientRect(m_hWnd,&rt);
	switch(m_Seat)
	{
	case PS_LEFT:
		{
			rt.left		+=	150;
		}
		break;
	case PS_RIGHT:
		{
			rt.right	-=	150;
		}
		break;
	case PS_BOTTOM:
		{
			rt.bottom	-=	200;
		}
		break;
	}
	//std::sort(m_arOut.begin(),m_arOut.end() ,__Sort);
	CalcCardsPos(rt,&m_arOut);
	return	TRUE;
}

⌨️ 快捷键说明

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