using GameData;
using MrWu.Debug;
using PdkFriendServer.GlobalManager;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using GameMessage.PaoDeKuaiF;
using GameFix.PaoDeKuaiF;
using GameMessage;
using Server.Data;

namespace PdkFriendServer.Logic
{
    /// <summary>
    /// 跑得快朋友房主逻辑
    /// </summary>
    public partial class PdkGameMain
    {
        /// <summary>
        /// 游戏主包
        /// </summary>
        public PdkGamePack GamePack;

        /// <summary>
        /// 服务器本地内存
        /// </summary>
        public LogicMemory logicMemory;

        /// <summary>
        /// 规则
        /// </summary>
        public PdkRule Rule;

        /// <summary>
        /// 桌子对象
        /// </summary>
        public PdkGameDo DeskGameDo = null;

        public PdkGameMain(PdkGameDo _gamedo)
        {
            this.DeskGameDo = _gamedo;
            this.GamePack = new PdkGamePack();
        }

        /// <summary>
        /// 游戏开始
        /// </summary>
        public void GameStart()
        {
            byte shangyou = 0; //上游位置，从1开始
            byte overJu = (byte)(this.DeskGameDo == null ? 0 : DeskGameDo.GetDeskInt(8)); //打完了几局，0就是一局都没有打完，也就是首局
            shangyou = GamePack.Info.OverPos;
            var tg = GamePack.Info.PlayTuoGauan;
            GamePack = new PdkGamePack();
            if (this.DeskGameDo != null)
            {
                SetFriendGz();
                GamePack.Init(GamePack.Info.PlayNum);
            }
            else
            { //测试的规则
                GamePack.Init(3);
                GamePack.Info.PlayNum = 3;
                //设置玩法规则
                Rule = new PdkRule();
                Rule.GuanPai = true; //经典玩法
                Rule.BiYa = true;//不必压
                Rule.ShouJu3 = true;
                Rule.SiDai3 = true;
                Rule.BaoZhuang = true;
                Rule.ZhaDanDeFen = true;
            }
            LoadInit();
            if (overJu == 0)
            {
                logicMemory.BombCount = 0;
            }
            logicMemory.WarCount = overJu;
            logicMemory.ShangYou = shangyou;
            if (overJu != 0)
            {
                GamePack.Info.PlayTuoGauan = tg;
            }
            GamePack.Info.GameZT = 2;
            Log(Rule.ToString());
            //this.GameFaPai(); //屏蔽掉，让dotime驱动流程玩下周
        }

        /// <summary>
        /// 设置规则自动准备时间
        /// </summary>
        void SetAutoReadTime()
        {
            if (this.Rule.TuoGuanNum <= 0) return;
            if (this.DeskGameDo == null) return;
            if (this.DeskGameDo.desk == null) return;
            if (this.DeskGameDo.desk.deskinfo == null) return;
            if (this.DeskGameDo.desk.deskinfo.rule == null) return;
            if (this.DeskGameDo.desk.deskinfo.rule.RuleEx == null) return;
            // if (!this.DeskGameDo.desk.deskinfo.rule.RuleEx.DepositAutoDissolve) return;
            if (this.DeskGameDo.desk.deskinfo.rule.RuleEx.AutoDeposit > 0) return;
            this.DeskGameDo.desk.deskinfo.rule.RuleEx.AutoDeposit = this.Rule.TuoGuanNum * 60;
        }

        /// <summary>
        /// 计时器 1秒钟执行一次
        /// </summary>
        public void DoTime()
        {
            SetAutoReadTime();
            switch (GamePack.Info.GameZT)
            {
                //case 1:
                //    GameStart();
                //    break;
                case 2:
                    GameFaPai();
                    break;
                case 3:
                    BaoZhuangTuoGuan();
                    break;
                case 4:
                    //if (Rule.TuoGuanNum > 0)
                    //{//需要托管
                    DaPaiTuoGuan();
                    //}
                    //玩家先手，并且是最后一张牌，就自动帮玩家出牌
                    if (GamePack.Info.MaxPlayCard.GameNum <= 0)
                    {
                        var cards = GamePack.CardPack.Cards[GamePack.Info.WhoPlay - 1].CardInfos.Where(x => x.GameState == 1).ToArray();
                        var b = PdkCardAlgorithm.GetOutCard(cards, cards, Rule, out var payCard);
                        var zhad = PdkCardAlgorithm.IsHaveBomb(cards, Rule.AAAIsZhaDan);
                        if (b && payCard.Ids.Length == cards.Length && payCard.Type != CardType1.SiDai2 && payCard.Type != CardType1.SiDai3 && !zhad)
                        {
                            payCard.Pos = (byte)GamePack.Info.WhoPlay;
                            GamePack.Info.ActivePlayCard = payCard;
                            Log($"最后一张牌，就自动帮玩家出牌 who:{GamePack.Info.WhoPlay}先出 ,托管出的牌：{payCard}");
                            GamePack.Info.ActivePlayCard = payCard;
                            Debug.Info("最后一手GameDo");
                            GameDo();
                        }
                    }
                    break;
                case 5:
                    if (this.TimeNum >= 2)
                    {
                        GameOver();
                    }
                    break;
                default:
                    // Log("DoTime default ！");
                    break;
            }
            TimeNum++;
        }

        /// <summary>
        /// 游戏发牌
        /// </summary>
        public void GameFaPai()
        {
            byte bc = 0; //计算这局的炸弹个数
            for (int i = 0; i < 20; i++)
            {
                if (i > 0)
                {
                    Log($"发牌i:{i} bnum:{bc} lc:{logicMemory.BombCount}", DebugLevel.ImportantLog);
                }
                InitCard();
                bc = 0;
                bool b = false;
                for (int j = 0; j < GamePack.Info.PlayNum; j++)
                {
                    byte bnum = CalcPlayBombRule(j);
                    Log($"玩家:{j},bombCount:{bnum}");
                    //if (bnum > 1) //单个人一手牌不能有超过2个炸弹
                    //{
                    //    bc += (byte)bnum;
                    //    break;
                    //}
                    if (bnum > 0)
                    {
                        bc += bnum;
                    }
                }
                if (logicMemory.BombCount + bc <= 1)
                {
                    logicMemory.BombCount += bc;
                    b = true;
                }
                if (b)
                {
                    break;
                }
            }
            CheckFeiJi();
            if (Rule.HongTao10ZhaNiao)
            { //红桃十扎鸟
                GamePack.Info.HongTaoShiPos = GetHongTaoShiPos();
            }
            if (Rule.MeiJu3)
            { //每局黑桃3出
                GamePack.Info.FistPlay = GetHeiTao3Pos();
                Log($"第一个出牌位置：{GamePack.Info.FistPlay}");
            }
            else if (Rule.ShouJu3)
            { //首局黑桃三先出，下局赢家出
                GamePack.Info.FistPlay = logicMemory.WarCount == 0 ? GetHeiTao3Pos() : logicMemory.ShangYou;
                Log($"第一个出牌位置：{GamePack.Info.FistPlay},开始次数：{logicMemory.WarCount}，上游玩家：{logicMemory.ShangYou}");
            }
            GamePack.Info.WhoPlay = GamePack.Info.FistPlay;
            GamePack.Info.GameZT = (byte)(Rule.BaoZhuang ? 3 : 4);
            TimeNum = 0;
            SendPack();
        }

        /// <summary>
        /// 包庄流程
        /// </summary>
        public void GameBaoZhuang()
        {
            int bcount = 0;//包庄的人数
            byte[] pos = new byte[GamePack.Info.PlayNum]; //包庄人的位置 
            bool zhuangB = false;
            if (GamePack.Info.BaoZhuang[GamePack.Info.FistPlay - 1] == 1)
            { //庄家包庄了，直接进入下一流程
                GamePack.Info.WhoPlay = GamePack.Info.FistPlay;
                GamePack.Info.BaoPos = GamePack.Info.WhoPlay;
                GamePack.Info.GameZT = 4; //进入打牌
                SetFalseOperation();
                SendPack();
                return;
            }
            else
            {
                for (byte i = 0; i < GamePack.Info.PlayNum; i++)
                {
                    if (GamePack.Info.BaoZhuang[i] == 0)
                    {
                        // GamePack.Info.WhoPlay = GetNextPos(GamePack.Info.WhoPlay);
                        SendPack();
                        return; //还有玩家没有操作，不处理流程
                    }
                    if (GamePack.Info.BaoZhuang[i] == 1)
                    {
                        pos[bcount] = (byte)(i + 1);
                        if (!zhuangB && pos[bcount] == GamePack.Info.FistPlay)
                        {
                            zhuangB = true;
                        }
                        bcount++;
                    }
                }
            }

            if (bcount == 1)
            {
                GamePack.Info.WhoPlay = pos[0];
                GamePack.Info.BaoPos = GamePack.Info.WhoPlay;
            }
            else if (bcount > 1)
            { //多个人包庄
                if (zhuangB)
                {//如果庄家包庄了，那么就是庄家为包庄
                    GamePack.Info.WhoPlay = GamePack.Info.FistPlay;
                }
                else
                { //如果没有包庄的话，那么靠近庄家的下一家为包庄玩家
                    byte npos = GetNextPos(GamePack.Info.FistPlay); //庄的下家
                    for (int j = 0; j < pos.Length; j++)
                    {
                        bool b = false;
                        for (byte i = 0; i < pos.Length; i++)
                        {
                            if (pos[i] == npos)
                            {
                                GamePack.Info.WhoPlay = pos[i];
                                b = true;
                                break;
                            }
                        }
                        if (!b)
                        {
                            npos = GetNextPos(npos);
                        }
                        else
                        {
                            break;
                        }
                    }

                }
                GamePack.Info.BaoPos = GamePack.Info.WhoPlay;
            }
            Log($"进入打牌，play:{GamePack.Info.WhoPlay} ，包庄玩家的位置：{GamePack.Info.BaoPos}");
            GamePack.Info.GameZT = 4; //进入打牌
            SetFalseOperation();
            SendPack();
        }

        /// <summary>
        /// 打牌流程
        /// </summary>
        void GameDaPai()
        {
            Log("进入打牌流程,玩家出牌内容是：" + GamePack.Info.ActivePlayCard.ToString());
            //如果玩家有出牌：1修改牌内存，2修改最大出牌信息
            //记录炸弹计分
            //判断一轮打完
            //判断一局游戏打完
            //转换控制权 一个玩家出完牌后 
            byte chupaiPos = 0;
            if (GamePack.Info.ActivePlayCard.Type != CardType1.None)
            {
                chupaiPos = GamePack.Info.ActivePlayCard.Pos;
                SetCardToOut(GamePack.Info.ActivePlayCard.Pos, GamePack.Info.ActivePlayCard.Ids);
                if (Rule.ZhaDanDeFen && GamePack.Info.ActivePlayCard.Type == CardType1.ZhaDan)
                {
                    //炸弹得分，并且出的是炸弹
                    /*炸弹+10：打出炸弹+10分，不勾选0分
                   在有大必压得玩法下，一轮中打出的炸弹只算当局最大的炸弹分，
                    不必压得玩法下，只要打出炸弹都算分*/
                    AddZhaDanCount(GamePack.Info.ActivePlayCard.Pos, 1);
                    //  GamePack.Info.ZhaDans[GamePack.Info.ActivePlayCard.Pos - 1]++;
                    if (Rule.BiYa && GamePack.Info.MaxPlayCard.Type == CardType1.ZhaDan)
                    {
                        //把之前加的炸弹减回去。
                        //GamePack.Info.ZhaDans[GamePack.Info.MaxPlayCard.Pos - 1]--;
                        AddZhaDanCount(GamePack.Info.MaxPlayCard.Pos, -1);
                    }
                }
                GamePack.Info.MaxPlayCard = GamePack.Info.ActivePlayCard;
            }
            if (IsGameOver(chupaiPos))
            { //游戏是否结束
                SendPack();
                this.TimeNum = 0;
                GamePack.Info.GameZT = 5;
                // GameOver(); 修改为定时器驱动
                return;
            }
            GamePack.Info.WhoPlay = GetNextPos(GamePack.Info.WhoPlay);
            Debug.Info($"当前玩家：{GamePack.Info.WhoPlay},下一个出牌的人:{GamePack.Info.WhoPlay}");
            if (GamePack.Info.WhoPlay == GamePack.Info.MaxPlayCard.Pos)
            {  //一轮结束
                Log("一轮结束");
                GamePack.Info.MaxPlayCard.Pos = 0;
                GamePack.Info.MaxPlayCard.GameNum = 0;
                GamePack.Info.MaxPlayCard.Type = CardType1.None;
                GamePack.Info.MaxPlayCard.Ids = null;
            }
            SendPack();
        }

