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

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

2010-08-11 20:42 232 查看
当所有玩家下注结束进行比牌处理:

服务器端
//比牌事件
bool CTableFrameSink::OnBiPaiCard(BYTE bitwince)
{

for (WORD i=0;i<m_wPlayerCount;i++)
{

//没分牌自动分
if (m_bTableCardFenArray[0][0]==0)
{
memcpy(m_bTableCardFenArray[0],&m_bTableCardArray[0],2);
memcpy(m_bTableCardFenArray[1],&m_bTableCardArray[2],2);

}
}
WORD wWinerUser=DeduceWiner(0,1,bitwince);
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (i==wWinerUser)
bBoolWin[bitwince]=true;
else
bBoolWin[bitwince]=false;

}
CMD_S_GAMEBI gamebi;
memset(&gamebi,0,sizeof(CMD_S_GAMEBI));
for (WORD i=0;i<m_wPlayerCount;i++)
{

memcpy(gamebi.bfCardData,m_bTableCardFenArray[0],sizeof(m_bTableCardFenArray[0]));
memcpy(gamebi.bnCardData,m_bTableCardFenArray[1],sizeof(m_bTableCardFenArray[1]));
memcpy(gamebi.bBoolWin,bBoolWin,sizeof(bBoolWin));
}

gamebi.bCardTwice=bitwince;
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_BI_CARD,&gamebi,sizeof(gamebi));
m_firstwinder=wWinerUser;
bicount=1;
//设置定时器
m_pITableFrame->SetGameTimer(IDI_BIPAITIME,1000L,1,NULL);
return true;
}

//二次比牌事件
bool CTableFrameSink::OnBiPaiTwoCard(BYTE bitwince)
{

for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_pITableFrame->GetServerUserItem(i)!=NULL)
{
if (i!=m_firstwinder)
{
if (m_GameLogic.CompareCard(m_bTableCardFenArray[1],m_bTableCardFenArray[m_firstwinder][1],2)==true)
bBoolWin[bitwince]=true;
else
bBoolWin[bitwince]=false;
}
}
}

CMD_S_GAMEBI gamebi;
memset(&gamebi,0,sizeof(CMD_S_GAMEBI));
for (WORD i=0;i<m_wPlayerCount;i++)
{

memcpy(gamebi.bfCardData,m_bTableCardFenArray[0],sizeof(m_bTableCardFenArray[0]));
memcpy(gamebi.bnCardData,m_bTableCardFenArray[1],sizeof(m_bTableCardFenArray[1]));
memcpy(gamebi.bBoolWin,bBoolWin,sizeof(bBoolWin));
}

gamebi.bCardTwice=bitwince;
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_BI_CARD,&gamebi,sizeof(gamebi));

m_pITableFrame->SetGameTimer(IDI_GAMEEND,3000L,1,NULL);

return true;
}

