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

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

概述下面分析//牌的张数大于等于5张的类型判断,原代码如下: int GameScene::PaiDuanPaiXing(){ //对出的牌进行排序 PlayerOutPaiXu(m_arrPlayerOut); //牌型判断 int lengh = m_arrPlayerOut->count(); PaiXing px; //牌

下面分析//牌的张数大于等于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;}

本章至此结束,下面就可以判断玩家(人)出的牌是否合法了。

源码请往前三章下载!

总结

以上是内存溢出为你收集整理的cocos2dx《单机斗地主》源码解剖之六 玩家(人)的出牌(2)全部内容,希望文章能够帮你解决cocos2dx《单机斗地主》源码解剖之六 玩家(人)的出牌(2)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1040385.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存