⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientgamedlg.cpp

📁 添七,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				int iCardCount[4];
				for(int i = 0;i < 4;i++)
				{
					if (m_pUserInfo[i] != NULL)
					{
						::strcpy(szName[i],m_pUserInfo[i]->GameUserInfo.szName);
						iCardCount[i] = (int)pPlayInfo->iCardCnt[i];
					}
				}
				
				
				m_PlayView.m_StationView.SetUserPlayInfo(szName,pPlayInfo->iScore,iCardCount,TRUE);
				return true;
			}

		}
	}
	//else if ((pNetHead->bMainID==MDM_GAME_ACTION)&&(pNetHead->bAssistantID==ASS_GAME_LEFT))
	//{
	//	//用户离开判断
	//	if (uDataSize!=sizeof(GameLeftStruct)) return FALSE;
	//	GameLeftStruct * pUserLeft=(GameLeftStruct *)pNetHead;
	//	if ((GetStationParameter()==GS_WAIT_ARGEE)&&(pUserLeft->bDeskStation==0))
	//	{
	//		for (int i=0;i<4;i++) m_PlayView.SetArgee(i,FALSE);
	//		if (m_PlayView.m_GameInfo.GetSafeHwnd()) m_PlayView.m_GameInfo.DestroyWindow();
	//		m_PlayView.m_GameNoteView.SetMessage(TEXT("正在等待东家设置牌局"));
	//	}
	//}
	return __super::HandleGameMessage(pNetHead,pNetData,uDataSize,pClientSocket);
}

//重新设置界面
void CClientGameDlg::ResetGameFrame()
{
	m_bTimeOutCount=0;
	m_iMeCardCount=0;
	m_iNtCount=0;
	m_iNtPeopole=-1;
	m_iNowOutPeople=-1;
	m_iBaseCount=0;
	m_iFirstOutPeople=-1;
	m_iLastCardCount=0;
	m_bShowLast=FALSE;
	::memset(m_iBackCard,0,sizeof(m_iBackCard));
	::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));

	::memset(m_iUserJiaoFen,0,sizeof(m_iUserJiaoFen));

	//界面重置
	m_PlayView.m_btGiveBack.ShowWindow(SW_HIDE);
	m_PlayView.m_btOutCard.ShowWindow(SW_HIDE);
	m_PlayView.m_btPass.ShowWindow(SW_HIDE);
	m_PlayView.m_NtList.ShowWindow(SW_HIDE);
	m_PlayView.m_btLastTurn.EnableWindow(FALSE);
	m_PlayView.m_btBackCard.EnableWindow(FALSE);
//	m_PlayView.m_btThing.EnableWindow(FALSE);
	m_PlayView.m_StationView.SetShowMessage(FALSE);
	m_PlayView.SetGamePoint();
	m_PlayView.SetNTStation(-1);
	m_PlayView.SetShowNtStation(-1,0);
	m_PlayView.m_MeCard.SetCard(NULL,NULL,0);
	m_PlayView.m_GameNoteView.SetMessage(NULL);
	for (int i=0;i<4;i++)
	{
		m_PlayView.m_UserCard[i].SetCard(NULL,NULL,0);
	}
	if (m_PlayView.m_GameInfo.GetSafeHwnd()) m_PlayView.m_GameInfo.DestroyWindow();
	if (m_PlayView.m_BackCardDlg.GetSafeHwnd()) m_PlayView.m_BackCardDlg.DestroyWindow();
	if (m_PlayView.m_HaveThing.GetSafeHwnd()) m_PlayView.m_HaveThing.DestroyWindow();
	if (m_PlayView.m_ThingMessage.GetSafeHwnd()) m_PlayView.m_ThingMessage.DestroyWindow();
	if (m_PlayView.m_GameSet.GetSafeHwnd()) m_PlayView.m_GameSet.DestroyWindow();
//	if (m_PlayView.m_GameEndView.GetSafeHwnd()) m_PlayView.m_GameEndView.DestroyWindow();
	return __super::ResetGameFrame();
}

//开始按钮函数
LRESULT	CClientGameDlg::OnHitBegin(WPARAM wparam, LPARAM lparam)
{
	OnControlHitBegin();
	return 0;
}

