cocos2dx《单机斗地主》源码解剖之五 叫地主

编程入门 行业动态 更新时间:2024-10-22 08:25:08

cocos2dx《单机斗<a href=https://www.elefans.com/category/jswz/34/1771422.html style=地主》源码解剖之五 叫地主"/>

cocos2dx《单机斗地主》源码解剖之五 叫地主

发完牌,下面就该叫地主了,首先从玩家(人)开始叫地主,下一回合所有玩家(包括电脑玩家)按逆时针顺序叫地主。我们来看一下叫地主的模块:

void GameScene::Call(float dt){//是否都叫过地主if(!m_player->getCall() || !m_npcOne->getCall() || !m_npcTwo->getCall()){m_iCallTime%=3;switch (m_iCallTime){case 0://玩家选择地主分数m_menu->setVisible(true);if (m_bCall[0])//1分{CCMenuItemFont* itemFont = (CCMenuItemFont*)m_menu->getChildByTag(1);itemFont->setEnabled(false);}else{CCMenuItemFont* itemFont = (CCMenuItemFont*)m_menu->getChildByTag(1);itemFont->setEnabled(true);}if (m_bCall[1])//2分{CCMenuItemFont* itemFont = (CCMenuItemFont*)m_menu->getChildByTag(2);itemFont->setEnabled(false);}else{CCMenuItemFont* itemFont = (CCMenuItemFont*)m_menu->getChildByTag(2);itemFont->setEnabled(true);}if (m_bCall[2])//3分{CCMenuItemFont* itemFont = (CCMenuItemFont*)m_menu->getChildByTag(3);itemFont->setEnabled(false);}else//不叫{CCMenuItemFont* itemFont = (CCMenuItemFont*)m_menu->getChildByTag(3);itemFont->setEnabled(true);}break;case 1://电脑1选择地主分数++m_iCallTime;NpcCall(m_npcTwo,m_npcOne);//电脑玩家叫地主ShowFenShu(ccp(m_npcTwo->getPoint().x-88,m_npcTwo->getPoint().y),m_npcTwo->getCallNum());break;case 2://电脑2选择地主分数++m_iCallTime;NpcCall(m_npcOne,m_npcTwo);ShowFenShu(ccp(m_npcOne->getPoint().x+88,m_npcOne->getPoint().y),m_npcOne->getCallNum());break;}}else//判断谁是地主并把三张牌给他{//如果都没叫地主,把地主给一开始选地主那个if(m_player->getCallNum() == 0 && m_npcOne->getCallNum() == 0 && m_npcTwo->getCallNum() == 0){switch (m_iCall%3){case 0:m_player->setCallNum(3);break;case 1:m_npcTwo->setCallNum(3);break;case 2:m_npcOne->setCallNum(3);break;default:break;}}//谁的值大谁当地主CCObject* object;if(m_player->getCallNum() > m_npcOne->getCallNum() && m_player->getCallNum() > m_npcTwo->getCallNum()){CCArray* arrTem = CCArray::create();CCARRAY_FOREACH(m_Three->getArrPk(),object){Poker* pk = (Poker *)object;Poker* pkCopy = pk->copy();arrTem->addObject(pkCopy);addChild(pkCopy);m_player->getArrPk()->addObject(pk);m_player->setIsDiZhu(true);m_npcOne->setIsDiZhu(false);m_npcTwo->setIsDiZhu(false);m_iOutCard = 0;}m_Three->getArrPk()->removeAllObjects();m_Three->getArrPk()->addObjectsFromArray(arrTem);m_Three->updatePkWeiZhi();m_player->updatePkWeiZhi();//显示地主标签m_lableDiZhu->setPosition(playerDiZhuLablePt);m_lableDiZhu->setVisible(true);}if(m_npcOne->getCallNum() > m_player->getCallNum() && m_npcOne->getCallNum() > m_npcTwo->getCallNum()){CCArray* arrTem = CCArray::create();CCARRAY_FOREACH(m_Three->getArrPk(),object){Poker* pk = (Poker *)object;Poker* pkCopy = pk->copy();arrTem->addObject(pkCopy);addChild(pkCopy);m_npcOne->getArrPk()->addObject(pk);m_player->setIsDiZhu(false);m_npcOne->setIsDiZhu(true);m_npcTwo->setIsDiZhu(false);m_iOutCard = 2;}m_Three->getArrPk()->removeAllObjects();m_Three->getArrPk()->addObjectsFromArray(arrTem);m_Three->updatePkWeiZhi();//重新分拆牌m_npcOne->m_vecPX.clear();m_npcOne->updatePkWeiZhi();FenChaiNpcPai(m_npcOne);//显示地主标签m_lableDiZhu->setPosition(npcOneDiZhuLablePt);m_lableDiZhu->setVisible(true);}if(m_npcTwo->getCallNum() > m_npcOne->getCallNum() && m_npcTwo->getCallNum() > m_player->getCallNum()){CCArray* arrTem = CCArray::create();CCARRAY_FOREACH(m_Three->getArrPk(),object){Poker* pk = (Poker *)object;Poker* pkCopy = pk->copy();arrTem->addObject(pkCopy);addChild(pkCopy);m_npcTwo->getArrPk()->addObject(pk);m_player->setIsDiZhu(false);m_npcOne->setIsDiZhu(false);m_npcTwo->setIsDiZhu(true);m_iOutCard = 1;}m_Three->getArrPk()->removeAllObjects();m_Three->getArrPk()->addObjectsFromArray(arrTem);m_Three->updatePkWeiZhi();//重新分拆牌m_npcTwo->m_vecPX.clear();m_npcTwo->updatePkWeiZhi();FenChaiNpcPai(m_npcTwo);//显示地主标签m_lableDiZhu->setPosition(npcTwoDiZhuLablePt);m_lableDiZhu->setVisible(true);}m_iState = 2;++m_iCall;m_iCallTime = m_iCall;unschedule(schedule_selector(GameScene::Call));//选定地主后显示三张牌CCARRAY_FOREACH(m_Three->getArrPk(),object){Poker* pk = (Poker*)object;pk->showFront();}//移除叫地主分数的显示this->removeChildByTag(FenShu);this->removeChildByTag(FenShu);this->removeChildByTag(FenShu);//使主玩家的牌为可点击状态CCARRAY_FOREACH(m_player->getArrPk(),object){Poker* pk = (Poker *)object;pk->setDianJi(true);}}
}
上面判断其实很简单:首先判断各玩家是否都已经叫分,如果是就判断谁是斗地主并把三张牌给他,如果都没有叫斗地主的话,我这里的逻辑是把斗地主判给第一个叫分的玩家。

接下来我们看看电脑玩家是如何叫分的,为了简单,我让电脑玩家随机选择分数,代码如下:

void GameScene::NpcCall(Player* npc,Player* npc1){int i = rand()%4;if(i == 3) //3表示不叫{npc->setCall(true);//设置已叫地主npc->setCallNum(0);//分数设置为0}else{while (m_bCall[i] == true)//bool m_bCall[3];分数是否被叫 m_bCall[0]:1分 m_bCall[1]:2分 m_bCall[2]:3分i = rand()%3; //重新选择分数m_bCall[i] = true;npc->setCall(true);npc->setCallNum(i+1);//如果叫3分,设置其他玩家已叫地主状态if(i == 2){m_player->setCall(true);npc1->setCall(true);}}
}

源码请往前三章下载!

更多推荐

cocos2dx《单机斗地主》源码解剖之五 叫地主

本文发布于:2024-03-07 20:58:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1718892.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:地主   斗地主   之五   单机   源码

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!