using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CheckHu_Lib1
{
public class Hu_class
{
public bool IsJiangNeed;
public string JiangNeedValue;
public List<int> Pailist = new List<int>();
public int Pai_Tar;
public List<string> HuOutput = new List<string>();
public int BaidaNum;
public bool IsHu;
public bool IsDaHU;
private string tmp_Zhuhe;
private string tmp_ZhuheAll;
private string tmp_YupaiZhuheAll;
private string tmp_YupaiZhuhe;
private List<int> pailist = new List<int>();
private bool isHu;
public void Hu_Begin()
{
tmp_Zhuhe = "";
tmp_ZhuheAll = "";
tmp_YupaiZhuheAll = "";
tmp_YupaiZhuhe = "";
isHu = false;
BaidaNum = 0;
pailist.Clear ();
HuOutput.Clear();
JiangNeedValue = "";
JiangNeedValue = "2,5,8";
for (int i = Pailist.Count - 1; i >= 0; i--)
{
if (Pailist[i] == 1000) { BaidaNum++; } else { pailist.Add(Pailist[i]); }
}
if (Pai_Tar == 1000) { BaidaNum++; } else { pailist.Add(Pai_Tar); }
pailist.Sort();
}
//public Hu_class(List<int> _Pailist)
//{
// Pailist = _Pailist;
//}
public int Get_BaidaNum()
{
BaidaNum = 0;
for (int i = Pailist.Count - 1; i >= 0; i--)
{
if (Pailist[i] == 1000) { BaidaNum++; }
}
return BaidaNum;
}
public bool CheckHU_Normal_Baida()
{
Hu_Begin();
GetXXX(pailist);
return isHu;
}
private void GetXXX(List<int> _pailist)
{
//if (isHu) { return; }
string Yupai = "";//输出用
List<int> Tlist = new List<int>(_pailist.ToArray());//复制副本
List<int> Vlist = new List<int>(_pailist.ToArray());//复制副本
//_pailist.ForEach(lx => Vlist.Add(lx));
for (int i = Vlist.Count - 1; i > 0; i--)//去重复,减少循环次数
{
if (Vlist[i].Equals(Vlist[i - 1])) { Vlist.RemoveAt(i); }
}
List<string> found_Zhuhe = new List<string>();
int maxshun = 0;
for (int i = 0; i < Vlist.Count; i++)
{
int TT = (int)Vlist[i];
if (Tlist.Contains(TT + 1) && Tlist.Contains(TT + 2) && TT < 60) //发现顺子;小于60指字牌和花牌不计顺
{
if (maxshun == 0 || (TT - maxshun) < 3)//优化递归
{
found_Zhuhe.Add("S" + (TT).ToString());
maxshun = TT;
}
}
else if (Tlist.Count(x => x == TT) >= 3)//发现刻子
{
found_Zhuhe.Add("K" + (TT).ToString());
}
}
if (found_Zhuhe.Count == 0)//如果已经提取组合完毕
{
Yupai = "";
for (int ii = 0; ii < Tlist.Count; ii++)//输出每一种组合后最终的余牌
{
Yupai += Tlist[ii] + ",";
}
bool isIn_ZhuheAll = true;
string[] zhuheAllSplit = tmp_ZhuheAll.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
string[] zhuheSplit = tmp_Zhuhe.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < zhuheSplit.Length; i++)
{
if (!zhuheAllSplit.Contains(zhuheSplit[i]))
{
tmp_ZhuheAll += "|" + zhuheSplit[i];
isIn_ZhuheAll = false;
}
}
if (isIn_ZhuheAll == false || tmp_ZhuheAll.Count() == 0)
{
// listBox1.Items.Add(zuizongZhuheIndex.ToString() + ":" + tmp_Zhuhe);
// listBox2.Items.Add(zuizongZhuheIndex.ToString() + ":" + Yupai );
tmp_YupaiZhuheAll = "";
GetXX(Tlist);
}
}
else//如果还有组合可以提取
{
for (int i = 0; i < found_Zhuhe.Count; i++)
{
if (found_Zhuhe[i].Substring(0, 1) == "K")
{
string k = found_Zhuhe[i].Substring(1);
Tlist.Remove(int.Parse(k)); Tlist.Remove(int.Parse(k)); Tlist.Remove(int.Parse(k));
tmp_Zhuhe += "|K" + k;
GetXXX(Tlist);
tmp_Zhuhe = tmp_Zhuhe.Remove(tmp_Zhuhe.LastIndexOf("|"));
Tlist.Add(int.Parse(k)); Tlist.Add(int.Parse(k)); Tlist.Add(int.Parse(k));
Tlist.Sort();
}
else if (found_Zhuhe[i].Substring(0, 1) == "S")
{
string s = found_Zhuhe[i].Substring(1);
Tlist.Remove(int.Parse(s)); Tlist.Remove(int.Parse(s) + 1); Tlist.Remove(int.Parse(s) + 2);
tmp_Zhuhe += "|S" + int.Parse(s).ToString();
GetXXX(Tlist);
tmp_Zhuhe = tmp_Zhuhe.Remove(tmp_Zhuhe.LastIndexOf("|"));
Tlist.Add(int.Parse(s)); Tlist.Add(int.Parse(s) + 1); Tlist.Add(int.Parse(s) + 2);
Tlist.Sort();
}
}
}
}
private void GetXX(List<int> _Yupailist)
{
// if (isHu) { return; }
string ShengPai = "";
//int Jiang = 0;
//if ((_Yupailist.Count + _BaidaNum) == 2) { return; }
List<string> found_Zhuhe = new List<string>();
List<int> Tlist = new List<int>(_Yupailist.ToArray());//复制副本
List<int> Vlist = new List<int>(_Yupailist.ToArray());//复制副本
//_pailist.ForEach(lx => Vlist.Add(lx));
for (int i = Vlist.Count - 1; i > 0; i--)//去重复,减少循环次数
{
if (Vlist[i].Equals(Vlist[i - 1])) { Vlist.RemoveAt(i); }
}
for (int i = 0; i < Vlist.Count; i++)
{
int TT = (int)Vlist[i];
if (Tlist.Count(x => x == TT) > 1)//发现对子
{
found_Zhuhe.Add("D" + (TT).ToString());
}
if (Tlist.Contains(TT + 1))//发现相邻
{
found_Zhuhe.Add("Z" + TT.ToString());
}
if (Tlist.Contains(TT + 2))//发现隔一
{
found_Zhuhe.Add("z" + TT.ToString());
}
}
if (found_Zhuhe.Count == 0)//递归出口
{
ShengPai = "";
for (int ii = 0; ii < Tlist.Count; ii++)//输出每一种组合后最终的剩牌
{
ShengPai += "|X" + Tlist[ii];
}
bool isIn_ZhuheAll = true;
string[] zhuheAllSplit = tmp_YupaiZhuheAll.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
string[] zhuheSplit = tmp_YupaiZhuhe.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < zhuheSplit.Length; i++)//只要出现过的组合不再重复列出
{
if (!zhuheAllSplit.Contains(zhuheSplit[i]))
{
tmp_YupaiZhuheAll += "|" + zhuheSplit[i];
isIn_ZhuheAll = false;
}
}
#region //计算百搭个数是否满足胡牌条件
if (isIn_ZhuheAll == false || tmp_YupaiZhuheAll == "")//当新的组合时
{
bool tmp_isHu = false;
int Xnum = Tlist.Count;
int Dnum = tmp_YupaiZhuhe.Count(num => num == 'D');
int Znum = tmp_YupaiZhuhe.Count(num => num == 'Z') + tmp_YupaiZhuhe.Count(num => num == 'z');
if (Xnum == 0 && Dnum == 0)//当有单张或一对时
{
if (BaidaNum >= (Znum + 2))//等于时将是一对百搭,大于时是3个百搭自成一组,这时可以不考虑将的要求
{
tmp_isHu = true;
}
}
else
{
if (JiangNeedValue == "")//如果对将没有要求
{
if (BaidaNum >= (Znum + Dnum - 1 + Xnum * 2)) { tmp_isHu = true; }
}
else//如果对将有要求,比如"2,5,8"
{
if (BaidaNum > (Znum + Dnum - 1 + Xnum * 2)) { tmp_isHu = true; }//3个百搭自成一组,满足将的要求
else if (BaidaNum == (Znum + Dnum - 1 + Xnum * 2))//百搭正好够用
{
for (int i = 0; i < zhuheSplit.Length; i++)//对子或单个的值是否在将要求的值的范围内
{
if (zhuheSplit[i].Substring(0, 1) == "D" && JiangNeedValue.Contains(zhuheSplit[i].Substring(2, 1)))
{ tmp_isHu = true; }
if (zhuheSplit[i].Substring(0, 1) == "X" && JiangNeedValue.Contains(zhuheSplit[i].Substring(2, 1)))
{ tmp_isHu = true; }
}
}
}
if (tmp_isHu) { isHu = true; }//只要有一种组合方案可以胡牌,该牌型即算胡了
string huhu = null;
if (tmp_isHu) { huhu = " 胡了"; } else { huhu = " 不胡"; }
HuOutput.Add(tmp_Zhuhe + tmp_YupaiZhuhe + ShengPai + huhu);
// listBox1.Items.Add(tmp_Zhuhe);//输出XXX组合的提取情况
// listBox2.Items.Add(tmp_YupaiZhuhe + ShengPai + ";" + BaidaNum.ToString() + tmp_isHu.ToString());//输出剩牌情况
}
}
#endregion
}
else//继续找下一层的组合
{
for (int i = 0; i < found_Zhuhe.Count; i++)
{
if (found_Zhuhe[i].Substring(0, 1) == "D")
{
string D = found_Zhuhe[i].Substring(1);
Tlist.Remove(int.Parse(D)); Tlist.Remove(int.Parse(D));
tmp_YupaiZhuhe += "|D" + D;
GetXX(Tlist);
tmp_YupaiZhuhe = tmp_YupaiZhuhe.Remove(tmp_YupaiZhuhe.LastIndexOf("|"));
Tlist.Add(int.Parse(D)); Tlist.Add(int.Parse(D));
Tlist.Sort();
}
else if (found_Zhuhe[i].Substring(0, 1) == "Z")
{
string Z = found_Zhuhe[i].Substring(1);
Tlist.Remove(int.Parse(Z)); Tlist.Remove(int.Parse(Z) + 1);
tmp_YupaiZhuhe += "|Z" + int.Parse(Z).ToString();
GetXX(Tlist);
tmp_YupaiZhuhe = tmp_YupaiZhuhe.Remove(tmp_YupaiZhuhe.LastIndexOf("|"));
Tlist.Add(int.Parse(Z)); Tlist.Add(int.Parse(Z) + 1);
Tlist.Sort();
}
else if (found_Zhuhe[i].Substring(0, 1) == "z")
{
string z = found_Zhuhe[i].Substring(1);
Tlist.Remove(int.Parse(z)); Tlist.Remove(int.Parse(z) + 2);
tmp_YupaiZhuhe += "|z" + int.Parse(z).ToString();
GetXX(Tlist);
tmp_YupaiZhuhe = tmp_YupaiZhuhe.Remove(tmp_YupaiZhuhe.LastIndexOf("|"));
Tlist.Add(int.Parse(z)); Tlist.Add(int.Parse(z) + 2);
Tlist.Sort();
}
}
}
}
}
}