bool CClientGameDlg::OnControlHitBegin()
{
	if ((GetStationParameter()==GS_WAIT_SETGAME)&&(GetMeUserInfo()->bDeskStation==0))
	{
		tagGameSetInfo * pGameSet=m_PlayView.m_GameSet.GetGameSetInfo();
		if (pGameSet!=NULL)
		{
			UserArgeeGame Agree;
			Agree.iBeginStation=pGameSet->iBeginStation;
			Agree.iEndStation=pGameSet->iEndStation;
			Agree.iPlayCount=pGameSet->iPlayCount;
			Agree.iCardCount=pGameSet->iCardCount;
			SendGameData(&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_GM_AGREE_GAME,0);
		}
		m_PlayView.m_btContinue.ShowWindow(SW_HIDE);
	}
	else if ((GetStationParameter()==GS_WAIT_NEXT)||(GetStationParameter()==GS_WAIT_ARGEE))
	{
		m_PlayView.m_btContinue.ShowWindow(SW_HIDE);
		SendGameData(MDM_GM_GAME_NOTIFY,ASS_GM_AGREE_GAME,0);
	}
	KillAllTimer();
	m_PlayView.m_StationView.CleanAllInfo(FALSE);
	m_PlayView.m_StationView.m_iTurePoint=0;
	ResetGameStation(RS_GAME_BEGIN);
	return true;
}
//NT 按钮函数
LRESULT	CClientGameDlg::OnHitNt(WPARAM wparam, LPARAM lparam)
{
	ClientNtStruct NtCard;
	int iNtNum=m_Logic.GetNTCardNum();

	NtCard.iHuaKind=(int)wparam;
	NtCard.iCardCount=0;
	for (int i=0;i<m_iMeCardCount;i++)
	{
		if ((m_Logic.GetCardNum(m_iMeCardList[i])==iNtNum)&&
			(m_Logic.GetCardHuaKind(m_iMeCardList[i],TRUE)==(BYTE)wparam))
		{
			NtCard.iCardCount++;
		}
	}
	if(NtCard.iCardCount==m_nJiaoZu)
	{
		return 0;
	}
	m_nJiaoZu=NtCard.iCardCount;

	SendGameData(&NtCard,sizeof(NtCard),MDM_GM_GAME_NOTIFY,ASS_NT_CARD,0);

	return 0;
}

//更新反牌控件
BOOL CClientGameDlg::UpdateNtList()
{
	return TRUE;
}

//清除所有定时器
void CClientGameDlg::KillAllTimer()
{
	KillTimer(ID_BEGIN_TIME);
	KillTimer(ID_WAIT_ROB);
	KillTimer(ID_GIVE_BACK);
	KillTimer(ID_OUT_CARD);
	KillTimer(ID_SHOW_CARD);
	return;
}

