📄 playing_cards.cpp
字号:
// 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 + -