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