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

📄 playing_cards.cpp

📁 斗地主源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// Playing_Cards.cpp: implementation of the CPlayingCards class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "斗地主.h"
#include "MainFrm.h"

#include "Game.h"
#include "My_DirectInput.h"
#include "My_directdraw.h"

#include "Playing_Cards.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCard::CCard()
{
	m_nColor = 4;   //4表示没有任意花色;
	m_nValue = 17;	  //17表示还没有牌;
}

CCardsType::CCardsType()
{
	m_nTypeNum = 0;
	m_nTypeValue = 0;
}

void CPlayingCards::New()
{
	m_nCardsCounter      = 0;
	m_nDiscardedCounter  = 0;	
	m_nDiscardingCounter = 0;  
	m_nChoosingCardsCounter = 0;
	m_cDiscardingType.m_nTypeNum = 0;
	m_cDiscardingType.m_nTypeValue = 0;
}

CPlayingCards::CPlayingCards()
{
	m_nCardsCounter      = 0;
	m_nDiscardedCounter  = 0;	
	m_nDiscardingCounter = 0;  
	m_nChoosingCardsCounter = 0;
}

CPlayingCards::~CPlayingCards()
{

}

int CPlayingCards::CleanUp()
{
	CCard temp_card;
	for(int i=0; i<m_nCardsCounter - 1; i++)  //整理牌的算法
	{
		for(int j=i+1; j<m_nCardsCounter; j++)
		{
			if( (m_cCards[i].m_nValue * 4 + m_cCards[i].m_nColor) > (m_cCards[j].m_nValue * 4 + m_cCards[j].m_nColor) )
			{
				temp_card = m_cCards[i];
				m_cCards[i] =  m_cCards[j];
				m_cCards[j] =  temp_card;
			}
		}//end for;
	}//end for;
	return 1;
}
//判断是否是单顺(拖拉机),此函数适合5-12张牌情况; 
int CPlayingCards::IsSeries()
{
	int m_nTypeValue = 0;	//单牌的起始大小;
	int counter = 0;  //连续单牌的个数;
	int i,j,k;

	for(i=15; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}
/*
			char str[400];
			sprintf(str,"m_nDiscardingCardsTable[3] = %d\n\
				m_nDiscardingCardsTable[4] = %d\n\
				m_nDiscardingCardsTable[5] = %d\n\
				m_nDiscardingCardsTable[6] = %d\n\
				m_nDiscardingCardsTable[7] = %d\n\
				m_nDiscardingCardsTable[8] = %d\n\
				m_nDiscardingCardsTable[9] = %d\n\
				m_nDiscardingCardsTable[10] = %d\n\
				m_nDiscardingCardsTable[11] = %d\n\
				m_nDiscardingCardsTable[12] = %d\n\
				m_nDiscardingCardsTable[13] = %d\n\
				m_nDiscardingCardsTable[14] = %d\n",
						m_nDiscardingCardsTable[3],
						m_nDiscardingCardsTable[4],
						m_nDiscardingCardsTable[5],
						m_nDiscardingCardsTable[6],
						m_nDiscardingCardsTable[7],
						m_nDiscardingCardsTable[8],
						m_nDiscardingCardsTable[9],
						m_nDiscardingCardsTable[10],
						m_nDiscardingCardsTable[11],
						m_nDiscardingCardsTable[12],
						m_nDiscardingCardsTable[13],
						m_nDiscardingCardsTable[14]);
//			pMy_Draw->Text_Out(str,10000);  //调试用;
		AfxMessageBox(str);
		Sleep(10000);
		*/
	for(i=3;i<15;i++)
	{
		if(m_nDiscardingCardsTable[i] == 1)   //遇到第一张单牌,接下去扫描;
		{
			m_nTypeValue = i;
			for(j=i;j<17;j++)    //从第i张牌开始扫描;
			{
				if(m_nDiscardingCardsTable[j] == 1)   //如果接下来的牌为单牌,则给连续单牌数加一;
				{
					counter++;
				}
				else if(m_nDiscardingCardsTable[j] == 0)//如果遇到不为单牌,
				{
					for(k=j;k<17;k++)   //如果之后遇到非空,则返回0;
					{
						if(m_nDiscardingCardsTable[k] != 0)
						{
							return 0;
						}
					}//end for(k=j+1;k<15;k++);

					if(counter >= 5)   //如果连续单牌>=5,则为单顺;
					{
						return m_nTypeValue;
					}
					else				//不为单牌,返回0
					{
						return 0;
					}
				}
				else      //不为空也不为单牌,返回0;
				{
					return 0;
				}
			}//
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;				  //遇到其他的数,返回
		}
	}
	/*
	char str[300];
			sprintf(str,"m_nDiscardingCardsTable[3] = %d\n\
				m_nDiscardingCardsTable[4] = %d\n\
				m_nDiscardingCardsTable[5] = %d\n\
				m_nDiscardingCardsTable[6] = %d\n\
				m_nDiscardingCardsTable[7] = %d\n\
				m_nDiscardingCardsTable[8] = %d\n\
				m_nDiscardingCardsTable[9] = %d\n\
				m_nDiscardingCardsTable[10] = %d\n\
				m_nDiscardingCardsTable[11] = %d\n\
				m_nDiscardingCardsTable[12] = %d\n\
				m_nDiscardingCardsTable[13] = %d\n\
				m_nDiscardingCardsTable[14] = %d\n\
				m_nTypeValue = %d",
						m_nDiscardingCardsTable[3],
						m_nDiscardingCardsTable[4],
						m_nDiscardingCardsTable[5],
						m_nDiscardingCardsTable[6],
						m_nDiscardingCardsTable[7],
						m_nDiscardingCardsTable[8],
						m_nDiscardingCardsTable[9],
						m_nDiscardingCardsTable[10],
						m_nDiscardingCardsTable[11],
						m_nDiscardingCardsTable[12],
						m_nDiscardingCardsTable[13],
						m_nDiscardingCardsTable[14],
						m_nTypeValue);
//			pMy_Draw->Text_Out(str,10000);  //调试用;
		AfxMessageBox(str);
		Sleep(10000);
*/
	return -1;   //见鬼了才会返回这个值;
}
//判断是否是双顺;此函数适合6-20张牌情况;
int CPlayingCards::IsDoubleSeries()
{
	int m_nTypeValue = 0;	//对牌的起始大小;
	int counter = 0;  //连续对牌的个数;
	int i,j,k;

	for(i=15; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}

	for(i=3; i<15; i++)
	{
		if(m_nDiscardingCardsTable[i] == 2)   //遇到第一个对牌,接下去扫描;
		{
			m_nTypeValue = i;
			for(j=i; j<15; j++)    //从第i张牌开始扫描;
			{
				if(m_nDiscardingCardsTable[j] == 2)   //如果接下来的牌为对牌,则给连续对牌数加一;
				{
					counter++;
				}
				else if(m_nDiscardingCardsTable[j] == 0)//如果遇到不为对牌,
				{
					for(k=j+1; k<15; k++)   //如果之后遇到非空,则返回0;
					{
						if(m_nDiscardingCardsTable[k] != 0)
						{
							return 0;
						}
					}//end for(k=j+1;k<15;k++);

					if(counter >= 3)   //如果连续对牌>=3,则为双顺;
					{
						return m_nTypeValue;
					}
					else				//不为对牌,返回0
					{
						return 0;
					}
				}
				else      //不为空也不为对牌,返回0;
				{
					return 0;
				}
			}//
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;				  //遇到其他的数,返回
		}
	}
	return -1;   //见鬼了才会返回这个值;
}
//判断是否是三顺;此函数适合6-18张牌情况;
int CPlayingCards::IsThreeSeries()
{
	int m_nTypeValue = 0;	//三顺的起始大小;
	int counter = 0;  //连续三张的个数;
	int i,j,k;

	for(i=15; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}

	for(i=3; i<15; i++)
	{
		if(m_nDiscardingCardsTable[i] == 3)   //遇到第一个三张,接下去扫描;
		{
			m_nTypeValue = i;
			for(j=i; j<15; j++)    //从表第i项开始扫描;
			{
				if(m_nDiscardingCardsTable[j] == 3)   //如果接下来的牌为三张,则给连续对牌数加一;
				{
					counter++;
				}
				else if(m_nDiscardingCardsTable[j] == 0)//如果遇到不为三张,
				{
					for(k=j+1;k<15;k++)   //如果之后遇到非空,则返回0;
					{
						if(m_nDiscardingCardsTable[k] != 0)
						{
							return 0;
						}
					}//end for(k=j+1;k<15;k++);

					if(counter >= 2)   //如果连续对牌>=2,则为三顺;
					{
						return m_nTypeValue;
					}
					else				//只有一个三张;
					{
						return 0;
					}
				}
				else      //不为空也不为对牌,返回0;
				{
					return 0;
				}
			}//
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;				  //遇到其他的数,返回
		}
	}
	return -1;
}
//判断是否是一对牌;
int CPlayingCards::Is2()
{
	for(int i=3;i<17;i++)
	{
		if(m_nDiscardingCardsTable[i] == 2)
		{
			return i;
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}
	return -1;    //出错,为空牌表;
}
//判断是否是三张;
int CPlayingCards::Is3()
{
	for(int i=3; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] == 3)
		{
			return i;
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}
	return -1;
}
//判断是否是四张(炸弹); 
int CPlayingCards::IsBomb()
{
	for(int i=3; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] == 4)
		{
			return i;
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}
	return -1;
}
//判断是否是三带一单;
int CPlayingCards::Is31()
{
	for(int i=3; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] == 3)
			return i;
	}
	return 0;
}
//判断是否是三带一对;
int CPlayingCards::Is32()
{
	int m_nTypeValue = 0;
	int Pair = 0;
	for(int i=3; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] == 3)
		{
			m_nTypeValue = i;
		}
		else if(m_nDiscardingCardsTable[i] == 2)
		{
			Pair = i;
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}
	//如果存在三张,又存在一对,则返回
	if(m_nTypeValue && Pair)
	{
		return m_nTypeValue;
	}
	return 0;
}
//判断是否是四带两单;
int CPlayingCards::Is411()
{
	int m_nTypeValue = 0;
	int counter = 0;

	for(int i=3; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] == 4)
		{
			m_nTypeValue = i;
		}
		else if(m_nDiscardingCardsTable[i] == 1)
		{
			counter++;
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}
	//如果存在三张,又存在一对,则返回
	if(m_nTypeValue && counter == 2)
	{
		return m_nTypeValue;
	}
	
	return 0;
}
//判断是否是三顺带两单;
int CPlayingCards::Is3311()
{
	int m_nTypeValue = 0;
	int counter = 0;

	for(int i=3; i<17; i++)
	{
		if((m_nDiscardingCardsTable[i] == 3) && (i!= 14))   //遇到第一个三张且不等于A;
		{
			m_nTypeValue = i;
			if(m_nDiscardingCardsTable[i+1] != 3)  
			{
				return 0;			//如果下表项不为三张,返回0;
			}
			else
			{
				for(int j=i+2; 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 == 2)
			{
				return m_nTypeValue;
			}
			else
			{
				return 0;
			}				
		}//
		else if(m_nDiscardingCardsTable[i] == 1)
		{
			counter++;
		}//
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}//
	}

	return 0;
}
//判断是否是四带两对;
int CPlayingCards::Is422()
{
	int m_nTypeValue = 0;
	int counter = 0;

	for(int i=3;i<17;i++)
	{
		if(m_nDiscardingCardsTable[i] == 4)
		{
			m_nTypeValue = i;
		}
		else if(m_nDiscardingCardsTable[i] == 2)
		{
			counter++;
		}
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}
	}
	//如果存在三张,又存在一对,则返回
	if(m_nTypeValue && counter == 2)
	{
		return m_nTypeValue;
	}
	return 0;
}
//判断是否是三顺带两对;	
int CPlayingCards::Is3322()
{
	int m_nTypeValue = 0;
	int counter = 0;

	for(int i=3; i<17; i++)
	{
		if((m_nDiscardingCardsTable[i] == 3) && (i < 14))   //遇到第一个三张且不等于A;
		{
			m_nTypeValue = i;
			if(m_nDiscardingCardsTable[i+1] != 3)  
			{
				return 0;			//如果下表项不为三张,返回0;
			}
			else
			{
				for(int j=i+2; j<17; j++)
				{
					if(m_nDiscardingCardsTable[j] == 2)
					{
						counter++;
					}
					else if(m_nDiscardingCardsTable[j] != 0)
					{
						return 0;	//再出现其它表项,则返回0;
					}
				}//end for(int j=i+1; j<17; j++)
			}
			//如果单牌数为2,则匹配成功!
			if(counter == 2)
			{
				return m_nTypeValue;
			}
			else
			{
				return 0;
			}				
		}//
		else if(m_nDiscardingCardsTable[i] == 2)
		{
			counter++;
		}//
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}//
	}

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

	for(int i=3; i<17; i++)
	{
		if((m_nDiscardingCardsTable[i] == 3) && (i < 13))   //遇到第一个三张且不等于A;
		{
			m_nTypeValue = i;
			if(m_nDiscardingCardsTable[i+1] != 3 || 
			   m_nDiscardingCardsTable[i+2] != 3)  
			{
				return 0;			//如果下表项不为三张,返回0;
			}
			else
			{
				for(int j=i+3; 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 == 3)
			{
				return m_nTypeValue;
			}
			else
			{
				return 0;
			}				
		}//
		else if(m_nDiscardingCardsTable[i] == 1)
		{
			counter++;
		}//
		else if(m_nDiscardingCardsTable[i] != 0)
		{
			return 0;
		}//
	}
	return 0;
}
//判断是否是三顺带三对;
int CPlayingCards::Is333222()	
{
	int m_nTypeValue = 0;
	int counter = 0;

	for(int i=3; i<17; i++)
	{
		if(m_nDiscardingCardsTable[i] == 3 && i < 13)   //遇到第一个三张且不等于A;
		{
			m_nTypeValue = i;
			if((m_nDiscardingCardsTable[i+1] != 3) || 
			   (m_nDiscardingCardsTable[i+2] != 3))  
			{
				return 0;			//如果下表项不为三张,返回0;
			}
			else
			{
				for(int j=i+3; j<17; j++)
				{
					if(m_nDiscardingCardsTable[j] == 2)
					{
						counter++;
					}
					else if(m_nDiscardingCardsTable[j] != 0)
					{
						return 0;	//再出现其它表项,则返回0;
					}
				}//end for(int j=i+1;j<17;j++)
			}
			//如果单牌数为2,则匹配成功!
			if(counter == 3)
			{
				return m_nTypeValue;
			}
			else

⌨️ 快捷键说明

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