带控制的抢庄牛牛


// int代表一张牌, // 低16位代表牌的数字 1-13 A-K // 高16位代表花色 1-4 黑红梅方 // 1 .无牛 玩家手中无法用3张牌组成10的倍数。 1倍 // 2 .牛丁 玩家牌组一达成后,剩下两张牌相加后个位数为1。 1倍 // 3 .牛二 玩家牌组一达成后,剩下两张牌相加后个位数为2。 2倍 // 4 .牛三 玩家牌组一达成后,剩下两张牌相加后个位数为3。 3倍 // 5 .牛四 玩家牌组一达成后,剩下两张牌相加后个位数为4。 4倍 // 6 .牛五 玩家牌组一达成后,剩下两张牌相加后个位数为5。 5倍 // 7 .牛六 玩家牌组一达成后,剩下两张牌相加后个位数为6。 6倍 // 8 .牛七 玩家牌组一达成后,剩下两张牌相加后个位数为7。 7倍 // 9 .牛八 玩家牌组一达成后,剩下两张牌相加后个位数为8。 8倍 // 10 .牛九 玩家牌组一达成后,剩下两张牌相加后个位数为9。 9倍 // 11 .牛牛 玩家牌组一达成后,剩下两张牌相加后个位数为0。 10倍 // 12 .炸弹 玩家手中有四张牌都是一样的点数。 10倍 // 13 .金牛 玩家手中的五张牌都是J、Q、K的花牌牌型。 10倍 // 14 .五小牛 玩家手中的五张牌都<5,且加起来也≤10的牌型。10倍 enum enumPokerType { CATTLE_NONE = -1, CATTLE_0 = 0, CATTLE_1 = 1, CATTLE_2 = 2, CATTLE_3 = 3, CATTLE_4 = 4, CATTLE_5 = 5, CATTLE_6 = 6, CATTLE_7 = 7, CATTLE_8 = 8, CATTLE_9 = 9, CATTLE_CATTLE = 10, CATTLE_BOMB = 11, CATTLE_GOLD = 12, CATTLE_5SMALL = 13, }; struct stBanker { UINT32 userID; INT32 headID; INT64 bankerGolds; INT64 winGolds; INT32 remainNum; char niceName[64]; }; struct stOneGamePokerInfo { vector<INT32> m_banker; vector<INT32> m_tian; vector<INT32> m_di; vector<INT32> m_xuan; vector<INT32> m_huang; INT32 m_Bets[4]; }; class ALLPokerInfo { public: ALLPokerInfo(); ~ALLPokerInfo(); INT32 GetOnePokerType(INT32 poker); INT32 GetOnePokerPoint(INT32 poker); INT32 GetOnePokerPointBetween1And10(INT32 poker); void ShufflePoker(); void SelectPokerClear(); void SelectPokerLastThreeClear(); void Random2PokerInfo(); void RandomLast3PokerInfo(); void MatchingLast3PokerInfo(INT64 golds, INT64 tian, INT64 di, INT64 xuan, INT64 huang, bool isSystem = true); bool IsInSelectPokerInfo(INT32 pokerInfo); // in is true, not in is false INT32 PlayerCompareBankerPokerInfo(vector<INT32> vecPoker); void ComparePokerInfo(); enumPokerType GetPokerType(vector<INT32> vecPoker); bool GetPokerType5SmallCattle(vector<INT32> vecPoker); bool GetPokerTypeGoldCattle(vector<INT32> vecPoker); bool GetPokerTypeBombCattle(vector<INT32> vecPoker); INT32 GetPokerTypeCattleBetweenZeroAndTen(vector<INT32> vecPoker); stOneGamePokerInfo& GetGamePokerInfo() { return m_allSelectPokerInfo; } private: vector<INT32> m_allModulePoker; stOneGamePokerInfo m_allSelectPokerInfo; };

  

ALLPokerInfo::ALLPokerInfo()
{
	m_allModulePoker.clear();
	m_allSelectPokerInfo.m_banker.clear();
	m_allSelectPokerInfo.m_tian.clear();
	m_allSelectPokerInfo.m_di.clear();
	m_allSelectPokerInfo.m_xuan.clear();
	m_allSelectPokerInfo.m_huang.clear();
	memset(m_allSelectPokerInfo.m_Bets, 0, sizeof(m_allSelectPokerInfo.m_Bets));

	for (int i = 1; i <= 4; ++i)
	{
		for (int j = 1; j <= 13; ++j)
		{
			INT32	pokerInfo = (i << 16) + j;
			m_allModulePoker.push_back(pokerInfo);
		}
	}
}

ALLPokerInfo::~ALLPokerInfo()
{
	m_allModulePoker.clear();
	m_allSelectPokerInfo.m_banker.clear();
	m_allSelectPokerInfo.m_tian.clear();
	m_allSelectPokerInfo.m_di.clear();
	m_allSelectPokerInfo.m_xuan.clear();
	m_allSelectPokerInfo.m_huang.clear();
}

INT32	ALLPokerInfo::GetOnePokerType(INT32	poker)
{
	return	poker >> 16;
}

INT32	ALLPokerInfo::GetOnePokerPoint(INT32	poker)
{
	return	poker & 0xFFFF;
}

INT32	ALLPokerInfo::GetOnePokerPointBetween1And10(INT32	poker)
{
	INT32	pokerPoint = GetOnePokerPoint(poker);
	if (pokerPoint > 10)
	{
		pokerPoint = 10;
	}
	return	pokerPoint;
}

void	ALLPokerInfo::ShufflePoker()
{
	for (INT32 i = m_allModulePoker.size() - 1; i > 0; --i)
	{
		swap(m_allModulePoker[rand() % i], m_allModulePoker[i]);
	}
}

void	ALLPokerInfo::SelectPokerClear()
{
	m_allSelectPokerInfo.m_banker.clear();
	m_allSelectPokerInfo.m_tian.clear();
	m_allSelectPokerInfo.m_di.clear();
	m_allSelectPokerInfo.m_xuan.clear();
	m_allSelectPokerInfo.m_huang.clear();
	memset(m_allSelectPokerInfo.m_Bets, 0, sizeof(m_allSelectPokerInfo.m_Bets));
}

void	ALLPokerInfo::SelectPokerLastThreeClear()
{
	while (m_allSelectPokerInfo.m_banker.size() > 2)
	{
		m_allSelectPokerInfo.m_banker.pop_back();
	}
	while (m_allSelectPokerInfo.m_tian.size() > 2)
	{
		m_allSelectPokerInfo.m_tian.pop_back();
	}
	while (m_allSelectPokerInfo.m_di.size() > 2)
	{
		m_allSelectPokerInfo.m_di.pop_back();
	}
	while (m_allSelectPokerInfo.m_xuan.size() > 2)
	{
		m_allSelectPokerInfo.m_xuan.pop_back();
	}
	while (m_allSelectPokerInfo.m_huang.size() > 2)
	{
		m_allSelectPokerInfo.m_huang.pop_back();
	}
}

void	ALLPokerInfo::Random2PokerInfo()
{
	SelectPokerClear();
	auto iter = m_allModulePoker.begin();
	m_allSelectPokerInfo.m_banker.assign(iter, iter + 2);
	m_allSelectPokerInfo.m_tian.assign(iter + 2, iter + 4);
	m_allSelectPokerInfo.m_di.assign(iter + 4, iter + 6);
	m_allSelectPokerInfo.m_xuan.assign(iter + 6, iter + 8);
	m_allSelectPokerInfo.m_huang.assign(iter + 8, iter + 10);
}

void	ALLPokerInfo::RandomLast3PokerInfo()
{
	for (auto iter = m_allModulePoker.begin(); iter != m_allModulePoker.end(); iter++)
	{
		if (IsInSelectPokerInfo(*iter))
		{
			continue;
		}

		if (m_allSelectPokerInfo.m_banker.size() < 5)
		{
			m_allSelectPokerInfo.m_banker.push_back(*iter);
			continue;
		}
		if (m_allSelectPokerInfo.m_tian.size() < 5)
		{
			m_allSelectPokerInfo.m_tian.push_back(*iter);
			continue;
		}
		if (m_allSelectPokerInfo.m_di.size() < 5)
		{
			m_allSelectPokerInfo.m_di.push_back(*iter);
			continue;
		}
		if (m_allSelectPokerInfo.m_xuan.size() < 5)
		{
			m_allSelectPokerInfo.m_xuan.push_back(*iter);
			continue;
		}
		if (m_allSelectPokerInfo.m_huang.size() < 5)
		{
			m_allSelectPokerInfo.m_huang.push_back(*iter);
			continue;
		}

		return;
	}
}

INT32	ALLPokerInfo::PlayerCompareBankerPokerInfo(vector<INT32>	vecPoker)
{
	enumPokerType	playerType = GetPokerType(vecPoker);
	enumPokerType	bankerType = GetPokerType(m_allSelectPokerInfo.m_banker);

	INT32	maxType = 0;
	if (playerType > bankerType)
	{
		maxType = playerType;
	}
	else if (playerType < bankerType)
	{
		maxType = -bankerType;
	}
	else
	{
		INT32	bankerPokerPoint = 0;
		INT32	bankerPokerType = 0;

		for (auto iter = m_allSelectPokerInfo.m_banker.begin(); iter != m_allSelectPokerInfo.m_banker.end(); iter++)
		{
			if (GetOnePokerPoint(*iter) > bankerPokerPoint)
			{
				bankerPokerPoint = GetOnePokerPoint(*iter);
				bankerPokerType = GetOnePokerType(*iter);
			}
			else if (GetOnePokerPoint(*iter) == bankerPokerPoint)
			{
				if (bankerPokerType > GetOnePokerType(*iter)) 
				{
					bankerPokerType = GetOnePokerType(*iter);
				}
			}
		}
		INT32	playerPokerPoint = 0;
		INT32	playerPokerType = 0;

		for (auto iter = vecPoker.begin(); iter != vecPoker.end(); iter++)
		{
			if (GetOnePokerPoint(*iter) > playerPokerPoint)
			{
				playerPokerPoint = GetOnePokerPoint(*iter);
				playerPokerType = GetOnePokerType(*iter);
			}
			else if (GetOnePokerPoint(*iter) == playerPokerPoint)
			{
				if (playerPokerType > GetOnePokerType(*iter))
				{
					playerPokerType = GetOnePokerType(*iter);
				}
			}
		}

		if (playerPokerPoint > bankerPokerPoint)
		{
			maxType = playerType;
			if (0 == maxType)
			{
				maxType = 1;
			}
		}
		else if (playerPokerPoint < bankerPokerPoint)
		{
			maxType = -bankerType;
			if (0 == maxType)
			{
				maxType = -1;
			}
		}
		else
		{
			if (playerPokerType < bankerPokerType)
			{
				maxType = playerType;
				if (0 == maxType)
				{
					maxType = 1;
				}
			}
			else
			{
				maxType = -bankerType;
				if (0 == maxType)
				{
					maxType = -1;
				}
			}
		}
	}

	if (abs(maxType) > 10)
	{
		maxType = maxType > 0 ? 10 : -10;
	}

	return maxType;
}

void	ALLPokerInfo::ComparePokerInfo()
{
	memset(m_allSelectPokerInfo.m_Bets, 0, sizeof(m_allSelectPokerInfo.m_Bets));
	
	m_allSelectPokerInfo.m_Bets[0] = PlayerCompareBankerPokerInfo(m_allSelectPokerInfo.m_tian);
	m_allSelectPokerInfo.m_Bets[1] = PlayerCompareBankerPokerInfo(m_allSelectPokerInfo.m_di);
	m_allSelectPokerInfo.m_Bets[2] = PlayerCompareBankerPokerInfo(m_allSelectPokerInfo.m_xuan);
	m_allSelectPokerInfo.m_Bets[3] = PlayerCompareBankerPokerInfo(m_allSelectPokerInfo.m_huang);
}

void	ALLPokerInfo::MatchingLast3PokerInfo(INT64 golds, INT64 tian, INT64 di, INT64 xuan, INT64 huang, bool isSystem)
{
	const static INT32	loopCount = 100;
	
	static INT64	absMinGolds[loopCount];
	memset(absMinGolds, 0, loopCount);
	
	static	stOneGamePokerInfo	absPokerInfo[loopCount];
	for (INT32 i = 0; i < loopCount; i++)
	{
		absPokerInfo[i].m_banker.clear();
		absPokerInfo[i].m_tian.clear();
		absPokerInfo[i].m_di.clear();
		absPokerInfo[i].m_xuan.clear();
		absPokerInfo[i].m_huang.clear();
		memset(absPokerInfo[i].m_Bets, 0, sizeof(absPokerInfo[i].m_Bets));
	}

	for (INT32 i = 0; i < loopCount; i++)
	{
		ShufflePoker();
		SelectPokerLastThreeClear();
		RandomLast3PokerInfo();
		ComparePokerInfo();

		if (isSystem)
		{
			absMinGolds[i] = abs(golds - m_allSelectPokerInfo.m_Bets[0] * tian - m_allSelectPokerInfo.m_Bets[1] * di - m_allSelectPokerInfo.m_Bets[2] * xuan - m_allSelectPokerInfo.m_Bets[3] * huang);
		}
		else 
		{
			absMinGolds[i] = abs(golds + m_allSelectPokerInfo.m_Bets[0] * tian + m_allSelectPokerInfo.m_Bets[1] * di + m_allSelectPokerInfo.m_Bets[2] * xuan + m_allSelectPokerInfo.m_Bets[3] * huang);
		}
		
		absPokerInfo[i] = m_allSelectPokerInfo;
	}

	INT32	minIndex = 0;
	INT64	minAbsGolds = absMinGolds[0];
	for (INT32 i = 0; i < loopCount; i++)
	{
		if (minAbsGolds > absMinGolds[i])
		{
			minIndex = i;
			minAbsGolds = absMinGolds[i];
		}
	}

	m_allSelectPokerInfo = absPokerInfo[minIndex];
}


bool	ALLPokerInfo::IsInSelectPokerInfo(INT32 pokerInfo)
{
	for (auto iter = m_allSelectPokerInfo.m_banker.begin(); iter != m_allSelectPokerInfo.m_banker.end(); iter++)
	{
		if (*iter == pokerInfo)
		{
			return true;
		}
	}

	for (auto iter = m_allSelectPokerInfo.m_tian.begin(); iter != m_allSelectPokerInfo.m_tian.end(); iter++)
	{
		if (*iter == pokerInfo)
		{
			return true;
		}
	}

	for (auto iter = m_allSelectPokerInfo.m_di.begin(); iter != m_allSelectPokerInfo.m_di.end(); iter++)
	{
		if (*iter == pokerInfo)
		{
			return true;
		}
	}

	for (auto iter = m_allSelectPokerInfo.m_xuan.begin(); iter != m_allSelectPokerInfo.m_xuan.end(); iter++)
	{
		if (*iter == pokerInfo)
		{
			return true;
		}
	}

	for (auto iter = m_allSelectPokerInfo.m_huang.begin(); iter != m_allSelectPokerInfo.m_huang.end(); iter++)
	{
		if (*iter == pokerInfo)
		{
			return true;
		}
	}
	
	return false;
}

enumPokerType	ALLPokerInfo::GetPokerType(vector<INT32>	vecPoker)
{
	if(vecPoker.size() != 5) 
	{
		return CATTLE_NONE;
	}

	if (GetPokerType5SmallCattle(vecPoker))
	{
		return	CATTLE_5SMALL;
	}

	if (GetPokerTypeGoldCattle(vecPoker))
	{
		return	CATTLE_GOLD;
	}

	if (GetPokerTypeBombCattle(vecPoker))
	{
		return	CATTLE_BOMB;
	}

	return	enumPokerType(GetPokerTypeCattleBetweenZeroAndTen(vecPoker));
}

bool	ALLPokerInfo::GetPokerType5SmallCattle(vector<INT32>	vecPoker)
{
	INT32	allPokerPointSum = 0;
	for (auto iter = vecPoker.begin(); iter != vecPoker.end(); ++iter)
	{
		INT32	poker = GetOnePokerPoint(*iter);
		if (poker >= 5)
		{
			return false;
		}	
		allPokerPointSum += poker;
	}

	if (allPokerPointSum > 10) 
	{
		return false;
	}

	return true;
}

bool	ALLPokerInfo::GetPokerTypeGoldCattle(vector<INT32>	vecPoker)
{
	for (auto iter = vecPoker.begin(); iter != vecPoker.end(); ++iter)
	{
		if (GetOnePokerPoint(*iter) <= 10)
		{
			return false;
		}	
	}
	return true;
}

bool	ALLPokerInfo::GetPokerTypeBombCattle(vector<INT32>	vecPoker)
{
	map<INT32, INT32>	mapPokerPointCount;
	mapPokerPointCount.clear();

	for (auto iter = vecPoker.begin(); iter != vecPoker.end(); ++iter)
	{
		auto iterFind = mapPokerPointCount.find(*iter);
		if (iterFind == mapPokerPointCount.end())
		{
			mapPokerPointCount[*iter] = 0;
		}

		mapPokerPointCount[*iter] = mapPokerPointCount[*iter] + 1;
	}

	for (auto iter = mapPokerPointCount.begin(); iter != mapPokerPointCount.end(); ++iter)
	{
		if (4 == iter->second)
		{
			return true;
		}
	}

	return false;
}

static	vector<vector<INT32>> FiveChooseThree(vector<INT32>	vecPoker)
{
	vector<vector<INT32>> allPokerPossibility;
	allPokerPossibility.clear();

	vector<INT32>	vecPoint;

	vecPoint.clear();
	vecPoint = vecPoker;
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[3]);
	vecPoint.push_back(vecPoker[2]);
	vecPoint.push_back(vecPoker[4]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[4]);
	vecPoint.push_back(vecPoker[2]);
	vecPoint.push_back(vecPoker[3]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[2]);
	vecPoint.push_back(vecPoker[3]);
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[4]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[2]);
	vecPoint.push_back(vecPoker[4]);
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[3]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[3]);
	vecPoint.push_back(vecPoker[4]);
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[2]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[2]);
	vecPoint.push_back(vecPoker[3]);
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[4]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[2]);
	vecPoint.push_back(vecPoker[4]);
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[3]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[1]);
	vecPoint.push_back(vecPoker[3]);
	vecPoint.push_back(vecPoker[4]);
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[2]);
	allPokerPossibility.push_back(vecPoint);

	vecPoint.clear();
	vecPoint.push_back(vecPoker[2]);
	vecPoint.push_back(vecPoker[3]);
	vecPoint.push_back(vecPoker[4]);
	vecPoint.push_back(vecPoker[0]);
	vecPoint.push_back(vecPoker[1]);
	allPokerPossibility.push_back(vecPoint);

	return	allPokerPossibility;
}

INT32	ALLPokerInfo::GetPokerTypeCattleBetweenZeroAndTen(vector<INT32>	vecPoker)
{
	INT32	maxCattle = 0;
	vector<vector<INT32>> allPokerPossibility = FiveChooseThree(vecPoker);

	for (auto iter = allPokerPossibility.begin(); iter !=  allPokerPossibility.end(); ++iter)
	{
		INT32	threeSum = GetOnePokerPointBetween1And10((*iter)[0]) + GetOnePokerPointBetween1And10((*iter)[1]) + GetOnePokerPointBetween1And10((*iter)[2]);
		if (0 == threeSum % 10)
		{
			INT32	twoSum = GetOnePokerPointBetween1And10((*iter)[3]) + GetOnePokerPointBetween1And10((*iter)[4]);
			if (twoSum == 10 || twoSum == 20)
			{
				maxCattle = 10;
			}
			else 
			{
				if (twoSum % 10 > maxCattle)
				{
					maxCattle = twoSum % 10;
				}
			}
		}
	}

	return	maxCattle;
}

//状态机

INT32	CGSGameRoom::OnGameRoomState(){
	
	TIME_SECOND tCurTime = WYYTools_Instance->GetCurSecond();
	
	if (m_eGameRoomState == eGameRoomState_Init) {
		if (g_cGSGameHallInstance.GetModelStatus() == eModelStatus_Working) {
			m_eGameRoomState = eGameRoomState_Send2Poker;
			m_stateOutTime = tCurTime + c_n32Send2PokerTime;
			GameRoomState_Send2Poker();
		}
	}
	else if (m_eGameRoomState == eGameRoomState_Send2Poker) {
		if (tCurTime >= m_stateOutTime) {
			m_eGameRoomState = eGameRoomState_Beting;
			m_stateOutTime = tCurTime + c_n32BetingTime;
			NotifySceneUserState(NULL);
		}
	}
	else if (m_eGameRoomState == eGameRoomState_Beting) {
		if (tCurTime >= m_stateOutTime) {
			m_eGameRoomState = eGameRoomState_SendLast3Poker;
			m_stateOutTime = tCurTime + c_n32SendLast3PokerTime;
			GameRoomState_SendLast3Poker();
		}
	}
	else if (m_eGameRoomState == eGameRoomState_SendLast3Poker) {
		if (tCurTime >= m_stateOutTime) {
			m_eGameRoomState = eGameRoomState_Result;
			m_stateOutTime = tCurTime + c_n32ResultTime;
			GameRoomState_CalcResult();
		}
	}
	else if (m_eGameRoomState == eGameRoomState_Result) {
		if (tCurTime >= m_stateOutTime) {

			// 0 = 不操作 1 = 询问补庄 2 = 换庄
			INT32	bankerState = JudgeChangeBanker();
			m_BankerTiaoZhengChips = 0;
			if (1 == bankerState)
			{
				m_eGameRoomState = eGameRoomState_RoundBanker;
				m_stateOutTime = tCurTime + c_n32RoundBanker;
				GameRoomState_RoundBanker(bankerState);
				
			}
			else if (2 == bankerState)
			{
				m_eGameRoomState = eGameRoomState_ChangeBanker;
				m_stateOutTime = tCurTime + c_n32ChangeBanker;
				GameRoomState_ChangeBanker();
			}
			else 
			{	
				m_eGameRoomState = eGameRoomState_ContinueBanker;
				m_stateOutTime = tCurTime + c_n32IsContinueBanker;
				GameRoomState_RoundBanker(bankerState);

				//m_eGameRoomState = eGameRoomState_Send2Poker;
				//m_stateOutTime = tCurTime + c_n32Send2PokerTime;
				//GameRoomState_Send2Poker();
			}

		}
	}
	else if (m_eGameRoomState == eGameRoomState_RoundBanker) {
		if (tCurTime >= m_stateOutTime) {
			m_eGameRoomState = eGameRoomState_ChangeBanker;
			m_stateOutTime = tCurTime + c_n32ChangeBanker;
			GameRoomState_ChangeBanker();
		}
	}
	else if (m_eGameRoomState == eGameRoomState_ContinueBanker) {
		if (tCurTime >= m_stateOutTime) {
			m_eGameRoomState = eGameRoomState_ChangeBanker;
			m_stateOutTime = tCurTime + c_n32ChangeBanker;
			GameRoomState_ChangeBanker();
		}
	}
	else if (m_eGameRoomState == eGameRoomState_ChangeBanker) {
		if (tCurTime >= m_stateOutTime) {
			m_eGameRoomState = eGameRoomState_Send2Poker;
			m_stateOutTime = tCurTime + c_n32Send2PokerTime;
			GameRoomState_Send2Poker();
		}
	}

	return 0;
}

//先发2张牌,下注,再发三张牌

 

