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

📄 playing_cards.cpp

📁 一个斗地主的小程序。。。。。。。。。。多多指教
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			{
				return 0;
			}				
		}//
		else if(m_nDiscardingCardsTable[i] == 2)
		{
			counter++;
		}//
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}//
	}

	return 0;
}
//判断是否是三顺带四单;
int CPlayingCards::Is33331111()
{
	int m_nTypeValue = 0;
	int counter = 0;

	for(int i=3;i<17;i++)
	{
		if(m_nDiscardingCardsTable[i] == 3 && i < 12)   //遇到第一个三张且不等于A;
		{
			m_nTypeValue = i;
			if((m_nDiscardingCardsTable[i+1] != 3) || 
			   (m_nDiscardingCardsTable[i+2] != 3) ||
			   (m_nDiscardingCardsTable[i+3] != 3))  
			{
				return 0;			//如果下表项不为三张,返回0;
			}
			else
			{
				for(int j=i+4; j<17; j++)
				{
					if(m_nDiscardingCardsTable[j] == 1)
					{
						counter++;
					}
					else if(m_nDiscardingCardsTable[j] != 0)
					{
						return 0;	//再出现其它表项,则返回0;
					}
				}//end for(int j=i+1;j<17;j++)
			}
			//如果单牌数为2,则匹配成功!
			if(counter == 4)
			{
				return m_nTypeValue;
			}
			else
			{
				return 0;
			}				
		}//
		else if(m_nDiscardingCardsTable[i] == 1)
		{
			counter++;
		}//
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}//
	}
	return 0;
}
/*
* 函数介绍:检查出牌的逻辑合法性;
* 输入参数:无;
* 输出参数:??
* 返回值 : 匹配成功返回1,不成功返回0;
*/
int CPlayingCards::CheckChoosing()
{
	int i;

	for(i=0; i<17; i++)    //初始化扫描表;
	{
		m_nDiscardingCardsTable[i] = 0;
	}
	//扫描进表中;
	for(i=0; i<m_nChoosingCardsCounter; i++)
	{
		m_nDiscardingCardsTable[m_cChoosingCards[i].m_nValue]++;
	}

	int Table_Index;

	switch(m_nChoosingCardsCounter)
	{
	case 1:
		m_cDiscardingType.m_nTypeNum   = 1;
		m_cDiscardingType.m_nTypeValue = m_cChoosingCards[0].m_nValue; 
		return 1;
	case 2://是否是一对牌;
		if( (Table_Index = Is2()) != 0 )
		{
			//是大王,则为炸弹;
			if(Table_Index == 16)
			{
				m_cDiscardingType.m_nTypeNum = 4;   //类型为4表示炸弹;
			}
			else
			{
				m_cDiscardingType.m_nTypeNum = 2;
			}
			m_cDiscardingType.m_nTypeValue = Table_Index; 
			return 1;
		}
		return 0;
	case 3:
		if( (Table_Index = Is3()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum   = 3;
			m_cDiscardingType.m_nTypeValue = Table_Index; 
			return 1;
		}
		return 0;
	case 4:
		if( (Table_Index = IsBomb()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum   = 4;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is31()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 31;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 5:
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 5;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is32()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 32;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 6:
//单顺:		 6							最小牌的Card.m_nValue(面值)    6
//双顺:		 222						最小牌的Card.m_nValue(面值)    6
//三顺:	     33							最小牌的Card.m_nValue(面值)    6
//四带二单:	 411						四张的Card.m_nValue(面值)		6	 
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 6;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsDoubleSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsThreeSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 33;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is411()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 411;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 7:
//单顺
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 7;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 8:
//单顺:		 8							最小牌的Card.m_nValue(面值)    8
//双顺		 2222						最小牌的Card.m_nValue(面值)    8
//三顺带二单:  3311						最小三张的Card.m_nValue(面值)  8
//四带二对:	 422						四张的Card.m_nValue(面值)		8
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 8;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsDoubleSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 2222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is3311()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 3311;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is422()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 422;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 9:
//单顺:		 9							最小牌的Card.m_nValue(面值)    9
//三顺:		 333						最小三张的Card.m_nValue(面值)  9
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 9;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsThreeSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 333;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 10:
//单顺:		 10							最小牌的Card.m_nValue(面值)    10
//双顺:		 22222						最小牌的Card.m_nValue(面值)    10
//三顺带二对:  3322						最小三张的Card.m_nValue(面值)  10
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 10;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsDoubleSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 22222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is3322()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 3322;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 11:
//单顺:		 11							最小牌的Card.m_nValue(面值)    11	
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 11;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 12:
//单顺:		 12							最小牌的Card.m_nValue(面值)    12
//双顺:		 222222						最小对牌的Card.m_nValue(面值)  12
//三顺:		 3333						最小三张的Card.m_nValue(面值)  12
//三顺带三:	 333111						最小三张的Card.m_nValue(面值)  12
		if( (Table_Index = IsSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 12;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsDoubleSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 222222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsThreeSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 3333;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is333111()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 333111;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 13:
		return 0;
	case 14:
//双顺		 2222222					最小对牌的Card.m_nValue(面值)  14
		if( (Table_Index = IsDoubleSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 2222222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 15:
//三顺带三对:  333222					最小三张的Card.m_nValue(面值)  15
//三顺:		 33333						最小三张的Card.m_nValue(面值)  15
		if( (Table_Index = IsThreeSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 33333;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is333222()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 333222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 16:
//双顺		 22222222					最小对牌的Card.m_nValue(面值)  16
//三顺带四单:  33331111					最小三张的Card.m_nValue(面值)  16
		if( (Table_Index = IsDoubleSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 22222222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = Is33331111()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 33331111;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 17:
		return 0;
	case 18:
//双顺		 222222222					最小对牌的Card.m_nValue(面值)  18
//三顺		 333333						最小三张的Card.m_nValue(面值)  18
		if( (Table_Index = IsDoubleSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 222222222;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		else if( (Table_Index = IsThreeSeries()) != 0 )
		{
			m_cDiscardingType.m_nTypeNum = 333333;
			m_cDiscardingType.m_nTypeValue = Table_Index;
			return 1;
		}
		return 0;
	case 19:
		return 0;
	case 20:
		return 0;
//暂时保留;几乎不可能的牌;
//双顺		 2222222222					最小对牌的Card.m_nValue(面值)  20
//三顺带五单:	 3333311111					最小三张的Card.m_nValue(面值)  20
//三顺带四对:  33332222					最小三张的Card.m_nValue(面值)  20
	}	
	return -1;
}
//直接选择出牌;
int CPlayingCards::DirectChoose()
{	
	int i;
	int counter_0 = 0;
	int counter_1 = 0;
	int value_1 = 17;
	int counter_2 = 0;
	int value_2 = 17;
	int counter_3 = 0;
	int value_3 = 17;
	int counter_4 = 0;
	int value_4 = 17;

	CCardsType temp;
	temp.m_nTypeValue = 2;
	//扫描未出牌表;
	for(i=15;i>=3;i--)
	{
		switch(m_nCardsTable[i])
		{
		case 0:
			counter_0++;
			break;
		case 1:
			counter_1++;
			value_1 = i;
			break;
		case 2:
			counter_2++;
			value_2 = i;
			break;
		case 3:
			counter_3++;
			value_3 = i;
			break;
		case 4:
			counter_4++;
			value_4 = i;
			break;
		}
	}

		if( counter_3 >= 2 && counter_1 >= counter_2 )
		{
			//寻找3311;找到返回;
			//如果没找到,则 if(counter_1 <= 5)寻找31;返回
			if( Search3311(temp) )
			{
				return 1;
			}
		}
		else if( counter_3 >= 2 && counter_2 > counter_1 )
		{
			//寻找3322;找到返回;
			//如果没找到,则 if(counter_2 <= 5)寻找32;返回
			if( Search3322(temp) )
			{
				return 1;
			}
		}

		if( counter_1 >= 3 )
		{
			//寻找单顺;从12张到5张的情况;

			if( SearchBeyond10(temp,12) )
				return 1;

			if( SearchBeyond10(temp,11) )
				return 1;

			if( SearchBeyond10(temp,10) )
				return 1;

			if( Search9(temp) )
				return 1;
				
			if( Search8(temp) )
				return 1;

			if( Search7(temp) )
				return 1;

			if( Search6(temp) )
				return 1;

			if( Search5(temp) )
				return 1;		
		}

		if( counter_2 >= 3 )
		{
			//寻找双顺;从5到3;
			if( Search2222(temp) )
				return 1;

			if( Search222(temp) )
				return 1;
		}

		if( counter_4 >= 0 && counter_1 >= 2 && counter_2 >= 2 )
		{
			//寻找411;
			if( value_1 < value_2 )
			{		
				if( Search411(temp) )
				return 1;
			}
			else
			{
				if( Search422(temp) )
				return 1;
			}
		}
		else if( counter_4 >= 0 && counter_1 >= 2 )
		{
			if( Search411(temp) )
				return 1;
		}
		else if( counter_4 >= 0 && counter_2 >= 2 )
		{
			if( Search422(temp) )
				return 1;
		}

		if( counter_3 > 0 && value_1 < value_2 && counter_1 > 0 )
		{
			//寻找31;
			if( Search31(temp) )
				return 1;
		}
		else if( counter_3 > 0 && value_2 < value_1 && counter_2 > 0 )
		{
			//寻找31;
			if( Search32(temp) )
				return 1;
		}

		if( value_1 < value_2 )
		{
			//寻找1;
			if( Search1(temp) )
				return 1;
		}
		else
		{
			//寻找2;
			if( Search2(temp) )
				return 1;
		}

	for(i=3;i<=16;i++)
	{
		if( m_nCardsTable[i] == 0 )
			continue;
		else
		{
			m_cDiscardingType.m_nTypeNum   = 4;
			m_cDiscardingType.m_nTypeNum   = m_nCardsTable[i];
			m_cDiscardingType.m_nTypeValue = i;

			for(int j=0;j<m_nCardsTable[i];j++)
			{
				m_nDiscardingCounter++;
				m_cDiscarding[j] = m_cCards[j];

				m_cCards[j] = m_cBLANK_CARD;
				}//end for~
			m_nCardsTable[i] = 0;
			break;
		}
	}//end if

//	CleanUp();
	return 1;
}
//工人智能补丁1;
BOOL CPlayingCards::AI_Patch1()
{
	//双王
	if( (m_nCardsTable[16] == 2) && (m_nCardsCounter == 2) )
	{
		m_cDiscardingType.m_nTypeNum   = 4;
		m_cDiscardingType.m_nTypeValue = 16;
		m_nDiscardingCounter = 2;

		m_cDiscarding[0]  = m_cCards[0];
		m_cDiscarding[1]  = m_cCards[1];

		m_cCards[0] = m_cBLANK_CARD;
		m_cCards[1] = m_cBLANK_CARD;

		m_nCardsTable[16] = 0;
		return 1;
	}

	int i;
	int counter_1 = 0;
	int value_1 = 17;
	int counter_2 = 0;
	int value_2 = 17;
	int counter_3 = 0;
	int value_3 = 17;
	int counter_4 = 0;
	int value_4 = 17;

	CCardsType temp;
	temp.m_nTypeValue = 2;
	//扫描未出牌表;
	for(i=15;i>=3;i--)
	{
		switch(m_nCardsTable[i])
		{
		case 1:
			counter_1++;
			value_1 = i;
			break;
		case 2:
			counter_2++;
			value_2 = i;
			break;
		case 3:
			counter_3++;
			value_3 = i;
			break;
		case 4:
			counter_4++;
			value_4 = i;
			break;
		}
	}
	//双王加单张;
	if( (m_nCardsTable[16] == 2) && (m_nCardsCounter == 3) )
	{
		m_cDiscardingType.m_nTypeNum   = 4;
		m_cDiscardingType.m_nTypeValue = 16;

		m_nDiscardingCounter = 2;
		m_cDiscarding[0]     = m_cCards[1];
		m_cDiscarding[1]     = m_cCards[2];

		m_cCards[1] = m_cBLANK_CARD;
		m_cCards[2] = m_cBLANK_CARD;

		m_nCardsTable[16] = 0;
		return 1;
	}

	//双王加一对;
	if( (m_nCardsTable[16] == 2) && ((m_nCardsCounter == 4) && (counter_2 == 1)) )
	{
		m_cDiscardingType.m_nTypeNum   = 4;
		m_cDiscardingType.m_nTypeValue = 16;

		m_nDiscardingCounter = 2;
		m_cDiscarding[0]     = m_cCards[2];
		m_cDiscarding[1]     = m_cCards[3];

		m_cCards[2] = m_cBLANK_CARD;
		m_cCards[3] = m_cBLANK_CARD;

		m_nCardsTable[16] = 0;
		return 1;
	}

	//双王加三张;
	if( (m_nCardsTable[16] == 2) && ((m_nCardsCounter == 5) && (counter_3 == 1)) )

⌨️ 快捷键说明

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