        void GameOver()
        {
            Log($"进入结算 bao:{GamePack.Info.BaoPos},overpos:{GamePack.Info.OverPos}");
            int count = 0;
            if (Rule.JingDianWanFa || Rule.GuanPai)
            {
                count = 16;
            }
            if (Rule.Zhang15)
            {
                count = 15;
            }

            if (GamePack.Info.BaoPos > 0)
            {  //有人包庄
                var baoWin = GamePack.Info.BaoPos == GamePack.Info.OverPos;
                Log($"baowin:{baoWin}");
                for (int i = 0; i < GamePack.Info.PlayNum; i++)
                {
                    if (i + 1 != GamePack.Info.BaoPos)
                    { //先统计闲家
                        int bei = GamePack.Info.HongTaoShiPos == i + 1 || GamePack.Info.HongTaoShiPos == GamePack.Info.BaoPos ? 4 : 2; //红桃十扎鸟
                        GamePack.Info.Score[i] += (baoWin ? 0 - count * bei : count * bei);
                    }
                }
            }
            else
            {
                for (int i = 0; i < GamePack.Info.PlayNum; i++)
                {//先统计闲家
                    if (i + 1 != GamePack.Info.OverPos)
                    {
                        if (GamePack.Info.ShenYuCard[i] == 1) continue;
                        var bei = GamePack.Info.HongTaoShiPos == i + 1 || GamePack.Info.HongTaoShiPos == GamePack.Info.OverPos ? 2 : 1;//红桃十扎鸟
                        var num = GamePack.Info.ShenYuCard[i] == count ? count * 2 : GamePack.Info.ShenYuCard[i];
                        GamePack.Info.Score[i] += 0 - num * bei;
                    }
                }
            }

            for (int i = 0; i < GamePack.Info.PlayNum; i++)
            {
                if (i + 1 == (GamePack.Info.BaoPos > 0 ? GamePack.Info.BaoPos : GamePack.Info.OverPos))
                { //统计庄家，把闲家的都加起来就是庄家的输赢
                    for (int j = 0; j < GamePack.Info.PlayNum; j++)
                    {
                        if (j == i) continue;
                        GamePack.Info.Score[i] -= GamePack.Info.Score[j];
                    }
                }
            }

            for (int i = 0; i < GamePack.Info.PlayNum; i++)
            {
                if (GamePack.Info.ZhaDans[i] != 0)
                {
                    GamePack.Info.Score[i] += (GamePack.Info.ZhaDans[i] * 10);
                }
            }
            //处理托管罚分
            var fafen = GetTuoGuanFaFen();
            if (fafen > 0)
            {
                var tgPos = GetTuoGuanPlay();
                if (tgPos >= 0)
                { //有玩家托管
                    //int fen = fafen / (GamePack.Info.PlayNum - 1);
                    for (int i = 0; i < GamePack.Info.PlayNum; i++)
                    {
                        if (i == tgPos)
                        {
                            GamePack.Info.Score[i] -= (fafen * (GamePack.Info.PlayNum - 1));
                        }
                        else
                        {
                            GamePack.Info.Score[i] += fafen;
                        }
                    }
                }
            }
#if DEBUG
            for (int i = 0; i < GamePack.Info.PlayNum; i++)
            {
                Log($"玩家：{(i + 1)} ，输赢：{GamePack.Info.Score[i]}");
            }
#endif

            if (DeskGameDo != null)
            {
                DeskGameDo.GameOver();
            }
        }

