关于C++麻将胡牌算法的问题

最近在网上下载了一个用C++写的麻将程序,研究了两天,发现其中的胡牌算法存在问题,现象是总是不能胡牌。现把算法部分代码贴出来看看,你们能发现问题在哪吗?

//胡牌函数
int CardCanHu(int IsPlayerOrPC) 
{
    int length = Player.size() - 1;
    int first = 0;

    while (first != length) 
    {
        for (int second = first + 1; second <= length; second++)//
        {
            if (Player[first].Number == Player[second].Number)// 第N次取将
            {
                vector <Card> temp(Player);
                temp.erase(temp.begin() + first);
                //temp.erase(temp.begin() + first);
                temp.erase(temp.begin() + second - 1);
                vector <Card> temp1(temp);

                while (!temp1.empty())// 移除对将之后还剩下有牌
                {
                    if (((*temp1.begin()).Number == (*(temp1.begin() + 1)).Number == (*(temp1.begin()                                                                                      +   2)).Number) ||       //一刻
                        ((*temp1.begin()).Number + 1 == (*(temp1.begin() + 1)).Number &&
                         (*temp1.begin()).Number + 2 == (*(temp1.begin() + 2)).Number)) //顺子
                    {
                        temp1.erase(temp1.begin());// erase 操作之后指针会前移一位
                        temp1.erase(temp1.begin());
                        temp1.erase(temp1.begin());
                    }
                    else
                    if (temp1.empty()) 
                    {
                        cout << "是否要胡牌?Y/N" << endl;
                        char YorN;
                        cin >> YorN;
                        if (YorN == 'Y' || YorN == 'y') {
                            return 1;//可以胡牌返回1
                        }
                        else if (YorN == 'N' || YorN == 'n') {
                            return 0;
                        }
                        else {
                            return 0;
                        }
                    }
                    else
                    if (((*temp1.begin()).Number != (*(temp1.begin() + 1)).Number) || 
                        ((*temp1.begin()).Number + 1 != (*(temp1.begin() + 1)).Number)) 
                    {
                        break;
                    }
                }// 移除对将之后还剩下有牌
            }// 取将
        }

        first++;// 从当前推断的将牌组合不适合胡牌. 往前推进一步,  
                // 如果条件允许就继续检查牌中另外的将牌组合是否能胡牌;
                // 如果不允许则表示已经查遍了所有手牌, 没有胡牌的可能
    }// 循环控制块

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值