예제 #1
0
        //出顺子或连对的提示(可拆版本)//必须先按牌从大到小排序
        private List <Card> StraightOrTwo_CanDepatch_Remind(ref List <Card> deck, CardStyle cs, bool remindflag, int straightOrTwo, bool isPlayer)
        {
            List <Card> reminderList = new List <Card>();

            ChangeOrder(ref deck, 0);
            int  length = cs.cardlength, i = deck.Count - 1, recordi = 0;
            bool isRobertCanOut = true;

            while (i >= 0)
            {
                for (; i >= 0; i -= deck[i].cardnum)
                {
                    if (deck[i].size > cs.size && deck[i].cardnum >= straightOrTwo)
                    {
                        int j = i, len = 1, k = j - deck[j].cardnum;
                        //没有到底,数量超过cardnum,长度要够上一家出的牌,要连在一起,最高是A
                        while (k >= 0 && deck[k].cardnum >= straightOrTwo && len < length && deck[j].size == deck[k].size - 1 && deck[k].size <= 14)
                        {
                            len++;
                            j = k;
                            k = j - deck[j].cardnum;
                        }
                        if (len == length)  //如果找到
                        {
                            int not_single_num = 0, single_num = 0;
                            for (k = i; k >= j; k = k - deck[k].cardnum)
                            {
                                single_num++;
                                for (int num = 0; num < straightOrTwo; num++) //加入出牌队列
                                {
                                    reminderList.Add(deck[k - num]);
                                }
                                if (deck[k].cardnum == straightOrTwo + 1)  //判断是否拆了不是单支或是顺子
                                {
                                    not_single_num++;
                                }
                                if (deck[k].cardnum >= 4 && deck[k].cardnum - straightOrTwo < 4)   //判断有没有拆炸弹
                                {
                                    isRobertCanOut = false;
                                }
                            }
                            //如果拆的个数超过1个,不让拆
                            if (single_num < not_single_num * 2 + 1)
                            {
                                isRobertCanOut = false;
                            }
                            recordi = i - deck[i].cardnum;  //保存当前位置,可以让它找下一个位置
                            break;
                        }
                        else
                        {
                            i = j;
                        }
                    } //if (deck[i].size >= cs.size && deck[i].cardnum >= cardnum)
                }     //for (; i >= 0; i -= deck[i].cardnum)
                if (isRobertCanOut == true || isPlayer == true || i < 0)  //如果是玩家,或者电脑可以拆的版本或者根本找不到,则跳出
                {
                    break;
                }
                else
                {
                    i = recordi;
                    reminderList.Clear();
                }
            }
            if (i < 0)  //如果没找到就清空
            {
                reminderList.Clear();
            }
            ChangeOrder(ref deck, 1);
            if (reminderList.Count == 0 && remindflag)
            {
                reminderList = Remind_LandLord.OutBumb(deck, deck.Count - 1);   //我出炸弹
            }
            return(reminderList);
        }
예제 #2
0
        //根据CardStyle进行提示打别人的牌,canOutBoom表示是否可出炸弹,isPlayer表示是否是玩家
        public List <Card> FindRemind_CrushPrevCard(List <Card> deck, CardStyle cs, Boolean canOutBoom, Boolean isPlayer)
        {
            List <Card> reminderList = new List <Card>();

            //上家出什么调用相应的提示
            switch (cs.style)
            {
            case 10:    //上家出四大天王
                break;

            case 9:    //上家出炸弹
                reminderList = Remind_LandLord.Bomb_Remind(ref deck, cs);
                break;

            case 1:    //上家出单牌
                reminderList = Remind_LandLord.Single_Remind(ref deck, cs, canOutBoom);
                break;

            case 2:    //上家出对子
                reminderList = Remind_LandLord.Two_Remind(ref deck, cs, canOutBoom);
                break;

            case 3:    //上家出三不带
                reminderList = Remind_LandLord.Three_Remind(ref deck, cs, canOutBoom);
                break;

            case 4:    //上家出三带二
                reminderList = Remind_LandLord.ThreeWithTwo_Remind(ref deck, cs, canOutBoom);
                break;

            case 5:    //上家出连对
                if (canOutBoom == true)
                {
                    reminderList = StraightOrTwo_CanDepatch_Remind(ref deck, cs, canOutBoom, 2, isPlayer);
                }
                else
                {
                    reminderList = Remind_LandLord.NextTwo_Remind(ref deck, cs, canOutBoom);
                }
                break;

            case 6:    //上家出顺子
                if (canOutBoom == true)
                {
                    reminderList = StraightOrTwo_CanDepatch_Remind(ref deck, cs, canOutBoom, 1, isPlayer);
                }
                else
                {
                    reminderList = Remind_LandLord.Straight_Remind(ref deck, cs, canOutBoom);
                }
                break;

            case 7:    //上家出飞机不带
                reminderList = Remind_LandLord.Plane_Remind(ref deck, cs, canOutBoom);
                break;

            case 8:    //上家出飞机带两对
                reminderList = Remind_LandLord.PlaneWithTwo_Remind(ref deck, cs, canOutBoom);
                break;
            }
            return(reminderList);
        }