Cocos2d-x制作《单机斗地主》源码解剖2:洗牌和发牌

在第一讲里,我们创建了一副牌,最初它们是有顺序的,现在我们需要把它们打乱,游戏里俗称“洗牌”。

请看代码:

bool GameScene::xiPai(){  
    bool isRet = false;  
    do   
    {  
        for(int i=0; i<54; ++i)  
        {  
            Poker* pk1 = (Poker*)m_arrPokers->randomObject();  
            Poker* pk2 = (Poker*)m_arrPokers->randomObject();  
            m_arrPokers->exchangeObject(pk1,pk2);  
        }  
        isRet = true;  
    } while (0);  
    return isRet;  
}

是不是很简单呢,上面意思是随机取两张牌并使之交换,进行54次,这样就把原先顺序打乱了。
牌洗完之后,下面就该一个一个向玩家发牌了,请看下面代码:

void GameScene::SendPk(){  
    Poker* pk;  
    if(m_iSendPk<51 && m_isSend)//前51张牌发给玩家  
    {  
        pk = (Poker*)m_arrPokers->objectAtIndex(m_iSendPk);  
        if(m_iSendPk%3 == 0)//给玩家发牌  
            MovePk(m_player,pk);  
        else if(m_iSendPk%3 == 1)//给电脑1发牌  
            MovePk(m_npcOne,pk);  
        else if(m_iSendPk%3 == 2)//给电脑2发牌  
            MovePk(m_npcTwo,pk);  
        ++m_iSendPk;  
        m_isSend = false;  
    }else if (m_iSendPk>50 && m_iSendPk<54 && m_isSend)//留下三张地主牌  
    {  
        pk = (Poker*)m_arrPokers->objectAtIndex(m_iSendPk);  
        pk->showFront();  
        MovePk(m_Three,pk);  
        ++m_iSendPk;  
        m_isSend = false;  
    }  
    else if(m_iSendPk>53)//牌发完分析电脑玩家的牌型  
    {  
        FenChaiNpcPai(m_npcOne);  
        FenChaiNpcPai(m_npcTwo);  
        m_iSendPk = 0;  
        m_iState = 1;  
    }  
}

大家一定注意到上面的m_isSend的变量了,这个变量就是指发给某一个玩家的牌动画是否完成。我们再来看一下MovePk()的代码就有些明白了:

void GameScene::MovePk(Player* play,Poker* pk)  
{  
    CCMoveTo* move;  
    CCCallFuncND* func;  
    float time = 0.05;  
    play->getArrPk()->addObject(pk);//从一副牌中选择pk这张牌  
    move = CCMoveTo::create(time,play->getPoint());  
    func = CCCallFuncND::create(this,callfuncND_selector(GameScene::func),play);  
    CCSequence* sequence = CCSequence::create(move,func,NULL);  
    pk->runAction(sequence);  
}  
  
void GameScene::func(CCNode* pSender, void* pData){  
    Player* play = (Player*)pData;  
    play->updatePkWeiZhi();//整理一个玩家手中的牌  
    m_isSend = true;  
}

       大家一定也注意到了play->updatePkWeiZhi()这个函数了,它的意义正如注释据所说的。这个我们在下一篇文章来解释。

猜你喜欢

转载自blog.csdn.net/qq_21743659/article/details/108483763