📄 gameclientdlg.cpp
字号:
#include "Stdafx.h"
#include "GameOption.h"
#include "GameClient.h"
#include "GameClientDlg.h"
//////////////////////////////////////////////////////////////////////////
//定时器标识
#define IDI_START_GAME 200 //开始定时器
#define IDI_GIVE_UP 201 //放弃定时器
//////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CGameClientDlg, CGameFrameDlg)
ON_MESSAGE(IDM_START,OnStart)
ON_MESSAGE(IDM_FOLLOW,OnFollow)
ON_MESSAGE(IDM_GIVE_UP,OnGiveUp)
ON_MESSAGE(IDM_ADD_GOLD,OnAddGold)
ON_MESSAGE(IDM_SHOWHAND,OnShowHand)
ON_MESSAGE(IDM_ADD_SCORE_CONTROL,OnAddGoldControl)
ON_MESSAGE(IDM_SEND_CARD_FINISH,OnSendCardFinish)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
//构造函数
CGameClientDlg::CGameClientDlg() : CGameFrameDlg(&m_GameClientView)
{
//游戏变量
m_lTurnMaxGold=0L;
m_lTurnBasicGold=0L;
memset(m_bPlayStatus,0,sizeof(m_bPlayStatus));
m_wCurrentUser = INVALID_CHAIR;
m_lShowHandScore = 0L;
ZeroMemory( m_lUserScore,sizeof(m_lUserScore) );
//辅助变量
m_lGoldShow=0L;
m_bShowHand=false;
memset(m_szName,0,sizeof(m_szName));
ZeroMemory(&m_GameEnd,sizeof(m_GameEnd));
return;
}
//析构函数
CGameClientDlg::~CGameClientDlg()
{
}
//初始函数
bool CGameClientDlg::InitGameFrame()
{
//设置图标
HICON hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
SetIcon(hIcon,TRUE);
SetIcon(hIcon,FALSE);
return true;
}
//重置框架
void CGameClientDlg::ResetGameFrame()
{
//游戏变量
m_lTurnMaxGold=0L;
m_lTurnBasicGold=0L;
memset(m_bPlayStatus,0,sizeof(m_bPlayStatus));
m_wCurrentUser = INVALID_CHAIR;
m_lShowHandScore = 0L;
ZeroMemory( m_lUserScore,sizeof(m_lUserScore) );
//辅助变量
m_lGoldShow=0L;
m_bShowHand=false;
memset(m_szName,0,sizeof(m_szName));
ZeroMemory(&m_GameEnd,sizeof(m_GameEnd));
return;
}
//游戏设置
void CGameClientDlg::OnGameOptionSet()
{
//构造数据
CGameOption GameOption;
GameOption.m_bEnableSound=IsEnableSound();
GameOption.m_bAllowLookon=IsAllowUserLookon();
//配置数据
if (GameOption.DoModal()==IDOK)
{
EnableSound(GameOption.m_bEnableSound);
AllowUserLookon(0,GameOption.m_bAllowLookon);
}
return;
}
//时间消息
bool CGameClientDlg::OnTimerMessage(WORD wChairID, UINT nElapse, UINT nTimerID)
{
switch (nTimerID)
{
case IDI_START_GAME: //继续游戏定时器
{
if (nElapse==0)
{
PostMessage(WM_CLOSE,0,0);
return false;
}
if (nElapse<=10) PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WARN"));
return true;
}
case IDI_GIVE_UP: //放弃定时器
{
WORD wViewChairID=SwitchViewChairID(wChairID);
if (nElapse==0)
{
if ((IsLookonMode()==false)&&(wViewChairID==2)) OnGiveUp(1,1);
return false;
}
if ((nElapse<=10)&&(wViewChairID==2)&&(IsLookonMode()==false)) PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WARN"));
return true;
}
}
return false;
}
//旁观状态
void CGameClientDlg::OnLookonChanged(bool bLookonUser, const void * pBuffer, WORD wDataSize)
{
//控件控制
m_GameClientView.m_CardControl[2].AllowPositively(IsAllowLookon());
return;
}
//网络消息
bool CGameClientDlg::OnGameMessage(WORD wSubCmdID, const void * pBuffer, WORD wDataSize)
{
switch (wSubCmdID)
{
case SUB_S_GAME_START: //游戏开始
{
return OnSubGameStart(pBuffer,wDataSize);
}
case SUB_S_ADD_GOLD: //用户下注
{
m_GameClientView.FinishDispatchCard();
return OnSubAddGold(pBuffer,wDataSize);
}
case SUB_S_GIVE_UP: //用户放弃
{
m_GameClientView.FinishDispatchCard();
return OnSubGiveUp(pBuffer,wDataSize);
}
case SUB_S_SEND_CARD: //发牌消息
{
m_GameClientView.FinishDispatchCard();
return OnSubSendCard(pBuffer,wDataSize);
}
case SUB_S_GAME_END: //游戏结束
{
return OnSubGameEnd(pBuffer,wDataSize);
}
}
return false;
}
//游戏场景
bool CGameClientDlg::OnGameSceneMessage(BYTE cbGameStation, bool bLookonOther, const void * pBuffer, WORD wDataSize)
{
switch (cbGameStation)
{
case GS_FREE: //空闲状态
{
//效验数据
if (wDataSize!=sizeof(CMD_S_StatusFree)) return false;
CMD_S_StatusFree * pStatusFree=(CMD_S_StatusFree *)pBuffer;
//辅助变量
m_bShowHand=false;
//设置界面
m_lGoldShow=0L;
m_lTurnBasicGold=0L;
m_GameClientView.SetGoldTitleInfo(0,pStatusFree->dwBasicGold);
//玩家设置
if (IsLookonMode()==false)
{
//设置按钮
m_GameClientView.m_btStart.ShowWindow(SW_SHOW);
m_GameClientView.m_btStart.SetFocus();
//设置时间
SetGameTimer(GetMeChairID(),IDI_START_GAME,30);
}
return true;
}
case GS_PLAYING: //游戏状态
{
//效验数据
if (wDataSize!=sizeof(CMD_S_StatusPlay)) return false;
CMD_S_StatusPlay * pStatusPlay=(CMD_S_StatusPlay *)pBuffer;
//设置变量
m_lTurnMaxGold=pStatusPlay->lTurnMaxGold;
m_lTurnBasicGold=pStatusPlay->lTurnBasicGold;
CopyMemory(m_bPlayStatus,pStatusPlay->bPlayStatus,sizeof(m_bPlayStatus));
m_wCurrentUser = pStatusPlay->wCurrentUser;
m_lShowHandScore = pStatusPlay->lShowHandScore;
m_bShowHand = pStatusPlay->bShowHand?true:false;
//设置界面
for (WORD i=0;i<GAME_PLAYER;i++)
{
WORD wViewStation=SwitchViewChairID(i);
const tagUserData * pUserData=GetUserData(i);
if (pUserData!=NULL)
{
m_lUserScore[i] = pUserData->lScore;
lstrcpyn(m_szName[i],pUserData->szName,CountArray(m_szName[i]));
if (m_bPlayStatus[i]==TRUE) m_GameClientView.m_CardControl[wViewStation].SetCardData(pStatusPlay->bTableCardArray[i],pStatusPlay->bTableCardCount[i]);
m_GameClientView.SetUserGold( wViewStation,pUserData->lScore );
}
m_GameClientView.SetUserGoldInfo(wViewStation,false,pStatusPlay->lTableGold[2*i]);
m_GameClientView.SetUserGoldInfo(wViewStation,true,pStatusPlay->lTableGold[2*i+1]);
}
m_GameClientView.SetGoldTitleInfo(pStatusPlay->lTurnMaxGold,pStatusPlay->lBasicGold);
//判断是否观看
if ((IsLookonMode()==false)||(IsAllowLookon()==true)) m_GameClientView.m_CardControl[2].AllowPositively(true);
//判断是否自己下注
if ((IsLookonMode()==false)&&(pStatusPlay->wCurrentUser==GetMeChairID()))
{
UpdateScoreControl();
}
SetGameTimer(pStatusPlay->wCurrentUser,IDI_GIVE_UP,30);
return true;
}
}
return false;
}
//游戏开始
bool CGameClientDlg::OnSubGameStart(const void * pBuffer, WORD wDataSize)
{
//效验数据
if (wDataSize!=sizeof(CMD_S_GameStart)) return false;
CMD_S_GameStart * pGameStart=(CMD_S_GameStart *)pBuffer;
//游戏变量
m_lTurnMaxGold=pGameStart->lTurnMaxGold;
m_lTurnBasicGold=pGameStart->lTurnBasicGold;
memset(m_szName,0,sizeof(m_szName));
memset(m_bPlayStatus,0,sizeof(m_bPlayStatus));
m_wCurrentUser = pGameStart->wCurrentUser;
m_lShowHandScore = pGameStart->lShowHandScore;
//辅助变量
m_lGoldShow=0L;
m_bShowHand=false;
//变量定义
WORD wMeChairID=GetMeChairID();
bool bLookonMode=IsLookonMode();
LONG lBaseGold=pGameStart->lBasicGold;
//设置状态
SetGameStatus(GS_PLAYING);
m_GameClientView.SetGoldTitleInfo(pGameStart->lTurnMaxGold,lBaseGold);
//设置界面
m_GameClientView.m_ScoreView.ShowWindow(SW_HIDE);
for (WORD i=0;i<GAME_PLAYER;i++)
{
//变量定义
WORD wViewChairID=SwitchViewChairID(i);
const tagUserData * pUserData=GetUserData(i);
//设置界面
if (pUserData!=NULL)
{
m_bPlayStatus[i]=TRUE;
m_lUserScore[i] = pUserData->lScore;
m_GameClientView.SetUserGoldInfo(wViewChairID,false,0L);
m_GameClientView.SetUserGoldInfo(wViewChairID,true,lBaseGold);
lstrcpyn(m_szName[i],pUserData->szName,CountArray(m_szName[i]));
m_GameClientView.SetUserGold( wViewChairID,pUserData->lScore );
}
else
{
m_bPlayStatus[i]=FALSE;
m_lUserScore[i] = 0L;
m_GameClientView.SetUserGoldInfo(wViewChairID,true,0L);
m_GameClientView.SetUserGoldInfo(wViewChairID,false,0L);
}
//设置控件
m_GameClientView.m_CardControl[wViewChairID].SetCardData(NULL,0);
m_GameClientView.m_CardControl[wViewChairID].ShowFirstCard(false);
}
if (bLookonMode==false)
{
ActiveGameFrame();
m_GameClientView.m_CardControl[2].AllowPositively(true);
}
//旁观控制
if ((bLookonMode==true)&&(IsAllowLookon()==true))
{
m_GameClientView.m_CardControl[2].AllowPositively(true);
}
//派发扑克
for (BYTE cbIndex=0;cbIndex<2;cbIndex++)
{
for (WORD i=0;i<GAME_PLAYER;i++)
{
if (m_bPlayStatus[i]==TRUE)
{
//变量定义
WORD wViewChairID=SwitchViewChairID(i);
BYTE cbCardData[2]={0,pGameStart->bCardData[i]};
//派发扑克
cbCardData[0]=(GetMeChairID()==i)?pGameStart->bFundusCard:0;
m_GameClientView.DispatchUserCard(wViewChairID,cbCardData[cbIndex]);
}
}
}
//设置定时器
PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_START"));
return true;
}
//用户加注
bool CGameClientDlg::OnSubAddGold(const void * pBuffer, WORD wDataSize)
{
//效验数据
if (wDataSize!=sizeof(CMD_S_AddGold)) return false;
CMD_S_AddGold * pAddGold=(CMD_S_AddGold *)pBuffer;
//变量定义
WORD wMeChairID=GetMeChairID();
WORD wViewChairID=SwitchViewChairID(pAddGold->wLastChairID);
m_wCurrentUser = pAddGold->wCurrentUser;
//处理数据
m_lTurnBasicGold=pAddGold->lCurrentLessGold;
if( !m_bShowHand && m_bPlayStatus[pAddGold->wLastChairID] )
{
LONG lShowHandScore = __min(m_lUserScore[pAddGold->wLastChairID],m_lShowHandScore);
if( m_lTurnBasicGold+m_GameClientView.m_GoldView[wViewChairID*2+1].GetGold() == lShowHandScore )
{
m_bShowHand = true;
m_GameClientView.SetUserShowHand(true);
}
}
if( pAddGold->lLastAddGold > 0L )
m_GameClientView.SetUserGoldInfo(wViewChairID,false,pAddGold->lLastAddGold);
if ((IsLookonMode()==false)&&(pAddGold->wCurrentUser==wMeChairID))
{
UpdateScoreControl();
}
//其他处理
SetGameTimer(pAddGold->wCurrentUser,IDI_GIVE_UP,30);
if ( m_bShowHand && m_bPlayStatus[pAddGold->wLastChairID] ) PlayGameSound(AfxGetInstanceHandle(),TEXT("SHOW_HAND"));
else if (m_bPlayStatus[pAddGold->wLastChairID]==TRUE) PlayGameSound(AfxGetInstanceHandle(),TEXT("ADD_SCORE"));
return true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -