📄 tableframesink.cpp
字号:
}
}
//发送场景
return m_pITableFrame->SendGameScene(pIServerUserItem,&StatusPlay,sizeof(StatusPlay));
}
}
//效验结果
ASSERT(FALSE);
return false;
}
//定时器事件
bool __cdecl CTableFrameSink::OnTimerMessage(WORD wTimerID, WPARAM wBindParam)
{
switch (wTimerID)
{
case IDI_GAME_END: //游戏结束
{
if (m_pITableFrame->GetGameStatus()==GS_PLAYING)
{
OnEventGameEnd(INVALID_CHAIR,NULL,m_cbGameEndReason);
return true;
}
}
case IDI_PASS_CARD:
{
if ((wBindParam==m_wCurrentUser)&&(m_wCurrentUser!=INVALID_CHAIR))
{
//获取用户
IServerUserItem * pIServerUserItem=m_pITableFrame->GetServerUserItem(m_wCurrentUser);
//用户判断
if ((pIServerUserItem!=NULL)&&(pIServerUserItem->GetUserStatus()!=US_OFFLINE))
{
//OnUserGiveUp(m_wCurrentUser);
//test
m_pITableFrame->SetGameTimer(IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser);
//end test
}
else m_pITableFrame->SetGameTimer(IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser);
return true;
}
}
}
return false;
}
//游戏消息处理
bool __cdecl CTableFrameSink::OnGameMessage(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
switch (wSubCmdID)
{
case SUB_C_ADD_GOLD: //用户加注
{
//效验数据
tagServerUserData * pUserData=pIServerUserItem->GetUserData();
if (pUserData->cbUserStatus!=US_PLAY) return true;
if (m_cbPlayStatus[pUserData->wChairID]==FALSE) return true;
//消息处理
CMD_C_AddGold * pAddGold=(CMD_C_AddGold *)pDataBuffer;
OnUserAddGold(pUserData->wChairID,pAddGold->lGold,false);
return true;
}
case SUB_C_GIVE_UP: //用户放弃
{
//效验数据
tagServerUserData * pUserData=pIServerUserItem->GetUserData();
if (pUserData->cbUserStatus!=US_PLAY) return true;
if (m_cbPlayStatus[pUserData->wChairID]==FALSE) return true;
//消息处理
OnUserGiveUp(pUserData->wChairID);
return true;
}
}
return false;
}
//框架消息处理
bool __cdecl CTableFrameSink::OnFrameMessage(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
return false;
}
//放弃事件
bool CTableFrameSink::OnUserGiveUp(WORD wChairID)
{
//状态判断
ASSERT(m_cbPlayStatus[wChairID]==TRUE);
if (m_cbPlayStatus[wChairID]==FALSE) return false;
//效验
if( m_bGameEnd )
{
m_pITableFrame->KillGameTimer(IDI_GAME_END);
return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
}
//设置数据
m_cbPlayStatus[wChairID]=FALSE;
m_cbCardCount[wChairID]=0;
//重新获取最大下注
if( m_lUserScore[wChairID] == m_lMaxGold )
{
for( WORD i = 0; i < GAME_PLAYER; i ++ )
{
if( !m_cbPlayStatus[i] ) continue;
m_lMaxGold = m_lUserScore[i];
break;
}
for( ; i < GAME_PLAYER; i++ )
{
if( m_cbPlayStatus[i] )
m_lMaxGold = __min(m_lMaxGold,m_lUserScore[i]);
}
}
m_lTurnMaxGold = m_bSendCardCount>=3?m_lMaxGold:m_lMaxGold/2L;
//发送放弃消息
CMD_S_GiveUp GiveUp;
GiveUp.wUserChairID=wChairID;
GiveUp.lTurnMaxGold = m_lTurnMaxGold;
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));
//变量定义
LONG lScore=0;
LONG lRevenue=0;
enScoreKind ScoreKind;
//设置变量
ScoreKind=enScoreKind_Lost;
lScore=-m_lTableGold[wChairID*2]-m_lTableGold[wChairID*2+1];
//用户写分
m_pITableFrame->WriteUserScore(wChairID,lScore,lRevenue,ScoreKind);
//判断结束
WORD wPlayerCount=0;
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_cbPlayStatus[i]==TRUE) wPlayerCount++;
}
if (wPlayerCount>=2)
{
if (m_wCurrentUser==wChairID) OnUserAddGold(wChairID,0L,true);
}
else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NO_PLAYER);
return true;
}
//加注事件
bool CTableFrameSink::OnUserAddGold(WORD wChairID, LONG lGold, bool bCancel)
{
//效验
if( m_bGameEnd )
{
m_pITableFrame->KillGameTimer(IDI_GAME_END);
return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
}
//设置数据
if (bCancel==false)
{
//效验数据
ASSERT(m_wCurrentUser==wChairID);
if (m_wCurrentUser!=wChairID) return false;
ASSERT( !m_bShowHand && lGold >= m_lTurnBasicGold && lGold <= m_lTurnMaxGold
|| lGold+m_lTableGold[wChairID*2+1]==m_lUserScore[wChairID] );
if( (m_bShowHand || lGold < m_lTurnBasicGold || lGold > m_lTurnMaxGold)
&& lGold+m_lTableGold[wChairID*2+1]!=m_lUserScore[wChairID] )
return false;
m_lTableGold[wChairID*2]=lGold;
if( !m_bShowHand && m_lTableGold[wChairID*2]+m_lTableGold[wChairID*2+1] == m_lUserScore[wChairID] )
m_bShowHand = true;
}
//操作次数
bool bFinishTurn=false;
WORD wNextUser=INVALID_CHAIR;
for (WORD i=0;i<m_wPlayerCount-1;i++)
{
m_wOperaCount++;
wNextUser=(m_wCurrentUser+i+1)%m_wPlayerCount;
if (m_cbPlayStatus[wNextUser]==TRUE) break;
}
//判断下注
if (m_wOperaCount>=m_wPlayerCount)
{
LONG lTableGold=0L;
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_cbPlayStatus[i]==TRUE)
{
lTableGold=m_lTableGold[i*2];
break;
}
}
while (i<m_wPlayerCount)
{
if (m_cbPlayStatus[i]==TRUE)
{
if( !m_bShowHand&&m_lTableGold[i*2]!=lTableGold ||
m_bShowHand&&m_lTableGold[i*2]+m_lTableGold[i*2+1]<m_lUserScore[i] )
break;
}
i++;
}
if (i==m_wPlayerCount) bFinishTurn=true;
}
//一轮判断
if (bFinishTurn==true)
{
//发送数据
CMD_S_AddGold GoldResult;
GoldResult.lCurrentLessGold=0L;
GoldResult.wLastChairID=wChairID;
GoldResult.wCurrentUser=INVALID_CHAIR;
GoldResult.lLastAddGold=m_lTableGold[wChairID*2];
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult));
//累计金币
for (WORD i=0;i<m_wPlayerCount;i++)
{
m_lTableGold[i*2+1]+=m_lTableGold[i*2];
m_lTableGold[i*2]=0L;
}
//开始一轮
if (m_bSendCardCount<5)
{
//设置变量
m_wOperaCount=0;
m_lTurnBasicGold=0L;
WORD wLastMostUser = EstimateWinner(1,m_bSendCardCount-1);
BYTE bySourceCount = m_bSendCardCount;
if( m_bShowHand ) m_bSendCardCount = MAX_COUNT;
else m_bSendCardCount++;
//发送扑克
CMD_R_SendCard SendCard;
ZeroMemory( &SendCard,sizeof(SendCard) );
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_cbPlayStatus[i]==FALSE) continue;
m_cbCardCount[i]=m_bSendCardCount;
//派发扑克
for (BYTE j=0;j<(m_bSendCardCount-bySourceCount);j++)
{
ASSERT(j<CountArray(SendCard.bUserCard[i]));
SendCard.bUserCard[i][j]=m_cbHandCardData[i][bySourceCount+j];
}
}
m_wCurrentUser=EstimateWinner(1,m_bSendCardCount-1);
m_lTurnMaxGold = m_bSendCardCount>=3?m_lMaxGold:m_lMaxGold/2L;
//发送消息
SendCard.wCurrentUser=(m_bShowHand?INVALID_CHAIR:m_wCurrentUser);
SendCard.wStartChairId = wLastMostUser;
SendCard.cbSendCardCount = m_bSendCardCount-bySourceCount;
SendCard.lMaxGold=m_lTurnMaxGold;
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
//结束游戏
if ( m_bSendCardCount == 5 && m_lMaxGold <= m_lTableGold[m_wCurrentUser*2+1] )
{
m_bGameEnd = true;
m_cbGameEndReason = GER_NORMAL;
m_pITableFrame->SetGameTimer(IDI_GAME_END,3000,1,0);
}
}
else
{
m_bGameEnd = true;
m_cbGameEndReason = GER_NORMAL;
m_pITableFrame->SetGameTimer(IDI_GAME_END,2000,1,0);
}
}
else
{
//设置变量
m_wCurrentUser=wNextUser;
m_lTurnBasicGold=__max(m_lTableGold[wChairID*2],m_lTurnBasicGold);
//发送数据
CMD_S_AddGold AddGold;
AddGold.wLastChairID=wChairID;
AddGold.wCurrentUser=m_wCurrentUser;
AddGold.lCurrentLessGold=m_lTurnBasicGold;
AddGold.lLastAddGold=m_lTableGold[wChairID*2];
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold));
}
if( m_wCurrentUser != INVALID_CHAIR )
m_pITableFrame->SetGameTimer( IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser );
return true;
}
//推断胜者
WORD CTableFrameSink::EstimateWinner(BYTE cbStartPos, BYTE cbConcludePos)
{
//保存扑克
BYTE cbUserCardData[GAME_PLAYER][MAX_COUNT];
CopyMemory(cbUserCardData,m_cbHandCardData,sizeof(cbUserCardData));
//寻找玩家
for (WORD wWinner=0;wWinner<GAME_PLAYER;wWinner++)
{
if (m_cbPlayStatus[wWinner]==TRUE)
{
m_GameLogic.SortCardList(cbUserCardData[wWinner]+cbStartPos,cbConcludePos-cbStartPos+1);
break;
}
}
//对比玩家
WORD wId = wWinner;
for (WORD i=0;i<GAME_PLAYER-1;i++)
{
wId = (wId+1)%GAME_PLAYER;
//用户过滤
if (m_cbPlayStatus[wId]==FALSE) continue;
//排列扑克
m_GameLogic.SortCardList(cbUserCardData[wId]+cbStartPos,cbConcludePos-cbStartPos+1);
//对比扑克
if (m_GameLogic.CompareCard(cbUserCardData[wId]+cbStartPos,cbUserCardData[wWinner]+cbStartPos,cbConcludePos-cbStartPos+1)==true)
{
wWinner=wId;
}
}
return wWinner;
}
//////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -