Beispiel #1
0
        /// <summary>
        /// 点击出牌按钮
        /// </summary>
        public void OnChuPaiClick()
        {
            //Debug.Log("<color=#0021FFFF>" + "点击出牌按钮点击出牌按钮点击出牌按钮点击出牌按钮点击出牌按钮点击出牌按钮" + "</color>");
            int[] cardArr = HdCdctrlInstance.GetUpCdList().ToArray();

            //判断是否需要检测黑三先出,如果手牌有黑三,出的牌没黑三不能出牌
            if (App.GetGameData <GlobalData>().IsHeiSanFirst)
            {
                bool hdhasHeisan = HdCdsListTemp.Any(cd => PokerRuleUtil.GetValue(cd) == 3 && PokerRuleUtil.GetColor(cd) == 4);

                if (hdhasHeisan)
                {
                    bool otcdHasHeisan = cardArr.Any(cd => PokerRuleUtil.GetValue(cd) == 3 && PokerRuleUtil.GetColor(cd) == 4);
                    if (!otcdHasHeisan)
                    {
                        ShowWarnInfo("有黑3必须先出黑3!");
                        return;
                    }
                }
            }

            if (_isRpLeftOne && cardArr.Length == 1 && HdCdsListTemp.Count > 1)
            {
                var cdsValue = PokerRuleUtil.GetSortedValues(HdCdsListTemp.ToArray());
                if (PokerRuleUtil.GetValue(cardArr[0]) != PokerRuleUtil.GetValue(cdsValue[cdsValue.Length - 1]))
                {
                    ShowWarnInfo("下家报单必须出最大!");
                    return;
                }
            }


            SendOutCdsRequest(cardArr);
        }
Beispiel #2
0
        /// <summary>
        /// 检测是否可以一次把牌全出去的牌型
        /// </summary>
        private CardType CheckCanOutCdsOneTime(CdSplitStruct hdcdSplitGp)
        {
            var cdType = PokerRuleUtil.GetCdsType(HdCdsListTemp.ToArray());

            //如果可以一次出,则直接全出
            if (cdType != CardType.None && cdType != CardType.Exception)
            {
                GlobalData.ServInstance.ThrowOutCard(HdCdsListTemp.ToArray(), new int[] { -1 }, (int)cdType);
                return(cdType);
            }

            //如果是3张或者3带1的情况直接发送出牌信息
            if (CheckOutCdsC3OrC31())
            {
                GlobalData.ServInstance.ThrowOutCard(HdCdsListTemp.ToArray(), new int[] { -1 }, (int)CardType.C32);
                return(CardType.C32);
            }

            if (CheckOutCdsC1112223434(hdcdSplitGp))
            {
                GlobalData.ServInstance.ThrowOutCard(HdCdsListTemp.ToArray(), new int[] { -1 }, (int)CardType.C1112223434);
                return(CardType.C1112223434);
            }

            return(CardType.None);
        }
Beispiel #3
0
        /// <summary>
        /// 最终检测手牌
        /// </summary>
        /// <param name="isgetcdsWithoutCompare">是不是在没有其他人出牌情况下</param>
        private void FinalOutCdsCheck(bool isgetcdsWithoutCompare)
        {
            //经过智能检索后最后检查一遍抬出的牌是否合法----start---

            var finalType = PokerRuleUtil.GetCdsType(HdCdctrlInstance.GetUpCdList().ToArray());

            if (finalType != CardType.None && finalType != CardType.Exception)
            {
                //如果选出的牌型不是那种单牌,或者对子的小牌型,就先关闭智能选牌
                if (isgetcdsWithoutCompare && finalType != CardType.C1 && finalType != CardType.C2)
                {
                    _onoffIchosecCds = false;
                }
                else if (!isgetcdsWithoutCompare)
                {
                    _onoffIchosecCds = false;
                }

                DDzUtil.ActiveBtn(ChuPaiBtn, DisChuPaiBtn);
            }
            else
            {
                DDzUtil.DisableBtn(ChuPaiBtn, DisChuPaiBtn);
            }

            //------------end
        }
Beispiel #4
0
        private bool CheckOutCdsC1112223434(List <int> HdCdsListTemp)
        {
            var len = HdCdsListTemp.Count;

            if (len >= 6)
            {
                var hdcdSplitGp = new CdSplitStruct(HdCdsListTemp.ToArray());

                var sanLianList = new List <int>();
                sanLianList.AddRange(hdcdSplitGp.ThreeCds);
                sanLianList.AddRange(hdcdSplitGp.FourCds);

                sanLianList.Sort();
                var posbLian    = PokerRuleUtil.GetAllPossibleShun(sanLianList.ToArray(), 2);
                var posbLianLen = posbLian.Count;
                if (posbLian.Count < 1)
                {
                    return(false);
                }
                //找到最长的三连
                posbLian.Sort(DDzUtil.SortCdsintesByLen);

                //最终得到最大三连牌长度
                var maxThreeLianCdsLen = posbLian[posbLianLen - 1].Length;

                if ((len - maxThreeLianCdsLen * 3) <= (maxThreeLianCdsLen * 2))
                {
                    return(true);
                }
            }

            return(false);
        }
Beispiel #5
0
        protected void SetCardFront()
        {
            ColorLeftUp.gameObject.SetActive(false);
            ColorRightDown.gameObject.SetActive(false);
            CdValueSpUp.gameObject.SetActive(false);
            CdValueSpDown.gameObject.SetActive(false);
            switch (CdValue)
            {
            case HdCdsCtrl.SmallJoker:
            {
                CdBg.spriteName = HdCdsCtrl.SmallJoker.ToString(CultureInfo.InvariantCulture);
                CdBg.MakePixelPerfect();
                return;
            }

            case HdCdsCtrl.BigJoker:
            {
                CdBg.spriteName = HdCdsCtrl.BigJoker.ToString(CultureInfo.InvariantCulture);
                CdBg.MakePixelPerfect();
                return;
            }

            case HdCdsCtrl.MagicKing:
            {
                CdBg.spriteName = HdCdsCtrl.MagicKing.ToString(CultureInfo.InvariantCulture);
                CdBg.MakePixelPerfect();
                return;
            }
            }

            CdBg.spriteName = "front";
            ColorLeftUp.gameObject.SetActive(true);
            ColorRightDown.gameObject.SetActive(true);
            CdValueSpUp.gameObject.SetActive(true);
            CdValueSpDown.gameObject.SetActive(true);


            var color = PokerRuleUtil.GetColor(CdValue);
            var value = HdCdsCtrl.GetValue(CdValue).ToString(CultureInfo.InvariantCulture);

            ColorLeftUp.spriteName    = "s_" + color + "_0";
            ColorRightDown.spriteName = "s_" + color + "_0";
            if (color > 2)
            {
                CdValueSpUp.spriteName   = "black_" + value;
                CdValueSpDown.spriteName = "black_" + value;
            }
            else
            {
                CdValueSpUp.spriteName   = "red_" + value;
                CdValueSpDown.spriteName = "red_" + value;
            }

            CdBg.MakePixelPerfect();
            ColorLeftUp.MakePixelPerfect();
            ColorRightDown.MakePixelPerfect();
            CdValueSpUp.MakePixelPerfect();
            CdValueSpDown.MakePixelPerfect();
        }
Beispiel #6
0
        //---------------end--

        /// <summary>
        /// 检测是否可以一手全出所有手牌,如果可以自动全出。
        /// </summary>
        private bool CheckCanOutOneTime()
        {
            if (!_autoLastOut)
            {
                return(false);
            }

            var hdCds   = HdCdsListTemp.ToArray();
            var cdsType = PokerRuleUtil.GetCdsType(hdCds);

            if (cdsType == CardType.None || cdsType == CardType.Exception || cdsType == CardType.C411)
            {
                return(false);
            }
            //如果是飞机带单牌,查找是否含有炸弹,有则不自动出了
            if (cdsType == CardType.C11122234)
            {
                var sotedCds = PokerRuleUtil.GetSortedValues(hdCds);
                var cdNum    = 0;
                var curCd    = -1;
                if (ExistC42(sotedCds))
                {
                    return(false);
                }
                foreach (var cd in sotedCds)
                {
                    if (curCd != cd)
                    {
                        curCd = cd;
                        if (cdNum >= 4)
                        {
                            return(false);
                        }
                        cdNum = 1;
                        continue;
                    }
                    cdNum++;
                }
                if (cdNum >= 4)
                {
                    return(false);
                }
            }

            //赖子代表的牌
            var laiziRepCds = new[] { -1 };

            App.GetRServer <DdzGameServer>().ThrowOutCard(hdCds, laiziRepCds, (int)cdsType);
            return(true);
        }
Beispiel #7
0
        /// <summary>
        /// 获取牌型
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        CardType GetOutCardsType(ISFSObject data)
        {
            if (data.ContainsKey(RequestKey.KeyCardType))
            {
                return((CardType)data.GetInt(RequestKey.KeyCardType));
            }

            if (!data.ContainsKey(RequestKey.KeyCards))
            {
                return(0);
            }

            var cards = data.GetIntArray(RequestKey.KeyCards);

            return(PokerRuleUtil.GetCdsType(cards));
        }
Beispiel #8
0
        //------------------------------------------------------------------------------------------------
        /// <summary>
        /// 当上一次玩家出牌不是自己时
        /// </summary>
        /// <param name="lastOutData">最后一次出牌的信息</param>
        /// <param name="isRejoin">标记是否是重连进入的</param>
        private void OnNotSelfOutCds(ISFSObject lastOutData, bool isRejoin = false)
        {
            //DDzUtil.ActiveBtn(BuYaoBtn, DisBuYaoBtn);
            DDzUtil.DisableBtn(ChuPaiBtn, DisChuPaiBtn);
            //玩家剩余最后4张牌,牌型三带一,最后一次出牌信息三带二,特殊改为玩家三带二计算(特殊情况)
            var lastcdType = CardType.None;

            lastcdType = PokerRuleUtil.GetCdsType(lastOutData.GetIntArray(RequestKey.KeyCards));
            if (HdCdsListTemp.ToArray().Length == 4 && lastcdType == CardType.C32)
            {
                var sortedLastOutCd = PokerRuleUtil.GetSortedValues(HdCdsListTemp.ToArray());
                var dictoNum        = new Dictionary <int, int>();
                foreach (var cd in sortedLastOutCd)
                {
                    if (!dictoNum.ContainsKey(cd))
                    {
                        dictoNum[cd] = 1;
                        continue;
                    }
                    dictoNum[cd]++;
                }
                var dictoNumTwo = dictoNum;
                foreach (var cd in dictoNum.Keys.Where(cd => dictoNum[cd] == 1))
                {
                    dictoNumTwo[cd]++;
                    break;
                }
                List <int> TempHdCdsListTemp = new List <int>();
                foreach (var item in dictoNumTwo)
                {
                    for (int i = 0; i < item.Value; i++)
                    {
                        TempHdCdsListTemp.Add(item.Key);
                    }
                }
                endchupaiV(isRejoin, TempHdCdsListTemp, lastOutData);
            }
            else
            {
                endchupaiV(isRejoin, HdCdsListTemp, lastOutData);
            }

            var args = new HdCdCtrlEvtArgs(HdCdctrlInstance.GetUpCdList().ToArray());

            OnHdCdsCtrlEvent(null, args);
            _onoffIchosecCds = true;
        }
Beispiel #9
0
        void OutCard()
        {
            int[] cardArr = HdCdctrlInstance.GetUpCdList().ToArray();

            //赖子代表的牌
            var laiziRepCds = new[] { -1 };

            //类型
            int curRule = -1;
            var type    = PokerRuleUtil.GetCdsType(cardArr);

            if (type != CardType.None && type != CardType.Exception)
            {
                curRule = (int)type;
            }
            App.GetRServer <DdzGameServer>().ThrowOutCard(cardArr, laiziRepCds, curRule);
        }
Beispiel #10
0
        /// <summary>
        /// 检查是不是最后一手牌的,3张,或者 3带1
        /// </summary>
        private bool CheckOutCdsC3OrC31()
        {
            var len = HdCdsListTemp.Count;

            switch (len)
            {
            //3张情况
            case 3:
                return(PokerRuleUtil.GetValue(HdCdsListTemp[0]) == PokerRuleUtil.GetValue(HdCdsListTemp[1]) &&
                       PokerRuleUtil.GetValue(HdCdsListTemp[1]) == PokerRuleUtil.GetValue(HdCdsListTemp[2]));

            //3带1情况
            case 4:

                var cdsValues = PokerRuleUtil.GetSortedValues(HdCdsListTemp.ToArray());
                return(cdsValues[0] == cdsValues[2] || cdsValues[1] == cdsValues[3]);
            }

            return(false);
        }
Beispiel #11
0
        /// <summary>
        /// 发送出牌消息
        /// </summary>
        /// <param name="handCardArr"></param>
        private void SendOutCdsRequest(int[] handCardArr)
        {
            //Debug.Log("<color=#0021FFFF>" + "发送出牌消息发送出牌消息发送出牌消息发送出牌消息发送出牌消息发送出牌消息" + "</color>");

            //赖子代表的牌
            var laiziRepCds = new int[] { -1 };

            //类型
            int curRule = -1;
            var type    = PokerRuleUtil.GetCdsType(handCardArr);

            if (type != CardType.None && type != CardType.Exception)
            {
                curRule = (int)type;
            }
            else
            {
                curRule = (int)CheckCanOutCdsOneTime(new CdSplitStruct(handCardArr));
            }


            GlobalData.ServInstance.ThrowOutCard(handCardArr, laiziRepCds, curRule);
        }
Beispiel #12
0
        /// <summary>
        /// 有人出牌时,检查是否有炸弹火箭等,从而显示加倍
        /// </summary>
        /// <param name="args"></param>
        private void OnTypeOutCard(DdzbaseEventArgs args)
        {
            var data  = args.IsfObjData;
            var cards = data.GetIntArray(RequestKey.KeyCards);

            cards = HdCdsCtrl.SortCds(cards);
            var cdsType = PokerRuleUtil.GetCdsType(cards);

            if (cdsType == CardType.C4 || cdsType == CardType.C42 || cdsType == CardType.C5)
            {
                try
                {
                    int mul = 2;
                    //var curbeishu = int.Parse(BeiShuLabel.text);
                    _beishu *= mul;
                    BeiShuAnimAtion(mul);
                    BeiShuLabel.text = _beishu.ToString(CultureInfo.InvariantCulture);
                }
                catch (Exception e)
                {
                    YxDebug.LogError("BeiShuLabel有问题:" + e.Message);
                }
            }
        }
Beispiel #13
0
        /// <summary>
        /// 先根据牌型进行声音名称的筛选
        /// </summary>
        /// <param name="cards"></param>
        /// <param name="cardType"></param>
        /// <returns></returns>
        public static string GetAudioNameBytypeFirst(int[] cards, int cardType = -1)
        {
            CardType cdType;

            if (cardType == -1)
            {
                cdType = PokerRuleUtil.GetCdsType(cards);
            }
            else
            {
                cdType = (CardType)cardType;
            }

            var str = new string[cards.Length];

            for (int i = 0; i < cards.Length; i++)
            {
                str[i] = cards[i].ToString("x").Substring(1, 1);
            }
            System.Array.Sort(str);
            switch (cards.Length)
            {
            case 1:
                if (cards[0] == 81)
                {
                    return("xiaowang");
                }
                if (cards[0] == 97)
                {
                    return("dawang");
                }
                return(str[0]);

            case 2:
                if (cards[0] == 97 || cards[1] == 97 || cards[0] == 81 || cards[1] == 81)
                {
                    return("huojian");
                }
                if (str[0] == str[1] || HaveMagic(cards))
                {
                    if (HaveMagic(cards))
                    {
                        return("1dui" + str[1]);
                    }
                    return("1dui" + str[0]);
                }
                else
                {
                    return("huojian");
                }

            case 3:
                return("3zhang" + str[1]);

            case 4:

                if (cardType == (int)CardType.C1122)
                {
                    return("shuangshun");
                }


                if (HaveMagic(cards))
                {
                    if (str[1] == str[2] && str[2] == str[3])
                    {
                        return("zhadan");
                    }
                }
                if (str[0] != str[3])
                {
                    return("3dai1");
                }
                return("zhadan");

            case 5:
                if (HaveMagic(cards))
                {
                    if (str[1] == str[2] && str[2] == str[3] && str[3] == str[4])
                    {
                        return("zhadan");
                    }
                }

                if (str[0] != str[1] && str[2] != str[3])
                {
                    return("shunzi");
                }


                bool cod0 = cardType == (int)CardType.C32;
                bool cod1 = (str[0] == str[1] && str[3] == str[4]);
                if (cod0 || cod1)
                {
                    return("3dai2");
                }

                return("4dai1");

            case 6:

                if (str[0] != str[1] && str[1] != str[2] && str[2] != str[3])
                {
                    return("shunzi");
                }

                if (str[0] == str[1] && str[2] == str[3] && str[4] == str[5] && str[1] != str[2] && str[3] != str[4])
                {
                    return("shuangshun");
                }
                if (str[0] == str[1] && str[1] == str[2] && str[3] == str[4] && str[4] == str[5])
                {
                    return("feiji");
                }
                return("4dai2");

            case 8:
                //if (cardType == CardType.C1112223434)

                if (str[2] == str[3] && str[3] == str[4] && str[4] == str[5])
                {
                    return("4dai2dui");
                }
                if (str[4] == str[5] && str[5] == str[6] && str[6] == str[7])
                {
                    return("4dai2dui");
                }
                if (str[0] == str[1] && str[1] == str[2] && str[2] == str[3])
                {
                    return("4dai2dui");
                }
                if (str[0] == str[1] && str[1] == str[2])
                {
                    return(FeijiDaiChibang);
                }
                if (str[0] != str[1])
                {
                    if (str[1] == str[2] && str[2] == str[3])
                    {
                        return(FeijiDaiChibang);
                    }
                }
                if (str[0] != str[1] && str[1] != str[2])
                {
                    if (str[2] == str[3] && str[2] == str[4])
                    {
                        return(FeijiDaiChibang);
                    }
                }
                if (str[0] == str[1] && str[2] == str[3] && str[0] != str[2])
                {
                    return("shuangshun");
                }
                return("shunzi");

            case 10:
                if (cdType == CardType.C1112223434)
                {
                    return(FeijiDaiChibang);
                }

                if (str[0] == str[1] && str[1] == str[2])
                {
                    return(FeijiDaiChibang);
                }
                if (str[1] != str[2])
                {
                    if (str[2] == str[3] && str[2] == str[4])
                    {
                        return(FeijiDaiChibang);
                    }
                }
                if (str[7] == str[8] && str[7] == str[9])
                {
                    return(FeijiDaiChibang);
                }
                if (str[0] == str[1])
                {
                    return("shuangshun");
                }
                return("shunzi");

            default:
                if (str.Length % 2 == 0)
                {
                    if (str[0] == str[1])
                    {
                        return("shuangshun");
                    }
                    else
                    {
                        return("shunzi");
                    }
                }
                else
                {
                    if (str[0] == str[1] && str[0] == str[2])
                    {
                        return("sanshun");
                    }

                    else
                    {
                        return("shunzi");
                    }
                }
            }
        }
Beispiel #14
0
        /// <summary>
        /// 设置这张扑克的牌值信息,显示效果
        /// </summary>
        /// <param name="cdValueData">牌值信息</param>
        public void SetCdValue(int cdValueData)
        {
            CdValue = cdValueData;
            ColorLeftUp.gameObject.SetActive(false);
            ColorRightDown.gameObject.SetActive(false);
            CdValueSpUp.gameObject.SetActive(false);
            CdBackSp.gameObject.SetActive(false);
            switch (CdValue)
            {
            case HdCdsCtrl.SmallJoker:
            {
                CdBg.spriteName = HdCdsCtrl.SmallJoker.ToString(CultureInfo.InvariantCulture);
                CdBg.MakePixelPerfect();
                CdBackSp.gameObject.SetActive(true);
                return;
            }

            case HdCdsCtrl.BigJoker:
            {
                CdBg.spriteName = HdCdsCtrl.BigJoker.ToString(CultureInfo.InvariantCulture);
                CdBg.MakePixelPerfect();
                CdBackSp.gameObject.SetActive(true);
                return;
            }

            case HdCdsCtrl.MagicKing:
            {
                CdBg.spriteName = HdCdsCtrl.MagicKing.ToString(CultureInfo.InvariantCulture);
                CdBg.MakePixelPerfect();
                CdBackSp.gameObject.SetActive(true);
                return;
            }
            }

            CdBg.spriteName = "front";
            ColorLeftUp.gameObject.SetActive(true);
            ColorRightDown.gameObject.SetActive(true);
            CdValueSpUp.gameObject.SetActive(true);
            CdBackSp.gameObject.SetActive(true);


            var color = PokerRuleUtil.GetColor(cdValueData);
            var value = HdCdsCtrl.GetValue(cdValueData).ToString(CultureInfo.InvariantCulture);

            ColorLeftUp.spriteName    = "s_" + color + "_0";
            ColorRightDown.spriteName = "b_" + color + "_0";
            if (color > 2)
            {
                CdValueSpUp.spriteName = "black_" + value;
                //CdBackSp.spriteName = "black_" + value;
            }
            else
            {
                CdValueSpUp.spriteName = "red_" + value;
                //CdBackSp.spriteName = "red_" + value;
            }

            CdBg.MakePixelPerfect();
            ColorLeftUp.MakePixelPerfect();
            ColorRightDown.MakePixelPerfect();
            CdValueSpUp.MakePixelPerfect();
            //CdBackSp.MakePixelPerfect();
            CdValueSpUp.transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);
            //CdBackSp.transform.localScale = new Vector3(0.9f, 0.9f, 1);
            ColorRightDown.transform.localScale = new Vector3(0.7f, 0.7f, 1);
        }
