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