下面分析//牌的张数大于等于5张的类型判断,原代码如下:
int GameScene::PaiDuanPaiXing(){
//对出的牌进行排序
PlayerOutPaiXu(m_arrPlayerOut);
//牌型判断
int lengh = m_arrPlayerOut->count();
PaiXing px;
//牌的张数少于5张类型判断 单,对,三张,四张
if(lengh<5 && lengh>0){
Poker* pk = (Poker *)m_arrPlayerOut->objectAtIndex(0);
Poker* pk1 = (Poker *)m_arrPlayerOut->objectAtIndex(lengh-1);
if(pk->getNum() == pk1->getNum())
return lengh;
//三带一
pk1 = (Poker *)m_arrPlayerOut->objectAtIndex(lengh-2);
if(pk->getNum() == pk1->getNum() && lengh == 4)
return THREE_ONE_CARD;
//双鬼
if(pk->getHuaSe()==Gui && pk1->getHuaSe()==Gui)
return BOMB_CARD;
}
//牌的张数大于等于5张的类型判断
if(lengh>=5)
{
//是否为连牌牌型(单)
if(IsLianPai())
return CONNECT_CARD;
if(IsLianDui()) //判断连对
return COMPANY_CARD;
//判断飞机类型
return IsFeiJi();
}
return ERROR_CARD;
}
首先看一下IsLianPai()这个代码,这个是判断是否为连牌,比如34567.下面贴上代码:
bool GameScene::IsLianPai(){
int lengh = m_arrPlayerOut->count();
CCArray * arr = m_arrPlayerOut;
//所有牌值必须小于2
CCObject* object;
CCARRAY_FOREACH(arr,object){
if (((Poker *)object)->getNum() >= 12)//12代表牌值2,下面解释为什么
return false;
}
//必须是连续的(前一张牌值加1是否等于后一张牌值)
for(int i=0; i<lengh-1; ++i){
Poker* pk = (Poker *)arr->objectAtIndex(i);
Poker* pk1 = (Poker *)arr->objectAtIndex(i+1);
if(pk->getNum()+1 != pk1->getNum())
return false;
}
return true;
}
大家一定会对上面的12数值感到疑惑,下面截个图来解释:
牌值我是从0开始设置的,比如3的牌值为0,4为1。。。。。。
接下来放上判断是否是连对 IsLianDui() 代码:
bool GameScene::IsLianDui(){
int lengh = m_arrPlayerOut->count();
CCArray * arr = m_arrPlayerOut;
//所有牌值必须小于2
CCObject* object;
CCARRAY_FOREACH(arr,object){
if (((Poker *)object)->getNum() >= 12)
return false;
}
//大于等于6张牌并且数量为偶数
if(lengh < 6 && lengh%2 != 0)
return false;
//必须是连续的
for(int i=0; i<lengh-2; i+=2){
Poker* pk = (Poker *)arr->objectAtIndex(i);
Poker* pk1 = (Poker *)arr->objectAtIndex(i+2);
if(pk->getNum()+1 != pk1->getNum())
return false;
}
return true;
}
判断飞机类型 IsFeiJi()代码,函数名取的有点不合适,它返回的是一种飞机的类型,而不是bool值,所以很抱歉:
int GameScene::IsFeiJi(){
int lengh = m_arrPlayerOut->count();
CRAD_INDEX card_index = FenXiFeiJi();//分析牌是否是飞机,下面解释
//判断三带二
if(card_index.three_index.size()*3+card_index.duble_index.size()*2==lengh && card_index.three_index.size()==1 && card_index.duble_index.size()==1)
return THREE_TWO_CARD;
//判断飞机
if(card_index.three_index.size()>1 && card_index.four_index.empty() && IsFeiJiLian(card_index.three_index)){
//飞机不带
if(card_index.three_index.size()*3 == lengh && card_index.duble_index.size()+card_index.single_index.size() == 0)
return AIRCRAFT_CARD;
//飞机带单
if(card_index.three_index.size()*3+card_index.single_index.size() == lengh && card_index.duble_index.size() == 0)
return AIRCRAFT_SINGLE_CARD;
//飞机带双
if(card_index.three_index.size()*3+card_index.duble_index.size()*2 == lengh && card_index.single_index.size() == 0)
return AIRCRAFT_DOBULE_CARD;
}
//判断四带
if(card_index.three_index.empty() && !card_index.four_index.empty() && lengh%2 == 0)
{
//四带单
if(card_index.four_index.size()*4+card_index.single_index.size() == lengh && card_index.four_index.size()==1 && card_index.single_index.size()==2)
return BOMB_TWO_CARD;
//四带对
if(card_index.four_index.size()*4+card_index.duble_index.size()*2 == lengh && card_index.four_index.size()==1 && card_index.duble_index.size()==1)
return BOMB_TWOOO_CARD;
}
return ERROR_CARD;
}
这里注意CRAD_INDEX card_index = FenXiFeiJi(); 这句代码。
CRAD_INDEX为一种结构体:
struct CRAD_INDEX//分析飞机
{
std::vector<int> single_index;//单张
std::vector<int> duble_index;//双张
std::vector<int> three_index;//三张
std::vector<int> four_index;//四张
};
以上的结构体是为了
对出的牌进行分类用,下面看看是如何对牌分类的,下面是FenXiFeiJi()的代码:
CRAD_INDEX GameScene::FenXiFeiJi(){
//分析牌型结构
CCArray* arr = m_arrPlayerOut;
//飞机的类型
CRAD_INDEX m_cardIndex;
for(int i=0; i<arr->count();)
{
int time = 0;//相同牌的个数
Poker* pk = (Poker *)arr->objectAtIndex(i);
//找出相同牌
for(int j=i; j<arr->count(); ++j)
{
Poker* pk1 = (Poker *)arr->objectAtIndex(j);
if(pk->getNum() == pk1->getNum()){
++time;
++i;
}
}
//单张
if(time == 1)
m_cardIndex.single_index.push_back(pk->getNum());
else if(time == 2)
m_cardIndex.duble_index.push_back(pk->getNum());
else if(time == 3)
m_cardIndex.three_index.push_back(pk->getNum());
else if(time == 4)
m_cardIndex.four_index.push_back(pk->getNum());
}
return m_cardIndex;
}
本章至此结束,下面就可以判断玩家(人)出的牌是否合法了。
源码请往前三章下载!