最近在网上下载了一个用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;
}