Beispiel #1
0
        /// <summary>
        /// 明牌
        /// </summary>
        /// <param name="user"></param>
        /// <param name="tableData"></param>
        public void ShowCard(GameUser user, TableData tableData)
        {
            var pos = GetUserPosition(user, tableData);

            if (pos != null && pos.IsLandlord && !tableData.IsShow)
            {
                tableData.DoDouble();
                pos.IsShow       = true;
                tableData.IsShow = true;
                SyncNotifyAction(ActionIDDefine.Cst_Action2008, tableData, null, null);

                TraceLog.WriteComplement("桌子:{0}玩家{1}明牌通知成功", tableData.TableId, user.UserId);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 出牌结束,并结算积分
        /// </summary>
        /// <param name="tableData"></param>
        private void DoOutCardEnd(TableData tableData)
        {
            int count     = (tableData.CardData.Count - TableData.CardBackNum) / tableData.PlayerNum;
            int landCount = count + TableData.CardBackNum - 1;//地主只出一张

            int[] cardNums              = new int[tableData.Positions.Length];
            int   landIndex             = 0;
            int   index                 = 0;
            int   noOutNum              = 0;
            List <PositionData> posList = new List <PositionData>();

            foreach (PositionData position in tableData.Positions)
            {
                if (position.IsLandlord)
                {
                    landIndex = index;
                }
                else
                {
                    posList.Add(position);
                }
                if (position.CardData.Count == count)
                {
                    noOutNum++;
                }
                cardNums[index] = position.CardData.Count;
                index++;
            }
            //春天判断
            if ((tableData.IsLandlordWin && noOutNum == 2) ||
                (!tableData.IsLandlordWin && cardNums[landIndex] == landCount))
            {
                tableData.DoDouble();
            }
            var pos = tableData.Positions[landIndex];

            DoSettlement(tableData, tableData.IsLandlordWin, pos, posList);
        }
Beispiel #3
0
        /// <summary>
        /// 出牌
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="positionId"></param>
        /// <param name="tableData"></param>
        /// <param name="cardsStr"></param>
        /// <param name="errorCode">0:正常,1:不合规则,2:不存在牌,3:离开桌位</param>
        public bool DoOutCard(int userId, int positionId, TableData tableData, string cardsStr, out int errorCode)
        {
            errorCode = 0;
            int[] cards = new int[0];
            if (!string.IsNullOrEmpty(cardsStr.Trim()))
            {
                string[]   tempArray = cardsStr.Split(new char[] { ',' });
                List <int> tempList  = new List <int>();
                for (int i = 0; i < tempArray.Length; i++)
                {
                    if (!string.IsNullOrEmpty(tempArray[i]))
                    {
                        tempList.Add(tempArray[i].ToInt());
                    }
                }
                cards = tempList.ToArray();
            }

            var pos = GetUserPosition(positionId, tableData);

            if (pos == null)
            {
                errorCode = 3;
                return(false);
            }
            if (!CheckCardEffective(pos.CardData, cards))
            {
                errorCode = 2;
                TraceLog.WriteComplement("桌子:{0}玩家{0}出牌{1}不在手中的牌内", tableData.TableId, userId, cardsStr);
                return(false);
            }
            int cardSize;
            var cardType = _cardRole.GetCardType(cards, out cardSize);

            if (cardType == DeckType.Error)
            {
                errorCode = 1;
                TraceLog.WriteComplement("桌子:{0}玩家{0}出牌{1}不合规则", tableData.TableId, userId, cardsStr);
                return(false);
            }
            if (cardType == DeckType.None && CheckOutCardNoneType(tableData))
            {
                //多次循环不出牌,则结束
                tableData.StopTimer();
                var param = new Parameters();
                param.Add("FleeUserId", 0);
                SyncNotifyAction(ActionIDDefine.Cst_Action2013, tableData, param,
                                 c =>
                {
                    //Console.WriteLine("Table:{0} is stop", tableData.TableId);
                    DoComplatedSettlement(tableData);
                    TraceLog.WriteError("桌子{0}多次连续不出牌并强制退出桌位", tableData.TableId);
                });
                errorCode = 3;
                return(true);
            }
            CardData cardData = new CardData(userId, positionId);

            cardData.Cards    = cards;
            cardData.Type     = cardType;
            cardData.CardSize = cardSize;

            if (tableData.PreCardData != null)
            {
                //压牌
                CardData tempData = tableData.PreCardData;
                if (cardData.Type != DeckType.None &&
                    tempData.Type != DeckType.None &&
                    tempData.UserId != cardData.UserId &&
                    !_cardRole.EqualsCard(cardData, tempData))
                {
                    errorCode = 1;
                    return(false);
                }
            }
            foreach (var card in cardData.Cards)
            {
                pos.CardData.Remove(card);
            }
            tableData.OutCardList.Add(cardData);
            if (cardData.Type != DeckType.None)
            {
                tableData.PreCardData = cardData;
            }

            if (cardData.Type == DeckType.Bomb ||
                cardData.Type == DeckType.WangBomb)
            {
                tableData.DoDouble();
            }
            if (pos.CardData.Count > 0)
            {
                int index   = (pos.Id + 1) % tableData.PlayerNum;
                var nextPos = tableData.Positions[index];
                tableData.OutCardPos    = nextPos.Id;
                tableData.OutCardUserId = nextPos.UserId;
                SyncNotifyAction(ActionIDDefine.Cst_Action2010, tableData, null, null);
            }
            else
            {
                //结束
                foreach (var p in tableData.Positions)
                {
                    TraceLog.WriteComplement("桌子:{0} in {1}玩家:{2}-{3}剩余牌{4}",
                                             tableData.TableId, tableData.RoomId, p.UserId, p.NickName, string.Join(",", p.CardData));
                }
                tableData.IsClosed      = true;
                tableData.IsLandlordWin = pos.IsLandlord ? true : false;
                DoOutCardEnd(tableData);

                SyncNotifyAction(ActionIDDefine.Cst_Action2012, tableData, null,
                                 t =>
                {
                    DoComplatedSettlement(tableData);
                    TraceLog.WriteComplement("桌子:{0}玩家:{1}出牌结束通知", tableData.TableId, userId);
                });
            }
            return(true);
        }
Beispiel #4
0
        /// <summary>
        /// 叫地主
        /// </summary>
        /// <param name="positionId"></param>
        /// <param name="tableData"></param>
        /// <param name="isCall">true:叫,false:不叫</param>
        public void CallCard(int positionId, TableData tableData, bool isCall)
        {
            if (positionId != tableData.CallLandlordPos)
            {
                TraceLog.WriteComplement("桌子:{0}未轮到位置{1}叫地主", tableData.TableId, positionId);
                return;
            }
            if (tableData.CallTimes < tableData.CallOperation.Length)
            {
                if (isCall)
                {
                    tableData.DoDouble();
                    TraceLog.WriteComplement("桌子:{0}叫地主加倍{1}", tableData.TableId, tableData.MultipleNum);
                }
                tableData.CallOperation[tableData.CallTimes] = isCall;
                tableData.CallTimes++;
            }
            if (tableData.CallTimes > tableData.PlayerNum - 1 &&
                !Array.Exists(tableData.CallOperation, op => op))
            {
                //都不叫时重新发牌接口
                TraceLog.WriteComplement("桌子:{0}重新发牌,CallTimes:{1},Log:{2}", tableData.TableId, tableData.CallTimes, string.Join(",", tableData.CallOperation));
                CheckStart(tableData);
                return;
            }

            int noCallNum    = 0;
            int calledNum    = 0;
            int preCallIndex = 0;//上次操作的索引
            //计算叫地主记录中,不叫次数
            int endIndex = tableData.CallTimes - 1;

            for (int i = endIndex; i >= 0; i--)
            {
                bool called = tableData.CallOperation[i];
                if (!called)
                {
                    noCallNum++;
                }
                else
                {
                    calledNum++;
                }
                if (called && calledNum == 1)
                {
                    preCallIndex = i;
                }
            }
            TraceLog.WriteComplement("桌子:{0}位置:{1},前一个:{2},最后一个:{3}叫地主", tableData.TableId, positionId, preCallIndex, endIndex);
            if ((tableData.CallTimes == tableData.PlayerNum && noCallNum == tableData.PlayerNum - 1) ||
                tableData.CallTimes > tableData.PlayerNum)
            {
                int index = endIndex - preCallIndex;
                index = (positionId + tableData.PlayerNum - index) % tableData.PlayerNum;
                PositionData pos = index >= 0 && index < tableData.Positions.Length ? tableData.Positions[index] : null;
                if (pos != null)
                {
                    //确定地主
                    pos.IsLandlord          = true;
                    tableData.LandlordPos   = pos.Id;
                    tableData.LandlordId    = pos.UserId;
                    tableData.IsCallEnd     = true;
                    tableData.OutCardPos    = pos.Id;
                    tableData.OutCardUserId = pos.UserId;
                    //增加底牌
                    pos.CardData.AddRange(tableData.BackCardData);
                    _cardRole.SortCard(pos.CardData);
                }
            }
            else
            {
                //取下个叫地主玩家
                int          nextPos = (positionId + 1) % tableData.PlayerNum;
                PositionData pos     = tableData.Positions[nextPos];
                if (pos != null)
                {
                    tableData.CallLandlordPos  = pos.Id;
                    tableData.CallLandlordId   = pos.UserId;
                    tableData.CallLandlordName = pos.NickName;
                }
            }
            var param = new Parameters();

            param.Add("IsCall", isCall ? 1 : 0);
            param.Add("IsRob", (calledNum == 1 && isCall) || calledNum == 0 ? 0 : 1);
            SyncNotifyAction(ActionIDDefine.Cst_Action2006, tableData, param, null);

            TraceLog.WriteComplement("桌子:{0}叫地主通知成功,地主是:{1},是否结束{2}",
                                     tableData.TableId,
                                     tableData.IsCallEnd ? (tableData.LandlordId + "") : (tableData.CallLandlordId + tableData.CallLandlordName),
                                     tableData.IsCallEnd);
        }