📄 player.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 + -