比牌进行两次,先对比小牌,小牌中的赢家再和其它3家对比大牌,两次都赢才为赢,否则为合
//对比扑克
bool CGameLogic::CompareCard(BYTE bFirstList[], BYTE bNextList[], BYTE bCardCount)
{
//获取类型
BYTE bNextType=GetCardType(bNextList,bCardCount);
BYTE bFirstType=GetCardType(bFirstList,bCardCount);
//两手牌的最大值
BYTE FirstMaxValue=GetMaxValue(bFirstList);
BYTE NextMaxValue=GetMaxValue(bNextList);
//两手牌的最小值
BYTE FirstMinValue=GetMinValue(bFirstList);
BYTE NextMinValue=GetMinValue(bNextList);
//最大牌的花色
// BYTE FirstColor=GetMaxColor(bFirstList);
// BYTE NextColor=GetMaxColor(bNextList);
stCardType sFirstCard,sNextCard;
sFirstCard=GetCardLevel(bFirstList);
sNextCard=GetCardLevel(bNextList);
if(sFirstCard.nLevel==sNextCard.nLevel)
{
if(sFirstCard.nCardType==CT_SINGLE && sNextCard.nCardType==CT_SINGLE)
{
BYTE FirstTotalValue=(GetCardLogicValue(bFirstList[0])+GetCardLogicValue(bFirstList[1]))%10;
BYTE NextTotalValue=(GetCardLogicValue(bNextList[0])+GetCardLogicValue(bNextList[1]))%10;
if(FirstTotalValue==NextTotalValue)
{

return true;
}
else
{
return FirstTotalValue>NextTotalValue;
}
}
else
{
return sFirstCard.nCardType>sNextCard.nCardType;//对

}
}
else
{
return sFirstCard.nLevel<sNextCard.nLevel ? true: false;
}

return false;
}
比牌之后游戏结束
{
//定义变量
CMD_S_GameEnd GameEnd;
memset(&GameEnd,0,sizeof(GameEnd));
tagScoreInfo ScoreInfo[m_wPlayerCount];
memset(&ScoreInfo,0,sizeof(ScoreInfo));
LONG lTax=0L;

for (WORD i=0;i<m_wPlayerCount;i++)
{

pIServerUserItem=m_pITableFrame->GetServerUserItem(i);
if (pIServerUserItem!=NULL && bBoolgiveup==false)
{
//积分信息
if (i!=m_firstwinder)
{
if (bBoolWin[0]==false && bBoolWin[1]==false)
{
Bankuser=m_firstwinder;
GameEnd.lGameGold-=(m_lTableGold[i*2]+m_pGameServiceOption->lCellScore);
GameEnd.lGameGold[m_firstwinder]=GameEnd.lGameGold[m_firstwinder]-GameEnd.lGameGold+GameEnd.lGameGold*m_pITableFrame->GetTableShuilv()/100L;
lTax=lTax-GameEnd.lGameGold*m_pITableFrame->GetTableShuilv()/100L;
}
else
{
}
}

}

}

for (WORD i=0;i<m_wPlayerCount;i++)
{

pIServerUserItem=m_pITableFrame->GetServerUserItem(i);
if (pIServerUserItem!=NULL && bBoolgiveup==true)
{
GameEnd.lGameGold-=m_pGameServiceOption->lCellScore;
if (GameEnd.lGameGold[m_firstwinder]!=0)
{
GameEnd.lGameGold[m_firstwinder]+=(m_pGameServiceOption->lCellScore-m_pGameServiceOption->lCellScore*m_pITableFrame->GetTableShuilv()/100L);
lTax=lTax+m_pGameServiceOption->lCellScore*m_pITableFrame->GetTableShuilv()/100L;
}

}

}

GameEnd.lTax=lTax;

ScoreInfo[m_firstwinder].lRevenue=lTax;

//发送信息
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
//修改用户分数
for (WORD i=0;i<m_wPlayerCount;i++)
{
pIServerUserItem=m_pITableFrame->GetServerUserItem(i);
if (pIServerUserItem!=NULL)
{
if (m_bPlayStatus==TRUE)
{
ScoreInfo.lScore=GameEnd.lGameGold;
ScoreInfo.ScoreKind=(GameEnd.lGameGold>0L)?enScoreKind_Win:enScoreKind_Lost;
m_pITableFrame->WriteUserScore(i,ScoreInfo.lScore ,ScoreInfo.lRevenue ,ScoreInfo.ScoreKind);
}
}

}

//结束游戏
m_pITableFrame->ConcludeGame();
return true;

客户端收到游戏结束消息后进行如下处理

//游戏结束
bool CGameClientDlg::OnSubGameEnd(const void * pBuffer, WORD wDataSize)
{
//效验参数
if (wDataSize!=sizeof(CMD_S_GameEnd)) return false;
CMD_S_GameEnd * pGameEnd=(CMD_S_GameEnd *)pBuffer;
//播放声音
if (IsLookonMode()==false)
{
if (pGameEnd->lGameGold[GetMeChairID()]>0L) PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WIN"));
else PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_LOST"));
}
else PlayGameSound(GetModuleHandle(NULL),TEXT("GAME_END"));
//游戏正常结束
BYTE bCardData[5];
m_GameClientView.m_ScoreView.ResetScore();
for (WORD i=0;i<GAME_PLAYER;i++)
{
//设置信息
const tagUserData * pUserData=GetUserData(i);

if (pUserData!=NULL)
m_GameClientView.m_ScoreView.SetGameScore(pUserData->wChairID,pUserData->szName,pGameEnd->lGameGold);
}
m_GameClientView.m_ScoreView.SetTax(pGameEnd->lTax);
m_GameClientView.m_ScoreView.ShowWindow(SW_SHOW);
//设置控件
KillGameTimer(IDI_GIVE_UP);

//设置状态
SetGameStatus(GS_FREE);
//游戏变量
m_lTurnMaxGold=0L;
m_lTurnBasicGold=0L;
memset(m_bPlayStatus,0,sizeof(m_bPlayStatus));
//辅助变量
m_lGoldShow=0L;
m_bShowHand=false;
m_bMeAddGold=false;
memset(m_szName,0,sizeof(m_szName));
//设置界面
if (IsLookonMode()==false)
{
m_GameClientView.m_btStart.ShowWindow(SW_SHOW);
m_GameClientView.m_btStart.SetFocus();
//SetGameTimer(GetMeChairID(),IDI_START_GAME,30);
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: