cocos2dx《单机斗地主》源码解剖之六 玩家人的出牌(1)

当玩家选择好要出的牌,首先判断该牌型是否合法,如果合法就高亮显示出“出牌”按钮,否则显示灰色“出牌”按钮,表示不可出。那么怎么判断玩家所选择的牌型是合法呢?请看下面代码

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张的类型判断 我们在下一篇分析!

相关源码请在前三章下载!

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...