QList<card> Method::PlayBeatHand(Hand hand)
{
// 先固定住最优顺子,从余下牌中打出
QList<card> left = m_cards;
//查找最优顺子并且从当前牌中移除
QList<QList<card> > cardlll=Method(m_player,left).PickOptimalSeqSingles();
for(int i=0;i<cardlll.size();i++)
for(int j=0;j<cardlll[i].size();j++ )
left.removeOne(cardlll[i][j]);
//left.Remove(Method(m_player, left).PickOptimalSeqSingles());
//压单牌
if (hand.getHandType() == Hand_Single) // 如果压单牌,尽量从单张牌中挑
{
QList<QList<card> > singleArray = Method(m_player, left).FindCardsByCount(1);
for (int i = 0; i < singleArray.size(); i++)
{
if (Hand(singleArray[i]).Defeat(hand))
{
return singleArray[i];
}
}
}
//压双排
else if (hand.getHandType() == Hand_Pair) // 如果压双牌,尽量从双牌中挑
{
QList<QList<card> > pairArray = Method(m_player, left).FindCardsByCount(2);
for (int i = 0; i < pairArray.size(); i++)
{
if (Hand(pairArray[i]).Defeat(hand))
{
return pairArray[i];
}
}
}
Player* nextPlayer = m_player->getNextPlayer();
//从手牌中查找相同牌型
QList<QList<card> > beatCardsArray = Method(m_player, left).FindHand(hand, true);
if (!beatCardsArray.isEmpty())
{
//角色不同的话出最大的牌
if (m_player->getRole() != nextPlayer->getRole() &&
nextPlayer->getCards().size() <= 2)
{
return beatCardsArray.back();
}
//角色相同的话出最小的牌
else
{
return beatCardsArray.front();
}
}
else // 余下牌没法打时,只好从顺子中挑牌
{
beatCardsArray = Method(m_player, m_cards).FindHand(hand, true);
if (!beatCardsArray.isEmpty())
{
if (m_player->getRole() != nextPlayer->getRole() &&
nextPlayer->getCards().size() <= 2)
{
return beatCardsArray.back();
}
else
{
return beatCardsArray.front();
}
}
}
// 对家剩牌小于3张,有炸则炸
Player* hitPlayer = m_player->getHitPlayer();
if (m_player->getRole() != hitPlayer->getRole())
{
if (hitPlayer->getCards().size() <= 3)
{
QList<QList<card> > bombs = FindCardsByCount(4);
if (!bombs.isEmpty())
{
return bombs[0];
}
}
}
QList<card> empty;
empty.clear();
return empty;
}
//已经找到能打败上家的牌了
bool Method::WhetherToBeat(QList<card> &myCards)
{
if (myCards.isEmpty()) return true;
Player* hitPlayer = m_player->getHitPlayer();
QList<card> hitCards = m_player->getHitCards();
if (m_player->getRole() == hitPlayer->getRole()) // punch的是同家
{
QList<card> left = m_cards;
for(int i=0;i<myCards.size();i++)
left.removeOne(myCards[i]);
if (Hand(left).getHandType() != Hand_Unknown) return true;
CardPoint basePoint = CardPoint(Hand(myCards).getBasePoint());
if (basePoint == Card_2 || basePoint == Card_SJ || basePoint == Card_BJ)
{
return false;
}
}
else // punch的是对家
{
Hand myHand(myCards);
if ( (myHand.getHandType() == Hand_Triple_Single || myHand.getHandType() == Hand_Triple_Pair) &&
(myHand.getBasePoint() == Card_2) ) // 三个2就不打出去了
{
return false;
}
if (myHand.getHandType() == Hand_Pair && myHand.getBasePoint() == Card_2 &&
hitPlayer->getCards().size() >= 10 && m_player->getCards().size() >= 5)
{
return false;
}
}
return true;
}
来源:CSDN
作者:延卿
链接:https://blog.csdn.net/fanhenghui/article/details/103663209