当玩家选择好要出的牌,首先判断该牌型是否合法,如果合法就高亮显示出“出牌”按钮,否则显示灰色“出牌”按钮,表示不可出。那么怎么判断玩家所选择的牌型是合法呢?请看下面代码:
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; }你一定注意到上面的PlayerOutPaiXu(m_arrPlayerOut);这个函数了,它的作用正是注释所说对出的牌进行排序,以方便分析它的牌型,m_arrPlayerOut是玩家选出的牌。先看以下代码:
void GameScene::PlayerOutPaiXu(CCArray* m_arrPlayerOut){ //对出的牌进行分离 std::vector<JiShu> vec;//JiShu是一个结构体,下面显示代码 while(m_arrPlayerOut->count() > 0) { JiShu js; js.arr = CCArray::create(); //取出第一个 Poker* pk = (Poker*)m_arrPlayerOut->objectAtIndex(0); m_arrPlayerOut->removeObjectAtIndex(0); js.num = 1; js.pkZhi = pk->getNum(); js.arr->addObject(pk); //找出与第一个相同的牌 int i=0; while (i<m_arrPlayerOut->count()) { Poker* pk1 = (Poker*)m_arrPlayerOut->objectAtIndex(i++); if(pk1->getNum() == pk->getNum()) { ++js.num; js.arr->addObject(pk1); m_arrPlayerOut->removeObject(pk1); --i; } } //把js存储起来用于排序 vec.push_back(js); } //对vec进行排序,按牌值从小到大排序 for(int i=0; i<vec.size()-1 && !vec.empty(); ++i){ for(int j=0; j<vec.size()-i-1; ++j){ if(vec[j].pkZhi > vec[j+1].pkZhi) { JiShu temp = vec[j]; vec[j] = vec[j+1]; vec[j+1] = temp; } } } stable_sort(vec.begin(),vec.end(),isShorter);//按牌的数量从小到大再排一次 //将排序好的牌重新放入m_playerOut中 for(std::vector<JiShu>::iterator it = vec.begin(); it!=vec.end(); ++it){ m_arrPlayerOut->addObjectsFromArray(it->arr); } }
//记数 排序出的牌用 struct JiShu { int pkZhi;//牌值 int num; //牌数量 CCArray* arr; //集合牌 };上面综合思想是:判断出的牌“m_arrPlayerOut”里有几个相同的牌并通过JiShu结构体记录下来并保存在std::vector<JiShu> vec中,然后按他们牌值和相同牌的数量进行一次排序,然后再把排序好的牌一个一个放回m_arrPlayerOut中去,这样就会方便以后用来分析牌型了。打个比方:比如出的牌 66633,经过排序会变成33666,665543经过排序变成345566.
那么上面代码中return BOMB_CARD; return THREE_ONE_CARD;是指什么呢,他们是一个枚举变量,分别代表一个牌型,请看下面代码:
//斗地主共有13种牌型 enum CARD_TYPE { SINGLE_CARD = 1,//单牌- DOUBLE_CARD,//对子- THREE_CARD,//3不带- BOMB_CARD,//炸弹 THREE_ONE_CARD,//3带1- THREE_TWO_CARD,//3带2- BOMB_TWO_CARD,//四个带2张单牌 BOMB_TWOOO_CARD,//四个带2对 CONNECT_CARD,//连牌- COMPANY_CARD,//连队- AIRCRAFT_CARD,//飞机不带- AIRCRAFT_SINGLE_CARD,//飞机带单牌- AIRCRAFT_DOBULE_CARD,//飞机带对子- ERROR_CARD //错误的牌型 } ;
关于//牌的张数大于等于5张的类型判断 我们在下一篇分析!
相关源码请在前三章下载!