//定时器消息
bool CClientGameDlg::OnClock(BYTE bDeskStation, UINT uTimeID, UINT uTimeCount)
{
	switch (uTimeID)
	{
	case ID_BEGIN_TIME:	//继续游戏定时器
		{
			if (uTimeCount<=1)
			{
				//时间到了
				OnHitBegin(0,0);
				return true;
			}
			if (uTimeCount<=10) 
			{
				if(m_pGameInfo->bEnableSound)
					PlaySound("tml\\Warning.wav",NULL,SND_ASYNC|SND_FILENAME);
			}

			return true;
		}
	case ID_WAIT_ROB:	//抢底牌
		{
			int iViewStation=ViewStation(bDeskStation);
			if (uTimeCount<=1)
			{
				//时间到了
				if (m_bWatchMode==FALSE) m_PlayView.m_NtList.ShowWindow(SW_HIDE);
				return true;
			}
			return true;
		}
	case ID_GIVE_BACK:	//留底牌
		{
			int iViewStation=ViewStation(bDeskStation);
			if (uTimeCount<=1)
			{
				//时间到了
				/*if ((m_bWatchMode==FALSE)&&m_PlayView.m_btGiveBack.IsWindowVisible())
				{
					BackCardStruct BackCard;
					BackCard.iBackCardCount=((m_iPalyCardCount==2)?8:6);
					::CopyMemory(BackCard.iBackCard,&m_iMeCardList[m_iMeCardCount-BackCard.iBackCardCount],
								 sizeof(BYTE)*BackCard.iBackCardCount);
					m_PlayView.m_btGiveBack.EnableWindow(FALSE);
					m_PlayView.m_btGiveBack.ShowWindow(SW_HIDE);
					SendGameData(&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD,0);
				}*/
				return true;
			}
			if ((uTimeCount<=10)&&(m_bWatchMode==FALSE)&&(GetMeUserInfo()->bDeskStation==m_iNtPeopole)) 
			{
				if(m_pGameInfo->bEnableSound)
					PlaySound("tml\\Warning.wav",NULL,SND_ASYNC|SND_FILENAME);
			}
			return true;
		}
	case ID_OUT_CARD:	//出牌
		{
			int iViewStation=ViewStation(bDeskStation);
			if (uTimeCount<=1)	//时间到了
			{
				//判断超时
				if((m_iNowOutPeople==GetMeUserInfo()->bDeskStation) && (m_bWatchMode==FALSE))
					m_bTimeOutCount++;
				if (m_bTimeOutCount>5 && (m_iNowOutPeople==GetMeUserInfo()->bDeskStation) && (m_bWatchMode==FALSE))
				{
					KillClock(0);
					SendGameData(MDM_GM_GAME_FRAME,ASS_GM_FORCE_QUIT,0);
					SendGameData(MDM_GR_USER_ACTION,ASS_GR_USER_UP,0);
					AFCMessage(TEXT("超时次数太多,游戏结束!"),m_pGameInfo->szGameName,MB_ICONQUESTION,this);
					PostMessage(WM_CLOSE,0,0);
					return false;
				}
				else if(m_iNowOutPeople==GetMeUserInfo()->bDeskStation && !m_bWatchMode)
				{
					CString str;
					str.Format("请注意,你已经超时 %d 次了,超时五次会当做逃跑处理。",m_bTimeOutCount);
					m_MessageHandle.InsertNormalMessage(str.GetBuffer(MAX_PATH));
				}

				if ((m_iNowOutPeople==GetMeUserInfo()->bDeskStation)&&(m_bWatchMode==FALSE))
				{
						
						if (IsFirstOutCard)
						{
							OutCardStruct OutCard;
							m_iOutFlag = m_Logic.AutoOutCard(m_iMeCardList,m_iMeCardCount,m_iBaseOutList,m_iBaseOutListCount,OutCard.iCardList,
												OutCard.iCardCount,TRUE);
						
							m_PlayView.m_btOutCard.ShowWindow(SW_HIDE);
							SendGameData(&OutCard,sizeof(OutCard)-sizeof(OutCard.iCardList)+sizeof(BYTE)*OutCard.iCardCount,
					  						MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
							return true;
						}
						else
						{
							OutCardStruct OutCard;
							m_iOutFlag = m_Logic.AutoOutCard(m_iMeCardList,m_iMeCardCount,m_iBaseOutList,m_iBaseOutListCount,OutCard.iCardList,
												OutCard.iCardCount,FALSE);
							
							m_PlayView.m_btOutCard.ShowWindow(SW_HIDE);
							if (m_iOutFlag == 2)
							{
								SendGameData(&OutCard,sizeof(OutCard)-sizeof(OutCard.iCardList)+sizeof(BYTE)*OutCard.iCardCount,
												MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,m_iOutFlag);
								
								return true;
							}

							SendGameData(&OutCard,sizeof(OutCard)-sizeof(OutCard.iCardList)+sizeof(BYTE)*OutCard.iCardCount,
					  						MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
							return true;
						}
				}
				return true;
			}
			if ((uTimeCount<=6)&&(m_bWatchMode==FALSE)&&(iViewStation==2)) 
			{
				if(m_pGameInfo->bEnableSound)
					PlaySound("tml\\Warning.wav",NULL,SND_ASYNC|SND_FILENAME);
			}
			return true;
		}
	case ID_SHOW_LAST:	//查看上一轮扑克
		{
			m_bShowIngLast=FALSE;
			for (int i=0;i<3;i++)
				m_PlayView.m_UserCard[ViewStation(i)].SetCard(m_DeskCard[i],NULL,m_iDeskCardCount[i]);
			return true;
		}
	case ID_SHOW_CARD:	//甩牌失败
		{
			int iViewStation=ViewStation(bDeskStation);
			if (uTimeCount==2)	//复原扑克
			{
				//上一轮数据
				if (m_bShowIngLast)
				{
					m_bShowIngLast=FALSE;
					KillTimer(ID_SHOW_LAST);
					for (int i=0;i<3;i++) m_PlayView.m_UserCard[ViewStation(i)].SetCard(NULL,NULL,NULL);
				}

				//恢复扑克
				m_PlayView.m_UserCard[iViewStation].SetCard(m_DeskCard[m_iFirstOutPeople],
					NULL,m_iDeskCardCount[m_iFirstOutPeople]);
				if (m_iFirstOutPeople==GetMeUserInfo()->bDeskStation) 
					m_PlayView.m_MeCard.SetCard(m_iMeCardList,NULL,m_iMeCardCount);
			}
			if (uTimeCount<=1)
			{
				//时间到了
				m_iNowOutPeople=(m_iFirstOutPeople+1)%4;

				//显示出牌按钮
				if ((m_iNowOutPeople==GetMeUserInfo()->bDeskStation)&&(m_bWatchMode==FALSE))
				{
					m_PlayView.m_btOutCard.ShowWindow(SW_SHOW);
					OnHitCard(0,0);
				}
				SetClock(m_iNowOutPeople,m_iLessCount,ID_OUT_CARD);
				return true;
			}
			return true;
		}
	}
	return true;
}

//按动扑克按钮函数
LRESULT	CClientGameDlg::OnHitCard(WPARAM wparam, LPARAM lparam)
{
	///if ((GetStationParameter()==GS_WAIT_BACK)&&(m_PlayView.m_btGiveBack.IsWindowVisible()))	//留底牌状态
	{
		///m_PlayView.m_btGiveBack.EnableWindow(m_PlayView.m_MeCard.GetUpCard(NULL)==((m_iPalyCardCount==2)?8:6));
	}
	///else if (GetStationParameter()==GS_PLAY_GAME)	//出牌状态

	if (GetStationParameter()==GS_PLAY_GAME)	//出牌状态
	{
		//验证出牌信息
		BYTE iUpCard[39];
		if (m_iNowOutPeople!=GetMeUserInfo()->bDeskStation) return 0;
		int iCardCount=m_PlayView.m_MeCard.GetUpCard(iUpCard);
	
		//出牌数目判断
		if (iCardCount==0)
		{
			m_PlayView.m_btOutCard.EnableWindow(FALSE);
			return 0;
		}

			//验证是否可以出这样的扑克
		if (IsFirstOutCard)////m_iLastOutPeople < 0)	///GetMeUserInfo()->bDeskStation)	//第一个出牌者
		{	
			m_PlayView.m_btOutCard.EnableWindow(m_Logic.GetCardShape(iUpCard,iCardCount)!=UG_ERROR_KIND);

		
		}
		else	//随后出牌者 
		{	
			
			////AfxMessageBox("随后出牌者");
			m_iOutFlag = m_Logic.CanOutCard(iUpCard,iCardCount,m_iBaseOutList,m_iBaseOutListCount,m_iMeCardList,m_iMeCardCount);
			m_PlayView.m_btOutCard.EnableWindow((m_iOutFlag != 0 ? TRUE : FALSE));////m_Logic.CanOutCard(iUpCard,iCardCount,m_iBaseOutList,
												////m_iBaseOutListCount,m_iMeCardList,m_iMeCardCount));
			CString s;
			s.Format("%d",m_iOutFlag);
			////AfxMessageBox(s);

			
		}
	}

	return 0;
}

//留底牌按钮函数
LRESULT	CClientGameDlg::OnHitBackCard(WPARAM wparam, LPARAM lparam)
{
	KillAllTimer();
	BackCardStruct BackCard;
	m_PlayView.m_MeCard.GetUpCard(BackCard.iBackCard);
	m_PlayView.m_MeCard.RemoveUpCard();
	m_PlayView.m_btGiveBack.EnableWindow(FALSE);
	m_PlayView.m_btGiveBack.ShowWindow(SW_HIDE);
	BackCard.iBackCardCount=((m_iPalyCardCount==2)?8:6);
	SendGameData(&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD,0);

	return 0;	
}

LRESULT	CClientGameDlg::OnRightHitCard(WPARAM wparam, LPARAM lparam)
{
	if(!m_PlayView.m_bRightPower)
		OnHitOutCard(0,0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -