huclass Dll版

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();
                    }
                }
            }
        }
    }
}

转载于:https://my.oschina.net/u/3516766/blog/917344

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值