/// <summary> /// 比较牌大小 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns>a大时返回True</returns> public bool EqualsCard(CardData a, CardData b) { return b.Type == DeckType.None || a.Type == DeckType.WangBomb || (a.Type != b.Type && b.Type != DeckType.WangBomb && a.Type == DeckType.Bomb) || (a.Type == b.Type && a.Cards.Length == b.Cards.Length && a.CardSize > b.CardSize); }
/// <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); //todo TraceLog.WriteComplement("桌子:{0}玩家:{1}出牌结束通知", tableData.TableId, userId); }); } return true; }