void	CGSGameRoom::GameRoomState_Send2Poker()
{
	m_allPokerInfo.SelectPokerClear();
	m_allPokerInfo.ShufflePoker();
	m_allPokerInfo.Random2PokerInfo();

	m_AllBets.vecTianGolds.clear();
	m_AllBets.vecDiGolds.clear();
	m_AllBets.vecXuanGolds.clear();
	m_AllBets.vecHuangGolds.clear();
	m_GameUserBets.clear();
	m_SynFlyGameUserBets.clear();

	NotifySceneUserState(NULL);
	NotifySceneUserPokerInfo(0, 2, NULL);
}


void	CGSGameRoom::MatchingLast3PokerInfo()
{
	INT64	tianGolds = 0;
	INT64	diGolds = 0;
	INT64	xuanGolds = 0;
	INT64	huangGolds = 0;
	

	CGSGameUser* pGameUser = g_cGSGameHallInstance.GetCGSGameUserByID(m_BankerUserID);

	if (NULL != pGameUser)
	{
		for (auto iter = m_GameUserBets.begin(); iter != m_GameUserBets.end(); iter++)
		{
			if (UserIDInRobotVec(iter->first))
			{
				tianGolds += iter->second.tianGolds;
				diGolds += iter->second.diGolds;;
				xuanGolds += iter->second.xuanGolds;;
				huangGolds += iter->second.haungGolds;
			}
		}
		INT64	winGolds = g_cGSGameHallInstance.SelectPlan(4) * (tianGolds + diGolds + xuanGolds + huangGolds) / 10000;
		m_allPokerInfo.MatchingLast3PokerInfo(winGolds, tianGolds, diGolds, xuanGolds, huangGolds, false);
	}
	else
	{
		for (auto iter = m_GameUserBets.begin(); iter != m_GameUserBets.end(); iter++)
		{
			if (!UserIDInRobotVec(iter->first))
			{
				tianGolds += iter->second.tianGolds;
				diGolds += iter->second.diGolds;;
				xuanGolds += iter->second.xuanGolds;;
				huangGolds += iter->second.haungGolds;
			}
		}
		INT64	winGolds = g_cGSGameHallInstance.SelectPlan(4) * (tianGolds + diGolds + xuanGolds + huangGolds) / 10000;
		m_allPokerInfo.MatchingLast3PokerInfo(winGolds, tianGolds, diGolds, xuanGolds, huangGolds, true);
	}


	m_awardRecords.push_back(m_allPokerInfo);
	while (m_awardRecords.size() > 20)
	{
		m_awardRecords.erase(m_awardRecords.begin());
	}
}

根据血池,玩家下注情况,选择相应策略,根据策略给庄家和天地玄黄配牌,把所有玩家放在一起统一处理输赢

策略的json

