UE4 局域网斗地主(四)

本文介绍了UE4局域网斗地主游戏中出牌的流程,包括C++中出牌逻辑的接口和数据转换函数。在出牌逻辑中,详细解释了不同情况下的出牌结果,并提供了控制出牌玩家的接口。文章还展示了出牌的示例流程和服务器日志,以及下一步将要讨论的牌型判断算法。
摘要由CSDN通过智能技术生成
上一篇文章中,出现一个问题:客户端玩家新加入session的时候,如果马上点加入房间会出现不能同步的问题,原因是玩家新加入的时候建立连接是需要时间的,在这过程中,RPC函数还未启动,所以解决方法是,加入session后,延迟一段时间后再执行带有同步的逻辑。
下面是出牌的流程图,顶部的client和server代表在客户端上和服务器上执行的逻辑。

注:提示牌部分涉及到单机类型的AI,先放一边,代替为强制出牌。
C++中,两个接口,一个是出牌逻辑,返回的是出牌结果,结果分为出牌成功,出牌失败且重新出,出牌失败且过下一个,直接过下一个

UENUM(BlueprintType)
enum class FPlayerOperationResultType:uint8
{
	//determine to operate falied
	OperResNothing,
	//operate successfully
	OperResSuccess,  
	//operate falied ,continue doing
	OperResFalied_NotPass,
	//operate falied,pass
	OperResFailed_Pass,
	//operate successfully and be winner
	OperResWinner
};
另外,数据传输过程中需要代码里的计算牌数据和客户端UI显示的牌数据之间的一个转换函数:

TArray<AMyCard*> AMyNewPlayer::GetCardsByUICardsFromClientCards(TArray<AMyCard*> _cardsOnClient, TArray<FCardUIData> _cardsUIData)
{
	TArray<AMyCard*> t_res;
	TArray<AMyCard*> t_resNull;
	if (_cardsUIData.Num() > 0 && _cardsOnClient.Num() > 0)
	{
		int t_needNum = _cardsUIData.Num();
		for (int i=0;i<_cardsOnClient.Num();i++)
		{
			AMyCard* t_card = _cardsOnClient[i];
			if (t_card)
			{				
				for (int j = 0; j < _cardsUIData.Num(); j++)
				{
					FCardUIData t_uicard = _cardsUIData[j];				
					if (t_uicard.m_type == t_card->m_type&&t_uicard.m_numStr == t_card->m_numStr)
					{						
						t_res.Add(t_card);
						break;
					}
				}
				if (t_res.Num()== t_needNum)
					return t_res;
			}			
		}
	}

	return t_res;
}


出牌逻辑:
FPlayerOperationResultData AMyNewPlayer::OutCards(FPlayerOperationData _operationData)
{
	FPlayerOperationResultData t_res;
	if (Role == ROLE_Authority&&_operationData.m_index == m_indexPlayer)
	{
		if (_operationData.m_type == FPlayerOperationType::OutCards&&_operationData.NotNull())
		{
			TArray<AMyCard*> t_cards = GetCardsByUICardsFromClientCards(m_cardsClient, _operationData.m_cards);
			if (t_cards.Num() > 0)
			{
				FCurrentGameData_Server t_dataServer = GetCurrentGameDataOnServer();
				CardGroupType t_type = GetCardGroupTypeFromCards(t_cards);

				//first out cards
				if (!t_dataServer.NotNull())
				{
					if (CheckOutCardsIfReliable(t_cards))
					{
						t_res.Init(FPlayerOperationResultType::OperResSuccess, _operationData.m_cards, _operationData.m_index, "out cards successfully");
						OutCardsSucc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值