//出顺子或连对的提示(可拆版本)//必须先按牌从大到小排序 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); }
//根据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); }