?? 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 + -