[{
    "threshold": 0,
    "info": [{
        "plan": -100000,
        "weights": 150
    }, {
        "plan": -71600,
        "weights": 350
    }, {
        "plan": -50505,
        "weights": 650
    }, {
        "plan": -31300,
        "weights": 850
    }, {
        "plan": -10800,
        "weights": 1000
    }, {
        "plan": 18300,
        "weights": 200
    }, {
        "plan": 25500,
        "weights": 600
    }, {
        "plan": 31500,
        "weights": 600
    }, {
        "plan": 45500,
        "weights": 1000
    }, {
        "plan": 53500,
        "weights": 800
    }, {
        "plan": 62800,
        "weights": 700
    }, {
        "plan": 74700,
        "weights": 900
    }, {
        "plan": 82840,
        "weights": 700
    }, {
        "plan": 92500,
        "weights": 700
    }, {
        "plan": 100000,
        "weights": 800
    }]
}, {
    "threshold": 50000000,
    "info": [{
        "plan": -100000,
        "weights": 200
    }, {
        "plan": -71000,
        "weights": 200
    }, {
        "plan": -61600,
        "weights": 400
    }, {
        "plan": -52000,
        "weights": 600
    }, {
        "plan": -31500,
        "weights": 800
    }, {
        "plan": -12500,
        "weights": 1400
    }, {
        "plan": -6310,
        "weights": 1400
    }, {
        "plan": 25000,
        "weights": 100
    }, {
        "plan": 33300,
        "weights": 100
    }, {
        "plan": 40100,
        "weights": 400
    }, {
        "plan": 50500,
        "weights": 800
    }, {
        "plan": 62500,
        "weights": 1000
    }, {
        "plan": 75600,
        "weights": 800
    }, {
        "plan": 88000,
        "weights": 1000
    }, {
        "plan": 10000,
        "weights": 800
    }]
}, {
    "threshold": 100000000,
    "info": [{
        "plan": -100000,
        "weights": 200
    }, {
        "plan": -95270,
        "weights": 400
    }, {
        "plan": -81848,
        "weights": 400
    }, {
        "plan": -70842,
        "weights": 600
    }, {
        "plan": -50505,
        "weights": 800
    }, {
        "plan": -45000,
        "weights": 1000
    }, {
        "plan": -23000,
        "weights": 1200
    }, {
        "plan": -12000,
        "weights": 1400
    }, {
        "plan": 33300,
        "weights": 100
    }, {
        "plan": 40100,
        "weights": 100
    }, {
        "plan": 50505,
        "weights": 200
    }, {
        "plan": 62500,
        "weights": 600
    }, {
        "plan": 82840,
        "weights": 1000
    }, {
        "plan": 92500,
        "weights": 1200
    }, {
        "plan": 100000,
        "weights": 800
    }]
}, {
    "threshold": 500000000,
    "info": [{
        "plan": -100000,
        "weights": 400
    }, {
        "plan": -82840,
        "weights": 600
    }, {
        "plan": -70747,
        "weights": 600
    }, {
        "plan": -42300,
        "weights": 600
    }, {
        "plan": -31300,
        "weights": 1200
    }, {
        "plan": -21400,
        "weights": 1200
    }, {
        "plan": -10600,
        "weights": 1400
    }, {
        "plan": 11500,
        "weights": 600
    }, {
        "plan": 20400,
        "weights": 600
    }, {
        "plan": 32000,
        "weights": 400
    }, {
        "plan": 47500,
        "weights": 400
    }, {
        "plan": 62500,
        "weights": 400
    }, {
        "plan": 75600,
        "weights": 600
    }, {
        "plan": 88000,
        "weights": 600
    }, {
        "plan": 100000,
        "weights": 400
    }]
}, {
    "threshold": 1000000000,
    "info": [{
        "plan": -100000,
        "weights": 600
    }, {
        "plan": -95270,
        "weights": 800
    }, {
        "plan": -85000,
        "weights": 600
    }, {
        "plan": -74800,
        "weights": 600
    }, {
        "plan": -50500,
        "weights": 1200
    }, {
        "plan": -36700,
        "weights": 1200
    }, {
        "plan": -11500,
        "weights": 1000
    }, {
        "plan": 20400,
        "weights": 400
    }, {
        "plan": 32000,
        "weights": 400
    }, {
        "plan": 42300,
        "weights": 500
    }, {
        "plan": 52013,
        "weights": 400
    }, {
        "plan": 75600,
        "weights": 500
    }, {
        "plan": 82840,
        "weights": 600
    }, {
        "plan": 95500,
        "weights": 600
    }, {
        "plan": 100000,
        "weights": 600
    }]
}, {
    "threshold": 2500000000,
    "info": [{
        "plan": -100000,
        "weights": 800
    }, {
        "plan": -95270,
        "weights": 800
    }, {
        "plan": -82840,
        "weights": 200
    }, {
        "plan": -50500,
        "weights": 500000
    }, {
        "plan": -41600,
        "weights": 800
    }, {
        "plan": -34300,
        "weights": 1500
    }, {
        "plan": -20100,
        "weights": 1600
    }, {
        "plan": -10000,
        "weights": 1800
    }, {
        "plan": 21200,
        "weights": 25
    }, {
        "plan": 42300,
        "weights": 25
    }, {
        "plan": 63915,
        "weights": 50
    }, {
        "plan": 74088,
        "weights": 50
    }, {
        "plan": 82840,
        "weights": 150
    }, {
        "plan": 92900,
        "weights": 850
    }, {
        "plan": 100000,
        "weights": 8500
    }]
}]

 

 

原文地址:https://www.cnblogs.com/hailong88/p/11046051.html