Beispiel #15
0
 /// <summary>
 /// 检查出的牌,播放相应的粒子特效
 /// </summary>
 /// <param name="outCds">已经排序好的扑克</param>
 private void CheckPartiCalPlay(int[] outCds)
 {
     CheckPartiCalPlay(PokerRuleUtil.GetCdsType(outCds));
 }
Beispiel #16
0
        /// <summary>
        /// 当玩家有对手牌进行点击操作时
        /// </summary>
        /// <param name="args"></param>
        private void OnHdCdsCtrlEvent(HdCdCtrlEvtArgs args)
        {
            //如果不该自己行动
            if (!_isMyTurn)
            {
                return;
            }

            //如果没有选牌
            if (args.SelectedCds.Length == 0)
            {
                if (ChuPaiBtn.activeSelf)
                {
                    SetBtnState(ChuPaiBtn, false);
                }

                _onoffIchosecCds = true;
                return;
            }

            var selectedCds = args.SelectedCds;

            var lastOutCds = _lastOutData.GetIntArray(RequestKey.KeyCards);

            //-----------------------start 智能选牌过程-------有赖子,或者开关关闭则不用智能选牌----------------------------
            bool isgetcdsWithoutCompare = false;    //标记是不是在自己出动出牌时做出的智能选牌

            int[] mayOutCds      = null;
            bool  selCdshasLaizi = PokerRuleUtil.CheckHaslz(selectedCds);

            if (!selCdshasLaizi && _onoffIchosecCds)
            {
                if (_lastOutData.GetInt(RequestKey.KeySeat) == App.GetGameData <DdzGameData>().SelfSeat)
                {
                    mayOutCds = _checkCardTool.GetcdsWithOutCompare(selectedCds, HdCdsListTemp.ToArray());
                    isgetcdsWithoutCompare = true;
                }
                else
                {
                    SetBtnActive(BuYaoBtn, true);
                    mayOutCds = _checkCardTool.ChkCanoutCdListWithLastCdList(selectedCds,
                                                                             _cardManager.GetTishiGroupDic, lastOutCds);
                }
            }
            //---------------------------------------------------------------------------------------end


            /*            //---start---------------使智能选牌出了相同的牌型,不重复执行-----------------------
             *          var haschosemayOutCds = DDzUtil.IsTwoArrayEqual(HdCdsCtrl.SortCds(_mayoutCdsTemp), HdCdsCtrl.SortCds(mayOutCds));
             *          _mayoutCdsTemp = mayOutCds;
             *          //如果上次智能选牌和本次相同,则直接取消一次智能选牌
             *          if (haschosemayOutCds)
             *          {
             *              mayOutCds = null;
             *          }
             *          //----------------------------------------------------------------------------------end*/



            if (mayOutCds == null || mayOutCds.Length == 0)
            {
                bool isMatch;

                //如果_lastOutData不是自己出牌
                if (_lastOutData.GetInt(RequestKey.KeySeat) != App.GetGameData <DdzGameData>().SelfSeat)
                {
                    var lastoutcds = new List <int>();

                    if (lastOutCds != null)
                    {
                        lastoutcds.AddRange(lastOutCds);
                    }

                    var cardTypeDic = _cardManager.GetAutoCardsList(selectedCds, selCdshasLaizi, lastoutcds.ToArray());
                    isMatch = cardTypeDic != null && cardTypeDic.Count > 0;
                }
                else
                {
                    var cardTypeDic = _cardManager.GetAutoCardsList(selectedCds, selCdshasLaizi, null);
                    isMatch = cardTypeDic != null && cardTypeDic.Count > 0;
                }

                if (isMatch)
                {
                    HdCdctrlInstance.UpCdList(selectedCds);
                }
                else
                {
                    if (ChuPaiBtn.activeSelf)
                    {
                        SetBtnState(ChuPaiBtn, false);
                    }
                    //DDzUtil.DisableBtn(ChuPaiBtn, DisChuPaiBtn);
                    return;
                }
            }
            else
            {
                if (!ChooseMayOutCards(mayOutCds, selectedCds)) //如果选中的牌不能出
                {
                    if (ChuPaiBtn.activeSelf)
                    {
                        SetBtnState(ChuPaiBtn, false);
                    }
                    return;
                }
            }


            //经过智能检索后最后检查一遍抬出的牌是否合法----start---

            var finalType = PokerRuleUtil.GetCdsType(HdCdctrlInstance.GetUpCdList().ToArray());

            SetBtnState(ChuPaiBtn, true);
            //DDzUtil.ActiveBtn(ChuPaiBtn, DisChuPaiBtn);

            if (finalType != CardType.None && finalType != CardType.Exception)
            {
                //如果选出的牌型不是那种单牌,或者对子的小牌型,就先关闭智能选牌
                if (isgetcdsWithoutCompare && finalType != CardType.C1 && finalType != CardType.C2)
                {
                    _onoffIchosecCds = false;
                }
                else if (!isgetcdsWithoutCompare)
                {
                    _onoffIchosecCds = false;
                }
            }


            //------------end
        }
