斗地主中查找最优顺子的逻辑分析

QList<QList<card> > Method::PickOptimalSeqSingles()
{
    QList<QList<QList<card> > > seqRecord;
    QList<QList<card> > seqInherited;
    Method(m_player, m_cards).PickSeqSingles(seqRecord, seqInherited, m_cards);//递归查找出所有可能的顺子
    if (seqRecord.isEmpty())
    {
        return QList<QList<card> >();
    }

    QMap<int, int> seqMarks;
    for (int i = 0; i < seqRecord.size(); i++)
    {
        QList<card> backupCards = m_cards;
        QList<QList<card> > seqArray = seqRecord[i];
        for(int l=0;l<seqArray.size();l++)
        {
            for(int j=0;j<seqArray[l].size();j++)
            {
                backupCards.removeOne(seqArray[l][j]);
            }
        }//从顺子牌中移除顺子

        QList<QList<card> > singleArray = Method(m_player, backupCards).FindCardsByCount(1);//找到移除顺子后的所有单牌

        QList<card> cardList;
        for (int j = 0; j < singleArray.size(); j++)
        {
            for(int i=0;i<singleArray[j].size();i++)
                cardList<<singleArray[j][i];

        }

        int mark = 0;
        for (int j = 0; j < cardList.size(); j++)
        {
            mark += cardList[j].point + 15;
        }//计算出剩余单牌的总分
        seqMarks.insert(i, mark);
    }

    int index = 0;
    int compMark = 1000000;
    QMap<int, int>::ConstIterator it = seqMarks.constBegin();
    //依次比较所有可能情况下的评分,选出剩余牌评分最低的顺子出牌
    for (; it != seqMarks.constEnd(); it++)
    {
        if (it.value() < compMark)
        {
            compMark = it.value();
            index = it.key();
        }
    }

    return seqRecord[index];
}

97 70 48

9 9 10 10 J Q Q K A

9 10 11 12 13    9 10 Q A
9 10 11 12 13 A  9 10 Q
10 11 12 13 A    9 9 10 Q

22 23 25 27  97
22 23 25     70
23 25        48

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值