        /// <summary>
        /// 是否托管罚分
        /// </summary>
        /// <returns>0不罚分 </returns>
        int GetTuoGuanFaFen()
        {
            if (this.DeskGameDo == null || this.DeskGameDo.desk == null || this.DeskGameDo.desk.deskinfo == null || this.DeskGameDo.desk.deskinfo.rule == null ||
                this.DeskGameDo.desk.deskinfo.rule.RuleEx == null) return 0;
            return this.DeskGameDo.desk.deskinfo.rule.RuleEx.DepositAutoDissolve ? this.DeskGameDo.desk.deskinfo.rule.RuleEx.OutLinePenaltyPoint : 0;
        }

        /// <summary>
        /// 找打托管的玩家
        /// </summary>
        /// <returns>从0开始 -1未找到</returns>
        int GetTuoGuanPlay()
        {
            return DeskGameDo.GetPlayerFirstDepositSeat();
            //var desk = DeskGameDo.GetDesk();
            //for (int i = 0; i < GamePack.Info.PlayNum; i++)
            //{
            //    if (desk[i] != null && desk[i].isDePosit)
            //    {//找到在 托管的玩家
            //        return i;
            //    }
            //}
            //return -1;
        }


        /// <summary>
        /// 游戏发包，发全包
        /// </summary>
        void SendPack()
        {
            Log($"whoPlay:{GamePack.Info.WhoPlay}");
            if (DeskGameDo == null)
            {
                var str = JsonPack.GetJson(this.GamePack);
                File.WriteAllText(@"C:\Users\Administrator\Desktop\temp\gamepack.txt", str);
                var path = $@"C:\Users\Administrator\Desktop\temp\test\gamepack{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff")}.txt";
                Log("保存文件：" + path);
                File.WriteAllText(path, str);
                WaitWanJiaShuRu(); //等玩家输入。模拟玩家打牌
            }
            else
            {
                SetOperation();
                DeskGameDo.SendGamePack();
            }
        }

        void SetFalseOperation()
        {
            for (int i = 0; i < GamePack.Info.PlayNum; i++)
            {
                this.SetWaitOperation(i, false);
            }
        }

        public void SetOperation()
        {
            for (int i = 0; i < GamePack.Info.PlayNum; i++)
            {

                var pl = this.DeskGameDo.desk[i];
                if (pl != null)
                {
                    GamePack.Info.PlayTuoGauan[i] = (byte)(pl.isDePosit ? 1 : 0);
                }
                bool b = false; //包庄流程是同时进行的
                if (GamePack.Info.GameZT == 3)
                {
                    b = GamePack.Info.BaoZhuang[i] == 0;
                }
                this.SetWaitOperation(i, GamePack.Info.GameZT == 3 ? b : i + 1 == GamePack.Info.WhoPlay);
            }

        }

        /// <summary>
        /// 设置玩家的操作权
        /// </summary>
        /// <param name="seat">下标从0开始</param>
        /// <param name="waitOperation"></param>
        public void SetWaitOperation(int seat, bool waitOperation)
        {
            var desk = this.DeskGameDo.GetDesk();
            if (seat < 0 || seat >= desk.PlayerCnt)
            {
                return;
            }

            var pl = desk[seat];
            if (pl != null)
            {
                //之前不能操作,现在可以操作，重置托管时间
                if (!pl.WaitOperation && waitOperation)
                {
                    pl.AutoDepositTime = 0;
                }
                pl.WaitOperation = waitOperation;
            }
        }

        /// <summary>
        /// 检查包内容是否合法
        /// </summary>
        /// <param name="pack"></param>
        /// <returns></returns>
        public bool CheckPack(PdkLogicInfo pack)
        {
            if (pack.WhoPlay != GamePack.Info.WhoPlay && GamePack.Info.GameZT > 3) return false;
            switch (GamePack.Info.GameZT)
            {
                case 3: //包庄 只能输入1和2
                    return pack.BaoZhuang[pack.WhoPlay - 1] == 1 || pack.BaoZhuang[pack.WhoPlay - 1] == 2;
                case 4:
                    if (pack.WhoPlay != pack.ActivePlayCard.Pos)
                    {
                        Debug.Error($"who:{pack.WhoPlay},apos:{pack.ActivePlayCard}");
                        return false;
                    }
                    return CheckChuPai(pack.ActivePlayCard);
            }

            return true;
        }

        public void GameDo()
        {
            switch (GamePack.Info.GameZT)
            {
                //case 1:
                //    GameStart();
                //    break;
                case 2:
                    GameFaPai();
                    break;
                case 3:
                    GameBaoZhuang();
                    break;
                case 4:
                    GameDaPai();
                    break;
                case 5:
                    GameOver();
                    break;
                default:
                    Log("default GameDo game over！");
                    break;
            }
        }

        /// <summary>
        /// 等待玩家输入
        /// </summary>
        void WaitWanJiaShuRu()
        {
            if (DeskGameDo != null) return;
            //正式连客户端以后要屏蔽这些代码。return
            string str = "";
            byte num = 0;
            switch (GamePack.Info.GameZT)
            {
                case 3://包庄流程，只能输入1和2
                    Log("包庄操作 pos:" + GamePack.Info.WhoPlay);
                    while (true)
                    {
                        str = Console.ReadLine();
                        Log(str);
                        var ss = str.Split(',');
                        byte.TryParse(ss[0], out var pos);
                        byte.TryParse(ss[1], out num);
                        GamePack.Info.WhoPlay = pos;
                        GamePack.Info.BaoZhuang[pos - 1] = num;
                        if (CheckPack(GamePack.Info))
                        {
                            break; //如果包输入正确就跳走
                        }
                        else
                        {
                            Log("检测不合格，输入非法值");
                        }
                    }
                    break;
                case 4: //打牌流程
                    Log("打牌操作 pos:" + GamePack.Info.WhoPlay);
                    while (true)
                    {
                        str = Console.ReadLine(); //逗号分隔
                        var ss = str.Split(',');
                        if (ss.Length <= 0) continue;
                        Log(str);
                        var selectCards = GamePack.CardPack.Cards[GamePack.Info.WhoPlay - 1].CardInfos.Where(x => ss.Any(s => s == x.ID.ToString())).ToArray();
                        PlayOutCardPdkF payCard;
                        if (selectCards == null || selectCards.Length <= 0) //不要
                        {
                            payCard = new PlayOutCardPdkF();
                            payCard.Pos = GamePack.Info.WhoPlay;
                            payCard.Type = CardType1.None;
                            GamePack.Info.ActivePlayCard = payCard;
                            if (CheckPack(GamePack.Info))
                            {
                                break; //如果包输入正确就跳走
                            }
                            else
                            {
                                Log("检测不合格，输入非法值");
                            }

                        }
                        else if (PdkCardAlgorithm.GetOutCard(selectCards,
                            GamePack.CardPack.Cards[GamePack.Info.WhoPlay - 1].CardInfos.Where(x => x.GameState == 1).ToArray(),
                            this.Rule, out payCard))
                        {
                            payCard.Pos = GamePack.Info.WhoPlay;
                            GamePack.Info.ActivePlayCard = payCard;
                            if (CheckPack(GamePack.Info))
                            {
                                break; //如果包输入正确就跳走
                            }
                            else
                            {
                                Log("检测不合格，输入非法值");
                            }
                        }
                        else
                        {
                            Log("输入的牌不符合规则，不能出下去");
                        }
                    }
                    break;

                case 6:
                    //GameOver();
                    break;
            }
        }

        void textxxxx()
        {

            // GameStart();
            // GameFaPai();
            //PlayOutCard output = new PlayOutCard();
            //output.Pos = 1; output.Type = CardType.LianDui;
            //output.GameNum = 9;
            //output.Ids = new byte[6];
            //TCardInfo[] shoupai = new TCardInfo[16];
            //shoupai[0] = new TCardInfo() { ID = 1, GameNum = 14, Flower = 1, Num = 14, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[1] = new TCardInfo() { ID = 27, GameNum = 14, Flower = 3, Num = 14, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[2] = new TCardInfo() { ID = 26, GameNum = 13, Flower = 2, Num = 13, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[3] = new TCardInfo() { ID = 25, GameNum = 12, Flower = 2, Num = 12, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[4] = new TCardInfo() { ID = 38, GameNum = 12, Flower = 3, Num = 12, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[5] = new TCardInfo() { ID = 36, GameNum = 10, Flower = 3, Num = 10, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[6] = new TCardInfo() { ID = 49, GameNum = 10, Flower = 4, Num = 10, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[7] = new TCardInfo() { ID = 35, GameNum = 9, Flower = 3, Num = 9, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[8] = new TCardInfo() { ID = 48, GameNum = 9, Flower = 4, Num = 9, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[9] = new TCardInfo() { ID = 8, GameNum = 8, Flower = 1, Num = 8, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[10] = new TCardInfo() { ID = 34, GameNum = 8, Flower = 3, Num = 8, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[11] = new TCardInfo() { ID = 5, GameNum = 5, Flower = 1, Num = 5, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[12] = new TCardInfo() { ID = 18, GameNum = 5, Flower = 2, Num = 5, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[13] = new TCardInfo() { ID = 44, GameNum = 5, Flower = 4, Num = 5, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[14] = new TCardInfo() { ID = 16, GameNum = 3, Flower =2, Num = 3, Score = 0, GameOwer = 1, GameState = 1 };
            //shoupai[15] = new TCardInfo() { ID = 29, GameNum = 3, Flower = 3, Num = 3, Score = 0, GameOwer = 1, GameState = 1 };
            //var tishi = PdkCardAlgorithm.GetTipCard(output, shoupai, null);
            //Console.WriteLine(tishi);
        }

        /// <summary>
        /// 测试函数
        /// </summary>
        public void Test(string path = "")
        {
            //textxxxx();
            //return;
            if (File.Exists("output.txt"))
            {
                File.Delete("output.txt");
            }
            foreach (string file in Directory.GetFiles(@"C:\Users\Administrator\Desktop\temp\test"))
            {
                File.Delete(file);
            }
            bool b = true;
            GamePack.Info.GameZT = 1;
            if (!string.IsNullOrWhiteSpace(path))
            {
                GamePack = JsonPack.GetData<PdkGamePack>(File.ReadAllText(path));
            }
            while (b)
            {
                switch (GamePack.Info.GameZT)
                {
                    case 1:
                        GameStart();
                        break;
                    case 2:
                        GameFaPai();
                        break;
                    case 3:
                        GameBaoZhuang();
                        break;
                    case 4:
                        GameDaPai();
                        break;
                    case 5:
                        GameOver();
                        GamePack.Info.GameZT = 11; //进入结束就结束
                        break;
                    default:
                        b = false;
                        Log("test over！");
                        break;
                }
            }
        }


        void WriteToConsoleAndFile(StreamWriter writer, string message)
        {
            Console.WriteLine(message); // 写入控制台  
            writer.WriteLine(message); // 写入文件
        }

        public void Log(string msg, DebugLevel leve = DebugLevel.Info)
        {
            if (DeskGameDo == null)
            {
                using (StreamWriter writer = new StreamWriter("output.txt", true)) // 第二个参数为true表示追加到文件  
                {
                    WriteToConsoleAndFile(writer, $"[{DateTime.Now.ToString("G")}]:" + msg);
                }
                Thread.Sleep(1);
            }
            else
            {
                switch (leve)
                {
                    case DebugLevel.Info:
                        Debug.Info(msg);
                        break;
                    case DebugLevel.Warning:
                        Debug.Warning(msg);
                        break;
                    case DebugLevel.ImportantLog:
                        Debug.ImportantLog(msg);
                        break;
                    case DebugLevel.Error:
                        Debug.Error(msg);
                        break;
                    case DebugLevel.Fatal:
                        Debug.Fatal(msg);
                        break;
                    default:
                        Debug.Info(msg);
                        break;
                }
            }
        }
    }
}