Beispiel #17
0
        /// <summary>
        /// 当玩家有对手牌进行点击操作时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnHdCdsCtrlEvent(object sender, HdCdCtrlEvtArgs args)
        {
            //如果不该自己行动
            if (!ChuPaiBtn.activeSelf && !DisChuPaiBtn.activeSelf)
            {
                return;
            }

            //如果没有选牌
            if (args.SelectedCds.Length == 0)
            {
                DDzUtil.DisableBtn(ChuPaiBtn, DisChuPaiBtn);
                _onoffIchosecCds = true;
                return;
            }

            var selectedCds = args.SelectedCds;
            var lastOutCds  = _lastOutData.GetIntArray(RequestKey.KeyCards);

            //如果直接全选了所有手牌,且不是关别家的牌是自己主动出的情况下,检查能不能一次全出
            if (selectedCds.Length == HdCdsListTemp.Count && _lastOutData.GetInt(RequestKey.KeySeat) == App.GetGameData <GlobalData>().GetSelfSeat)
            {
                var canOutType = CheckCanOutCdsOneTime(new CdSplitStruct(HdCdsListTemp.ToArray()));
                if (canOutType != CardType.None && canOutType != CardType.Exception)
                {
                    HdCdctrlInstance.UpAllHandCds();
                    DDzUtil.ActiveBtn(ChuPaiBtn, DisChuPaiBtn);
                    return;
                }
            }



            //-----------------------start 智能选牌过程-------有赖子,或者开关关闭则不用智能选牌----------------------------
            bool isgetcdsWithoutCompare = false;//标记是不是在自己出动出牌时做出的智能选牌

            int[] mayOutCds      = null;
            bool  selCdshasLaizi = PokerRuleUtil.CheckHaslz(selectedCds);

            if (!selCdshasLaizi && _onoffIchosecCds)
            {
                if (_lastOutData.GetInt(RequestKey.KeySeat) == App.GetGameData <GlobalData>().GetSelfSeat)
                {
                    mayOutCds = _checkCardTool.GetcdsWithOutCompare(selectedCds, HdCdsListTemp.ToArray());
                    isgetcdsWithoutCompare = true;
                }
                else
                {
                    //DDzUtil.ActiveBtn(BuYaoBtn, DisBuYaoBtn);
                    mayOutCds = _checkCardTool.ChkCanoutCdListWithLastCdList(selectedCds,
                                                                             _cardManager.GetTishiGroupDic, lastOutCds);
                }
            }
            //---------------------------------------------------------------------------------------end


            /*            //---start---------------使智能选牌出了相同的牌型,不重复执行-----------------------
             *          var haschosemayOutCds = DDzUtil.IsTwoArrayEqual(HdCdsCtrl.SortCds(_mayoutCdsTemp), HdCdsCtrl.SortCds(mayOutCds));
             *          _mayoutCdsTemp = mayOutCds;
             *          //如果上次智能选牌和本次相同,则直接取消一次智能选牌
             *          if (haschosemayOutCds)
             *          {
             *              mayOutCds = null;
             *          }
             *          //----------------------------------------------------------------------------------end*/



            if (mayOutCds == null || mayOutCds.Length == 0)
            {
                bool isMatch;

                //如果_lastOutData不是自己出牌
                if (_lastOutData.GetInt(RequestKey.KeySeat) != App.GetGameData <GlobalData>().GetSelfSeat)
                {
                    var lastoutcds = new List <int>();
                    lastoutcds.AddRange(lastOutCds);
                    var cardTypeDic = _cardManager.CheckCanGuanCds(selectedCds, selCdshasLaizi, lastoutcds.ToArray());
                    isMatch = cardTypeDic != null && cardTypeDic.Count > 0;
                }
                else
                {
                    var cardTypeDic = _cardManager.CheckCanGuanCds(selectedCds, selCdshasLaizi, null);
                    isMatch = cardTypeDic != null && cardTypeDic.Count > 0;
                }

                //Debug.LogError("isMatch: " + isMatch);
                if (isMatch)
                {
                    HdCdctrlInstance.UpCdList(selectedCds);
                }
                else
                {
                    DDzUtil.DisableBtn(ChuPaiBtn, DisChuPaiBtn);
                    return;
                }
            }
            else
            {
                if (!ChooseMayOutCards(mayOutCds, selectedCds))
                {
                    DDzUtil.DisableBtn(ChuPaiBtn, DisChuPaiBtn);
                    return;
                }
            }

            FinalOutCdsCheck(isgetcdsWithoutCompare);
        }
