cocos2dx《单机斗地主》源码解剖之八 电脑玩家出牌与跟牌(结束)

上一篇文章对玩家手中的牌进行分析归类,下面就该实现电脑玩家出牌与跟牌的策略了。首先我们来看看出牌的策略,代码如下:

void GameScene::update(float delta){
    switch (m_iState)
    {
        case 0:
            SendPk();
            break;
        case 1:
            schedule(schedule_selector(GameScene::Call),1);
            break;
        case 2:
            scheduleOnce(schedule_selector(GameScene::OutCard),0.5);
            break;
        case 3:
            IsShengLi();
            break;
        default:
            break;
    }
}

首先解释下该函数,本函数为一个循环,每帧被调用一次。我们看一下头文件里m_iState的注释:

int m_iState;//当前状态 ,0:发牌状态 1:叫地主状态 2:出牌状态 3:结果状态

很明显,出牌和跟牌策略就在状态2,该函数延时0.5秒出牌。我们接下来看下OutCard函数的策略:

void GameScene::OutCard(float delta){
    switch (m_iOutCard%3)
    {
        case 0:
            m_chuPaiMenu->setVisible(true);//显示出牌菜单,包括”不出“,”出牌“
            m_typeTem = PaiDuanPaiXing();//获得玩家出的牌的牌型,这个函数在cocos2dx《单机斗地主》源码解剖之六 玩家(人)的出牌中有解释。
            if(!m_npcOne->getIsOutPk() && !m_npcTwo->getIsOutPk())//如果两个电脑玩家没出过牌,设”不出“按钮不可点,反应则然。
                ((CCMenuItemFont *)m_chuPaiMenu->getChildByTag(0))->setEnabled(false);
            else
                ((CCMenuItemFont *)m_chuPaiMenu->getChildByTag(0))->setEnabled(true);
            //出牌
            if(!m_npcOne->getIsOutPk() && !m_npcTwo->getIsOutPk())
            {
                //清除所有出的牌
                ClearOutPk();//下面贴代码
                if (m_typeTem != ERROR_CARD)//ERROR_CARD为错误的牌型
                    ((CCMenuItemFont *)m_chuPaiMenu->getChildByTag(1))->setEnabled(true);
                else
                    ((CCMenuItemFont *)m_chuPaiMenu->getChildByTag(1))->setEnabled(false);
            }
            else //跟牌
            {
                if(m_arrPlayerOut->count() != 0)
                {
                    Poker* pk = (Poker*)m_arrGenPk->objectAtIndex(0);//要跟的牌
                    Poker* pk1 = (Poker*)m_arrPlayerOut->objectAtIndex(0);//玩家出的牌
                    if(m_typeTem == m_type && pk1->getNum()>pk->getNum() || (m_typeTem==BOMB_CARD && m_type!=BOMB_CARD))//m_type为跟的牌的牌型
                        ((CCMenuItemFont *)m_chuPaiMenu->getChildByTag(1))->setEnabled(true);
                    else
                        ((CCMenuItemFont *)m_chuPaiMenu->getChildByTag(1))->setEnabled(false);
                }
                else
                    ((CCMenuItemFont *)m_chuPaiMenu->getChildByTag(1))->setEnabled(false);
            }
            
            break;
        case 1:
            m_chuPaiMenu->setVisible(false);
            if(!m_player->getIsOutPk() && !m_npcOne->getIsOutPk())
            {
                //清除所有出的牌
                ClearOutPk();
                NpcOutPoker(m_npcTwo,m_arrGenPk,m_npcTwoOut);//电脑出牌策略,函数下面解释。
            }
            else
                NpcGenPoker(m_npcTwo,m_arrGenPk ,m_npcTwoOut);//电脑跟牌策略,函数下面解释。
            PlayerOutPaiXu(m_arrGenPk);//对要跟的牌进行排序,该函数在cocos2dx《单机斗地主》源码解剖之六 玩家(人)的出牌有解释。
            PlayerOutPaiXu(m_npcTwoOut->getArrPk());//对电脑玩家出的牌进行排序
            m_npcTwoOut->updatePkWeiZhi();//更新位置
            m_npcTwo->updatePkWeiZhi();//同上
            ++m_iOutCard;
            if(IsOutPkFinish())//判断游戏是否结束,下面解释。
                m_iState = 3;
            break;
        case 2:
            if(!m_player->getIsOutPk() && !m_npcTwo->getIsOutPk())
            {
                //清除所有出的牌
                ClearOutPk();
                NpcOutPoker(m_npcOne,m_arrGenPk,m_npcOneOut);
            }
            else
                NpcGenPoker(m_npcOne,m_arrGenPk,m_npcOneOut);
            PlayerOutPaiXu(m_arrGenPk);
            Player
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值