在电脑玩家跟牌和出牌之前首先对电脑玩家的牌进行拆分:
根据文档需求(见本博客“斗地主规则“)拆分牌按以下顺序,先分析炸弹---飞机---连对---连牌--三带,对子,单张。请看如下代码:
void GameScene::FenChaiNpcPai(Player* npc){
/************************************************************************/
/* 1.首先分析出来牌的类型(如:四张,三张,两张,一张) */
/************************************************************************/
std::vector<PaiXing> vec;
PaiXing xing;
CCArray* arr = CCArray::create();//临时数组
arr->addObjectsFromArray(npc->getArrPk());
//提取双鬼
Poker* pk = (Poker *)arr->objectAtIndex(0);
Poker* pk1 = (Poker *)arr->objectAtIndex(1);
if(pk->getHuaSe() == Gui && pk1->getHuaSe() == Gui){
xing.type = BOMB_CARD;
xing.vec.push_back(pk);
xing.vec.push_back(pk1);
arr->removeObject(pk);
arr->removeObject(pk1);
vec.push_back(xing);
}
//分析牌型
for(int i=0; i<arr->count();)
{
pk = (Poker*)arr->objectAtIndex(i);
xing.vec.clear();//清除数组
//找出与pk相同的牌
for (int j=i; j<arr->count(); ++j)
{
pk1 = (Poker*)arr->objectAtIndex(j);
if(pk->getNum() == pk1->getNum())
{
++i;
xing.vec.push_back(pk1);
}
else
{
break;
}
}
if(xing.vec.size() == 4)
xing.type = BOMB_CARD;
if(xing.vec.size() == 3)
xing.type = THREE_CARD;
if(xing.vec.size() == 2)
xing.type = DOUBLE_CARD;
if(xing.vec.size() == 1)
xing.type = SINGLE_CARD;
vec.push_back(xing);
}
/************************************************************************/
/* 2.按优先级(先分析炸弹---飞机---连对---连牌--三带,对子,单张)提取牌型并保存用于出牌或跟牌 */
/************************************************************************/
//提取炸弹
for(std::vector<PaiXing>::iterator iter = vec.begin(); iter != vec.end(); )
{
if(iter->type == BOMB_CARD)
{
xing.type = BOMB_CARD;
xing.vec.clear();
xing.vec = iter->vec;
npc->