Beispiel #18
0
        /// <summary>
        /// 检查飞机带2张
        /// </summary>
        /// <param name="cdsTypeDic"></param>
        /// <param name="cdSplit"></param>
        private void CheckC1112223434(ref Dictionary <int[], CardType> cdsTypeDic, CdSplitStruct cdSplit)
        {
            var listTemp = new List <int>();

            listTemp.AddRange(cdSplit.ThreeCds);
            listTemp.AddRange(cdSplit.FourCds);

            var allshunList = PokerRuleUtil.AnalyAllPartOfShun(listTemp.ToArray(), 2);


            var dancds = cdSplit.DanCds;
            //存在于三顺中的4牌
            var fourInDanCds = new List <int>();
            //把对子分解成单牌
            var duiToDanCds = new List <int>();

            foreach (var duiCd in cdSplit.DuiCds)
            {
                duiToDanCds.AddRange(new int[] { duiCd, duiCd });
            }
            //不存在与三顺中的3牌
            var threeToDancds = new List <int>();
            //不存在三顺中的4牌
            var fourToDanCds = new List <int>();

            var otherPartCdsList = new List <int>();

            foreach (var pureSanValues in allshunList)
            {
                threeToDancds.Clear();
                var values = pureSanValues;
                foreach (var threeCd in cdSplit.ThreeCds.Where(threeCd => !values.Contains(threeCd)))
                {
                    threeToDancds.AddRange(new int[] { threeCd, threeCd, threeCd });
                }

                fourInDanCds.Clear();
                fourToDanCds.Clear();
                foreach (var fcd in cdSplit.FourCds)
                {
                    if (!values.Contains(fcd))
                    {
                        fourToDanCds.AddRange(new int[] { fcd, fcd, fcd, fcd });
                    }
                    else
                    {
                        fourInDanCds.Add(fcd);
                    }
                }

                otherPartCdsList.Clear();
                otherPartCdsList.AddRange(dancds);
                otherPartCdsList.AddRange(fourInDanCds);
                otherPartCdsList.AddRange(duiToDanCds);
                otherPartCdsList.AddRange(threeToDancds);
                otherPartCdsList.AddRange(fourToDanCds);

                var sanLen = pureSanValues.Length;
                if (otherPartCdsList.Count * 2 >= sanLen)
                {
                    var c1112223434Cds = new List <int>();
                    var otherptCds     = new List <int>();
                    int j = 0;
                    for (var i = 0; i < sanLen; i++)
                    {
                        //添加三连部分
                        c1112223434Cds.AddRange(new int[] { pureSanValues[i], pureSanValues[i], pureSanValues[i] });
                        otherptCds.Add(otherPartCdsList[j++]);
                        otherptCds.Add(otherPartCdsList[j++]);
                    }
                    c1112223434Cds.AddRange(otherptCds);
                    cdsTypeDic[c1112223434Cds.ToArray()] = CardType.C1112223434;
                }
            }
        }