您的位置:首页 > 运维架构 > 网站架构

基于网狐架构台州四张游戏的开发-发牌处理

2010-08-11 20:40 176 查看
比牌为牌九规则,扑克为32张,首先定义扑克数组
//静态变量
const BYTE CGameLogic::m_bCardArray[32]=
{
0x02, 0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C, //方块 A - K
0x14, 0x16,0x17,0x18, 0x1A, //梅花 A - K
0x22, 0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C, //红桃 A - K
0x31, 0x33,0x34, 0x36,0x37,0x38, 0x3A, //黑桃 A - K
};
0x01为方块A 0x0C为方块k
0x11为梅花A 0x1C为梅花k
0x21为红桃A 0x2C为红桃k
0x31为黑桃A 0x3C为黑桃k
先处理发牌部分,放在游戏逻辑类m_GameLogic,写成发牌函数.RandCard
//混乱扑克
void CGameLogic::RandCard(BYTE bCardBuffer[], BYTE bBufferCount)
{
BYTE bSend=0,bStation=0,bCardList[CountArray(m_bCardArray)];
CopyMemory(bCardList,m_bCardArray,sizeof(m_bCardArray));
static long int dwRandCount=0L;
srand((unsigned)time(NULL)+dwRandCount++);
do
{
bStation=rand()%(CountArray(m_bCardArray)-bSend);
bCardBuffer[bSend++]=bCardList[bStation];
bCardList[bStation]=bCardList[CountArray(m_bCardArray)-bSend];
} while (bSend<bBufferCount);
return;
}
bCardBuffer为发牌数组,bBufferCount为发牌数组长度
在游戏开始部分
//游戏开始
bool __cdecl CTableFrameSink::OnEventGameStart()
函数中调用该函数
//游戏开始
bool __cdecl CTableFrameSink::OnEventGameStart()
{
//状态变量
m_bSendCardCount=0;
memset(m_bPlayStatus,0,sizeof(m_bPlayStatus));
memset(m_bTableCardCount,0,sizeof(m_bTableCardCount));
memset(m_bTableCardFenArray,0,sizeof(m_bTableCardFenArray));
//金币变量
m_lMaxGold=0L;
m_lTurnBasicGold=0L;
memset(m_lTableGold,0,sizeof(m_lTableGold));

//设置状态
m_pITableFrame->SetGameStatus(GS_PLAYING);
//变量定义
const tagUserScore * pUserScore=NULL;
IServerUserItem * pIServerUserItem=NULL;

//分发扑克
m_bSendCardCount=4;
m_GameLogic.RandCard(m_bTableCardArray[0],sizeof(m_bTableCardArray)/sizeof(m_bTableCardArray[0][0]));
for (WORD i=0;i<m_wPlayerCount;i++)
{
bBoolgiveup=false;
m_bTableCardCount=m_bSendCardCount;

}
Bankuser=INVALID_CHAIR;
//发送开始
CMD_S_GameStart GameStart;
memset(&GameStart,0,sizeof(GameStart));
//计算下注
bool bCalculateGold=false;
for (WORD i=0;i<m_wPlayerCount;i++)
{
pIServerUserItem=m_pITableFrame->GetServerUserItem(i);
if (pIServerUserItem!=NULL)
{
m_bPlayStatus=true;
m_lTableGold[i*2+1]=m_pGameServiceOption->lCellScore;
if (bCalculateGold==false)
{
bCalculateGold=true;
pUserScore=pIServerUserItem->GetUserScore();
ASSERT(pUserScore->lScore>m_pGameServiceOption->lCellScore);
m_lMaxGold=pUserScore->lScore;
}
else
{
pUserScore=pIServerUserItem->GetUserScore();
ASSERT(pUserScore->lScore>1L);
m_lMaxGold=__min(m_lMaxGold,pUserScore->lScore);
}
}
}
GameStart.lMaxGold=m_lMaxGold;
GameStart.lTurnMaxGold=m_lMaxGold/4L;
GameStart.lTurnBasicGold=m_lTurnBasicGold;
for (WORD i=0;i<m_wPlayerCount;i++)
{
bBoolfen=false;
bBoolbi=false;
memset(GameStart.bCardData,0,sizeof(GameStart.bCardData));
memcpy(GameStart.bCardData,m_bTableCardArray,sizeof(GameStart.bCardData));
if (m_pITableFrame->GetServerUserItem(i)!=NULL)
{
//设置庄家
if(Bankuser==INVALID_CHAIR || m_pITableFrame->GetServerUserItem(Bankuser)==NULL)
Bankuser=i;
m_wCurrentUser=Bankuser;
m_pITableFrame->SendTableData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart));
}
m_pITableFrame->SendLookonData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart));
}
bicount=0;
//设置定时器
//m_pITableFrame->SetGameTimer(IDI_BIPAITIME,30000L,1,NULL);
return true;
}
以下为CMD_S_GameStart结构的定义
//游戏开始
struct CMD_S_GameStart
{

LONG lMaxGold; //最大下注
LONG lTurnMaxGold; //最大下注
LONG lTurnBasicGold; //最少下注
BYTE bCardData[GAME_PLAYER][4]; //用户扑克
};
客户端在接收到SUB_S_GAME_START消息后做如下处理
//网络消息
bool CGameClientDlg::OnGameMessage(WORD wSubCmdID, const void * pBuffer, WORD wDataSize)
{
switch (wSubCmdID)
{
case SUB_S_GAME_START: //游戏开始
{
return OnSubGameStart(pBuffer,wDataSize);
}
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;
//游戏变量

memset(m_szName,0,sizeof(m_szName));
memset(m_bPlayStatus,0,sizeof(m_bPlayStatus));
//辅助变量
m_lGoldShow=0L;
m_bShowHand=false;
m_bMeAddGold=false;
//变量定义
WORD wMeChairID=GetMeChairID();
bool bLookonMode=IsLookonMode();
LONG lBaseGold=m_GameClientView.m_lBasicGold;
//游戏变量
m_lTurnMaxGold=pGameStart->lTurnMaxGold;
m_lTurnBasicGold=pGameStart->lTurnBasicGold;
//设置状态
SetGameStatus(GS_PLAYING);
//设置界面
BYTE bCardData[4];
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=TRUE;

CopyMemory(bCardData,pGameStart->bCardData,sizeof(BYTE)*4);
m_GameClientView.m_CardControl[wViewChairID].SetCardData(bCardData,4);
if (wMeChairID==i)
m_GameClientView.m_CardControl[wViewChairID].SetDisplayFlag(true);
m_GameClientView.SetUserGoldInfo(wViewChairID,false,0L);
m_GameClientView.SetUserGoldInfo(wViewChairID,true,lBaseGold);
lstrcpyn(m_szName,pUserData->szName,CountArray(m_szName));
}
else
{
m_bPlayStatus=FALSE;
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].SetPositively(true);
}
if (bLookonMode==false)
m_GameClientView.m_btFenpai.ShowWindow(SW_SHOW);
//设置控制
if ((bLookonMode==false))
{
m_bMeAddGold=true;

}
//设置定时器
SetGameTimer(wMeChairID,IDI_FENPAI_TIME,30);
PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_START"));
return true;
}
以下为对扑克的处理
m_GameClientView.m_CardControl[wViewChairID].SetCardData(bCardData,4);
if (wMeChairID==i)
m_GameClientView.m_CardControl[wViewChairID].SetDisplayFlag(true);
接受到扑克数据,赋值给扑克控件,并显示自己的扑克
下一节讲对分牌的处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: