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

博客介绍了在cocos2dx游戏中,如何判断玩家选择的牌型是否合法,合法则高亮出牌按钮,否则显示为不可出。文章通过代码展示了判断过程,并提及了特定的枚举变量代表的牌型,如BOMB_CARD和THREE_ONE_CARD。后续篇章将讨论张数大于等于5的牌型判断。
摘要由CSDN通过智能技术生成

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

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

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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值