/// <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); }
/// <summary> /// 当确定地主后,看自己是不是地主,来判断是否显示按钮 /// </summary> /// <param name="args"></param> protected override void OnFirstOut(DdzbaseEventArgs args) { base.OnFirstOut(args); //底牌加入到手中 var data = args.IsfObjData; var gdata = App.GetGameData <DdzGameData>(); int speakerSeat = data.GetInt(RequestKey.KeySeat); //地主座位号 _isMyTurn = speakerSeat == gdata.SelfSeat; //因为注册委托先后顺序的问题,不能用gdata.ImBanker判断 if (!_isMyTurn) { HideAllBtns(); return; } if (data.ContainsKey(NewRequestKey.JiaBeiSeat)) { HideAllBtns(); } else { SetBtnActive(ChuPaiBtn, true); SetBtnState(ChuPaiBtn, false); } _lastOutData.PutInt(RequestKey.KeySeat, speakerSeat); //地主位置存入缓存 HdCdctrlInstance.ReSetHandCds(HdCdsListTemp.ToArray()); }
/// <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); }
/// <summary> /// 显示按钮,并disable所有按钮 /// </summary> private void DisableAllBtns() { //DDzUtil.DisableBtn(BuYaoBtn, DisBuYaoBtn); DDzUtil.DisableBtn(TiShiBtn, DisTiShiBtn); DDzUtil.DisableBtn(ChuPaiBtn, DisChuPaiBtn); var hdcdSplitGp = new CdSplitStruct(HdCdsListTemp.ToArray()); //如果含有炸弹则跳过 if (hdcdSplitGp.FourCds.Count < 1) { var canOutType = CheckCanOutCdsOneTime(hdcdSplitGp); //防止发送消息不成功,直接点亮出牌按钮,让玩家有再次发送的机会 if (canOutType != CardType.None && canOutType != CardType.Exception) { HdCdctrlInstance.UpAllHandCds(); DDzUtil.ActiveBtn(ChuPaiBtn, DisChuPaiBtn); return; } } var args = new HdCdCtrlEvtArgs(HdCdctrlInstance.GetUpCdList().ToArray()); OnHdCdsCtrlEvent(null, args); _onoffIchosecCds = true; }
/// <summary> /// 根据手牌数据缓存刷新相关ui /// </summary> public override void RefreshUiInfo() { if (HdCdctrlInstance != null) { HdCdctrlInstance.ReSetHandCds(HdCdsListTemp.ToArray()); } }
/// <summary> /// 当一局游戏结算时 /// </summary> /// <param name="args"></param> void OnTypeOneRoundOver(DdzbaseEventArgs args) { //隐藏所有出牌操作按钮 HideAllBtns(); //清空手牌 HdCdsListTemp.Clear(); _lastOutData = new SFSObject(); //重置 if (HdCdctrlInstance != null) { HdCdctrlInstance.ReSetHandCds(HdCdsListTemp.ToArray()); } RepositionAllHdCds(); }
//---------------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); }
//------------------------------------------------------------------------------------------------ /// <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; }
protected override void OnAllocateCds(object sender, DdzbaseEventArgs args) { //发牌后重置开关 _isRpLeftOne = false; _isRpLeftOneFirst = false; //base.OnAllocateCds(sender,args);---------- var data = args.IsfObjData; var seat = data.GetInt(GlobalConstKey.C_Sit); if (App.GetGameData <GlobalData>().GetSelfSeat != seat || !data.ContainsKey(GlobalConstKey.C_Cards)) { return; } var cards = data.GetIntArray(GlobalConstKey.C_Cards); ResetHdCds(cards); //------------------------end------------------------------------------------------------------------ //判断发牌后是否是自己先行动出牌 if (data.ContainsKey(GlobalConstKey.C_Bkp) && data.GetInt(GlobalConstKey.C_Bkp) == App.GetGameData <GlobalData>().GetSelfSeat) { DisableAllBtns(); if (_lastOutData == null) { _lastOutData = new SFSObject(); } _lastOutData.PutInt(RequestKey.KeySeat, App.GetGameData <GlobalData>().GetSelfSeat); _lastOutData.PutIntArray(RequestKey.KeyCards, new int[] { }); if (HdCdctrlInstance != null) { HdCdctrlInstance.ReSetHandCds(HdCdsListTemp.ToArray(), true); } } else { if (HdCdctrlInstance != null) { HdCdctrlInstance.ReSetHandCds(HdCdsListTemp.ToArray(), true, true); } } }
/// <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); }
//------------------------------------------------------------------------------------------------ /// <summary> /// 获取提示手牌信息 /// </summary> /// <param name="lastOutData"></param> private void GetPromptCardsGroup(ISFSObject lastOutData) { _cardManager.GetPromptGroup(HdCdsListTemp.ToArray(), lastOutData); }
protected override void OnRejoinGame(DdzbaseEventArgs args) { StopAllCoroutines(); //与ResetHdCds,AddHdCds,RemoveHdCds相关 base.OnRejoinGame(args); //显示手牌 HdCdctrlInstance.ReSetHandCds(HdCdsListTemp.ToArray()); var data = args.IsfObjData; int selfSeat = App.GetGameData <DdzGameData>().SelfSeat; _isMyTurn = data.ContainsKey(NewRequestKey.KeyCurrp) && data.GetInt(NewRequestKey.KeyCurrp) == selfSeat; //如果是选庄阶段则不显示出牌操作相关按钮 if (data.ContainsKey(NewRequestKey.KeyGameStatus)) { switch (data.GetInt(NewRequestKey.KeyGameStatus)) { case GlobalConstKey.StatusChoseBanker: case GlobalConstKey.StatusDouble: HideAllBtns(); return; } } //如果存在最后一次出牌的信息 if (data.ContainsKey(NewRequestKey.KeyLastOut)) { _lastOutData = data.GetSFSObject(NewRequestKey.KeyLastOut); } else { //是自己第一手出牌,你是地主 _lastOutData.PutInt(RequestKey.KeySeat, selfSeat); } //没人行动,或者,不是自己行动 if (!_isMyTurn) { HideAllBtns(); return; } if (_lastOutData.GetInt(RequestKey.KeySeat) != selfSeat) { GetPromptCardsGroup(_lastOutData); if (AutoState) { AutoFollow(); } else { OnOthersOutCds(); } } else { HideAllBtns(); SetBtnActive(ChuPaiBtn, true); SetBtnState(ChuPaiBtn, false); //如果自己准备出手牌 SetAllBtnState(); CheckCanOutOneTime(); //最后一手,如果可以全出,则全出 } }
/// <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 }
/// <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); }