依照游戏规则,发完牌下面就该叫地主了,首先从玩家(人)开始叫地主,下一回合所有玩家(包括电脑玩家)按逆时针顺序叫地主。我们来看一下叫地主的模块:
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);
}
}
}
