protected override async Task Run(Room unit, Prompt_RT message, Action <Prompt_RE> reply)
        {
            Prompt_RE response = new Prompt_RE();

            try
            {
                Gamer gamer = unit.Get(message.PlayerID);
                if (gamer != null)
                {
                    List <Card> handCards = new List <Card>(gamer.GetComponent <HandCardsComponent>().GetAll());
                    CardsHelper.SortCards(handCards);
                    if (gamer.Id == unit.GetComponent <OrderControllerComponent>().Biggest)
                    {
                        response.Cards = handCards.Where(card => card.CardWeight == handCards[handCards.Count - 1].CardWeight).ToArray();
                    }
                    else
                    {
                        DeskCardsCacheComponent deskCardsCache = unit.GetComponent <DeskCardsCacheComponent>();
                        List <Card[]>           result         = await CardsHelper.GetPrompt(handCards, deskCardsCache, deskCardsCache.Rule);

                        if (result.Count > 0)
                        {
                            response.Cards = result[RandomHelper.RandomNumber(0, result.Count)];
                        }
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Exemple #2
0
        /// <summary>
        /// 发牌
        /// </summary>
        /// <returns></returns>
        public static Card Deal(this DeskCardsCacheComponent self)
        {
            Card card = self.library[self.CardsCount - 1];

            self.library.Remove(card);
            return(card);
        }
        /// <summary>
        /// 发地主牌
        /// </summary>
        /// <param name="self"></param>
        /// <param name="id"></param>
        public static void CardsOnTable(this GameControllerComponent self, long id)
        {
            LandlordsRoom            room            = self.GetParent <LandlordsRoom>();
            DeskCardsCacheComponent  deskCardsCache  = room.GetComponent <DeskCardsCacheComponent>();
            OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
            HandCardsComponent       handCards       = room.GetGamerFromUserID(id).GetComponent <HandCardsComponent>();

            orderController.Start(id);

            for (int i = 0; i < 3; i++)
            {
                Card card = deskCardsCache.Deal();
                handCards.AddCard(card);
            }

            //更新玩家身份
            foreach (var gamer in room.gamers)
            {
                Identity gamerIdentity = gamer.UserID == id ? Identity.Landlord : Identity.Farmer;
                self.UpdateInIdentity(gamer, gamerIdentity);
            }

            //广播地主消息
            room.Broadcast(new Actor_SetLandlord_Ntt()
            {
                UserID = id, LordCards = To.RepeatedField(deskCardsCache.LordCards)
            });

            //广播地主先手出牌消息
            room.Broadcast(new Actor_AuthorityPlayCard_Ntt()
            {
                UserID = id, IsFirst = true
            });
        }
Exemple #4
0
        protected override async Task Run(Gamer gamer, Actor_GamerPrompt_Req message, Action <Actor_GamerPrompt_Ack> reply)
        {
            Actor_GamerPrompt_Ack response = new Actor_GamerPrompt_Ack();

            try
            {
                Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID);
                OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
                DeskCardsCacheComponent  deskCardsCache  = room.GetComponent <DeskCardsCacheComponent>();

                List <Card> handCards = new List <Card>(gamer.GetComponent <HandCardsComponent>().GetAll());
                CardsHelper.SortCards(handCards);

                if (gamer.UserID == orderController.Biggest)
                {
                    response.Cards.AddRange(handCards.Where(card => card.CardWeight == handCards[handCards.Count - 1].CardWeight).ToArray());
                }
                else
                {
                    List <IList <Card> > result = await CardsHelper.GetPrompt(handCards, deskCardsCache, deskCardsCache.Rule);

                    if (result.Count > 0)
                    {
                        response.Cards.AddRange(result[RandomHelper.RandomNumber(0, result.Count)]);
                    }
                }

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        /// <summary>
        /// 发地主牌
        /// </summary>
        /// <param name="self"></param>
        /// <param name="id"></param>
        public static void CardsOnTable(this GameControllerComponent self, long id)
        {
            Room room = self.GetEntity <Room>();
            DeskCardsCacheComponent  deskCardsCache  = room.GetComponent <DeskCardsCacheComponent>();
            OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
            HandCardsComponent       handCards       = room.Get(id).GetComponent <HandCardsComponent>();

            orderController.Start(id);

            for (int i = 0; i < 3; i++)
            {
                Card card = deskCardsCache.Deal();
                handCards.AddCard(card);
            }

            //更新玩家身份
            foreach (var gamer in room.GetAll())
            {
                Identity gamerIdentity = gamer.Id == id ? Identity.Landlord : Identity.Farmer;
                self.UpdateInIdentity(gamer, gamerIdentity);
            }

            //广播地主消息
            room.Broadcast(new SelectLord()
            {
                PlayerId = id, LordCards = deskCardsCache.LordCards.ToArray()
            });

            //广播地主先手出牌消息
            room.Broadcast(new AuthorityPlayCard()
            {
                PlayerId = id, IsFirst = true
            });
        }
Exemple #6
0
        /// <summary>
        /// 清空牌桌
        /// </summary>
        /// <param name="self"></param>
        public static void Clear(this DeskCardsCacheComponent self)
        {
            DeckComponent deck = self.Entity.GetComponent <DeckComponent>();

            while (self.CardsCount > 0)
            {
                Card card = self.library[self.CardsCount - 1];
                self.library.Remove(card);
                deck.AddCard(card);
            }

            self.Rule = CardsType.None;
        }
        /// <summary>
        /// 场上的所有牌回到牌库中
        /// </summary>
        /// <param name="self"></param>
        public static void BackToDeck(this GameControllerComponent self)
        {
            Room                    room           = self.GetEntity <Room>();
            DeckComponent           deckComponent  = room.GetComponent <DeckComponent>();
            DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>();

            //回收牌桌卡牌
            deskCardsCache.Clear();
            deskCardsCache.LordCards.Clear();

            //回收玩家手牌
            foreach (var gamer in room.GetAll())
            {
                HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>();
                while (handCards.CardsCount > 0)
                {
                    Card card = handCards.Library[handCards.CardsCount - 1];
                    handCards.PopCard(card);
                    deckComponent.AddCard(card);
                }
            }
        }
        /// <summary>
        /// 发牌
        /// </summary>
        /// <param name="id"></param>
        public static void DealTo(this GameControllerComponent self, long id)
        {
            Room room = self.GetEntity <Room>();
            Card card = room.GetComponent <DeckComponent>().Deal();

            if (id == room.Id)
            {
                DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>();
                deskCardsCache.AddCard(card);
                deskCardsCache.LordCards.Add(card);
            }
            else
            {
                foreach (var gamer in room.GetAll())
                {
                    if (id == gamer.Id)
                    {
                        gamer.GetComponent <HandCardsComponent>().AddCard(card);
                        break;
                    }
                }
            }
        }
        protected override async Task Run(Gamer gamer, Actor_GamerPlayCard_Req message, Action <Actor_GamerPlayCard_Ack> reply)
        {
            Actor_GamerPlayCard_Ack response = new Actor_GamerPlayCard_Ack();

            try
            {
                Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID);

                GameControllerComponent  gameController  = room.GetComponent <GameControllerComponent>();
                DeskCardsCacheComponent  deskCardsCache  = room.GetComponent <DeskCardsCacheComponent>();
                OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();

                //检测是否符合出牌规则
                if (CardsHelper.PopEnable(message.Cards, out CardsType type))
                {
                    //当前出牌牌型是否比牌桌上牌型的权重更大
                    bool isWeightGreater = CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight();
                    //当前出牌牌型是否和牌桌上牌型的数量一样
                    bool isSameCardsNum = message.Cards.count == deskCardsCache.GetAll().Length;
                    //当前出牌玩家是否是上局最大出牌者
                    bool isBiggest = orderController.Biggest == orderController.CurrentAuthority;
                    //当前牌桌牌型是否是顺子
                    bool isStraight = deskCardsCache.Rule == CardsType.Straight || deskCardsCache.Rule == CardsType.DoubleStraight || deskCardsCache.Rule == CardsType.TripleStraight;
                    //当前出牌牌型是否和牌桌上牌型一样
                    bool isSameCardsType = type == deskCardsCache.Rule;

                    if (isBiggest ||                                                          //先手出牌玩家
                        type == CardsType.JokerBoom ||                                        //王炸
                        type == CardsType.Boom && isWeightGreater ||                          //更大的炸弹
                        isSameCardsType && isStraight && isSameCardsNum && isWeightGreater || //更大的顺子
                        isSameCardsType && isWeightGreater)                                   //更大的同类型牌
                    {
                        if (type == CardsType.JokerBoom)
                        {
                            //王炸翻4倍
                            gameController.Multiples *= 4;
                            room.Broadcast(new Actor_SetMultiples_Ntt()
                            {
                                Multiples = gameController.Multiples
                            });
                        }
                        else if (type == CardsType.Boom)
                        {
                            //炸弹翻2倍
                            gameController.Multiples *= 2;
                            room.Broadcast(new Actor_SetMultiples_Ntt()
                            {
                                Multiples = gameController.Multiples
                            });
                        }
                    }
                    else
                    {
                        response.Error = ErrorCode.ERR_PlayCardError;
                        reply(response);
                        return;
                    }
                }
                else
                {
                    response.Error = ErrorCode.ERR_PlayCardError;
                    reply(response);
                    return;
                }

                //如果符合将牌从手牌移到出牌缓存区
                deskCardsCache.Clear();
                deskCardsCache.Rule = type;
                HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>();
                foreach (var card in message.Cards)
                {
                    handCards.PopCard(card);
                    deskCardsCache.AddCard(card);
                }

                reply(response);

                //转发玩家出牌消息
                room.Broadcast(new Actor_GamerPlayCard_Ntt()
                {
                    UserID = gamer.UserID, Cards = message.Cards
                });

                //游戏控制器继续游戏
                gameController.Continue(gamer);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        protected override async Task Run(Room room, MH2MP_PlayerEnterRoom message, Action <MP2MH_PlayerEnterRoom> reply)
        {
            MP2MH_PlayerEnterRoom response = new MP2MH_PlayerEnterRoom();

            try
            {
                Gamer gamer = room.Get(message.UserID);
                if (gamer == null)
                {
                    //创建房间玩家对象
                    gamer = GamerFactory.Create(message.PlayerID, message.UserID);
                    await gamer.AddComponent <ActorComponent>().AddLocation();

                    gamer.AddComponent <UnitGateComponent, long>(message.SessionID);

                    //加入到房间
                    room.Add(gamer);

                    M2C_GamerEnterRoom broadcastMessage = new M2C_GamerEnterRoom();
                    foreach (Gamer _gamer in room.GetAll())
                    {
                        if (_gamer == null)
                        {
                            //添加空位
                            broadcastMessage.Gamers.Add(null);
                            continue;
                        }

                        //添加玩家信息
                        GamerInfo info = new GamerInfo()
                        {
                            UserID = _gamer.UserID, IsReady = _gamer.IsReady
                        };
                        broadcastMessage.Gamers.Add(info);
                    }

                    //广播房间内玩家消息
                    room.Broadcast(broadcastMessage);

                    Log.Info($"玩家{message.UserID}进入房间");
                }
                else
                {
                    //玩家重连 todo处理牛牛玩家重连逻辑
                    gamer.isOffline = false;
                    gamer.PlayerID  = message.PlayerID;
                    gamer.GetComponent <UnitGateComponent>().GateSessionId = message.SessionID;

                    //玩家重连移除托管组件
                    gamer.RemoveComponent <TrusteeshipComponent>();

                    M2C_GamerEnterRoom broadcastMessage = new M2C_GamerEnterRoom();
                    foreach (Gamer _gamer in room.GetAll())
                    {
                        if (_gamer == null)
                        {
                            //添加空位
                            broadcastMessage.Gamers.Add(null);
                            continue;
                        }

                        //添加玩家信息
                        GamerInfo info = new GamerInfo()
                        {
                            UserID = _gamer.UserID, IsReady = _gamer.IsReady
                        };
                        broadcastMessage.Gamers.Add(info);
                    }

                    //发送房间玩家信息
                    ActorProxy actorProxy = gamer.GetComponent <UnitGateComponent>().GetActorProxy();
                    actorProxy.Send(broadcastMessage);

                    Dictionary <long, Identity> gamersIdentity  = new Dictionary <long, Identity>();
                    Dictionary <long, int>      gamersCardsNum  = new Dictionary <long, int>();
                    GameControllerComponent     gameController  = room.GetComponent <GameControllerComponent>();
                    OrderControllerComponent    orderController = room.GetComponent <OrderControllerComponent>();
                    DeskCardsCacheComponent     deskCardsCache  = room.GetComponent <DeskCardsCacheComponent>();

                    foreach (Gamer _gamer in room.GetAll())
                    {
                        HandCardsComponent handCards = _gamer.GetComponent <HandCardsComponent>();
                        gamersCardsNum.Add(_gamer.UserID, handCards.CardsCount);
                        gamersIdentity.Add(_gamer.UserID, handCards.AccessIdentity);
                    }

                    //发送游戏开始消息
                    M2C_GameStart gameStartNotice = new M2C_GameStart()
                    {
                        GamerCards    = gamer.GetComponent <HandCardsComponent>().GetAll(),
                        GamerCardsNum = gamersCardsNum
                    };
                    actorProxy.Send(gameStartNotice);

                    Card[] lordCards = null;
                    if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None)
                    {
                        //广播先手玩家
                        actorProxy.Send(new M2C_AuthorityGrabLandlord()
                        {
                            UserID = orderController.CurrentAuthority
                        });
                    }
                    else
                    {
                        if (gamer.UserID == orderController.CurrentAuthority)
                        {
                            //发送可以出牌消息
                            bool isFirst = gamer.UserID == orderController.Biggest;
                            actorProxy.Send(new M2C_AuthorityPlayCard()
                            {
                                UserID = orderController.CurrentAuthority, IsFirst = isFirst
                            });
                        }
                        lordCards = deskCardsCache.LordCards.ToArray();
                    }
                    //发送重连数据
                    M2C_GamerReconnect_ANtt reconnectNotice = new M2C_GamerReconnect_ANtt()
                    {
                        Multiples              = room.GetComponent <GameControllerComponent>().Multiples,
                        GamersIdentity         = gamersIdentity,
                        DeskCards              = new KeyValuePair <long, Card[]>(orderController.Biggest, deskCardsCache.library.ToArray()),
                        LordCards              = lordCards,
                        GamerGrabLandlordState = orderController.GamerLandlordState
                    };
                    actorProxy.Send(reconnectNotice);

                    Log.Info($"玩家{message.UserID}重连");
                }

                response.GamerID = gamer.Id;

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Exemple #11
0
 /// <summary>
 /// 手牌排序
 /// </summary>
 /// <param name="self"></param>
 public static void Sort(this DeskCardsCacheComponent self)
 {
     CardsHelper.SortCards(self.library);
 }
        protected override Task Run(Room unit, PlayCards_RT message, Action <PlayCards_RE> reply)
        {
            PlayCards_RE response = new PlayCards_RE();

            try
            {
                Gamer gamer = unit.Get(message.PlayerID);
                if (gamer == null)
                {
                    response.Error = ErrorCode.ERR_PlayCardError;
                    reply(response);
                    return(Task.CompletedTask);
                }

                GameControllerComponent  gameController  = unit.GetComponent <GameControllerComponent>();
                DeskCardsCacheComponent  deskCardsCache  = unit.GetComponent <DeskCardsCacheComponent>();
                OrderControllerComponent orderController = unit.GetComponent <OrderControllerComponent>();

                //检测是否符合出牌规则
                if (CardsHelper.PopEnable(message.Cards, out CardsType type))
                {
                    if (orderController.Biggest == orderController.CurrentAuthority ||
                        type == CardsType.JokerBoom ||
                        type == CardsType.Boom && CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight() ||
                        (deskCardsCache.Rule == CardsType.Straight || deskCardsCache.Rule == CardsType.DoubleStraight || deskCardsCache.Rule == CardsType.TripleStraight) && type == deskCardsCache.Rule && message.Cards.Length == deskCardsCache.GetAll().Length&& CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight() ||
                        type == deskCardsCache.Rule && CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight())
                    {
                        if (type == CardsType.JokerBoom)
                        {
                            gameController.Multiples *= 4;
                            unit.Broadcast(new GameMultiples()
                            {
                                Multiples = gameController.Multiples
                            });
                        }
                        else if (type == CardsType.Boom)
                        {
                            gameController.Multiples *= 2;
                            unit.Broadcast(new GameMultiples()
                            {
                                Multiples = gameController.Multiples
                            });
                        }
                    }
                    else
                    {
                        response.Error = ErrorCode.ERR_PlayCardError;
                        reply(response);
                        return(Task.CompletedTask);
                    }
                }
                else
                {
                    response.Error = ErrorCode.ERR_PlayCardError;
                    reply(response);
                    return(Task.CompletedTask);
                }

                //如果符合将牌从手牌移到出牌缓存区
                deskCardsCache.Clear();
                deskCardsCache.Rule = type;
                HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>();
                foreach (var card in message.Cards)
                {
                    handCards.PopCard(card);
                    deskCardsCache.AddCard(card);
                }

                //转发玩家出牌消息
                unit.Broadcast(new GamerPlayCards()
                {
                    PlayerID = gamer.Id, Cards = message.Cards
                });

                if (handCards.CardsCount == 0)
                {
                    Identity winnerIdentity             = unit.Get(orderController.Biggest).GetComponent <HandCardsComponent>().AccessIdentity;
                    Dictionary <long, long> gamersScore = new Dictionary <long, long>();

                    foreach (var _gamer in unit.GetAll())
                    {
                        _gamer.RemoveComponent <AutoPlayCardsComponent>();
                        gamersScore.Add(_gamer.Id, gameController.GetScore(_gamer, winnerIdentity));
                        //玩家剩余出牌
                        if (_gamer.Id != message.PlayerID)
                        {
                            Card[] _gamerCards = _gamer.GetComponent <HandCardsComponent>().GetAll();
                            unit.Broadcast(new GamerPlayCards()
                            {
                                PlayerID = _gamer.Id, Cards = _gamerCards
                            });
                        }
                    }

                    //游戏结束结算
                    gameController.GameOver(gamersScore);

                    //广播游戏结束消息
                    unit.Broadcast(new Gameover()
                    {
                        Winner            = winnerIdentity,
                        BasePointPerMatch = gameController.BasePointPerMatch,
                        Multiples         = gameController.Multiples,
                        GamersScore       = gamersScore
                    });
                }
                else
                {
                    //轮到下位玩家出牌
                    orderController.Biggest = gamer.Id;
                    orderController.Turn();
                    unit.Broadcast(new AuthorityPlayCard()
                    {
                        PlayerID = orderController.CurrentAuthority, IsFirst = false
                    });
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
            return(Task.CompletedTask);
        }
Exemple #13
0
 /// <summary>
 /// 获取牌桌所有牌
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static Card[] GetAll(this DeskCardsCacheComponent self)
 {
     return(self.library.ToArray());
 }
Exemple #14
0
 /// <summary>
 /// 获取总权值
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static int GetTotalWeight(this DeskCardsCacheComponent self)
 {
     return(CardsHelper.GetWeight(self.library.ToArray(), self.Rule));
 }
Exemple #15
0
        /// <summary>
        /// 提示出牌
        /// </summary>
        /// <param name="cards"></param>
        /// <returns></returns>
        public static async Task <List <IList <Card> > > GetPrompt(List <Card> cards, DeskCardsCacheComponent deskCardsCache, CardsType type)
        {
            List <IList <Card> > result    = new List <IList <Card> >();
            IList <Card>         deskCards = deskCardsCache.GetAll();
            int weight = deskCardsCache.GetTotalWeight();

            if (type == CardsType.JokerBoom)
            {
                return(result);
            }

            //检索王炸
            if (cards.Count >= 2)
            {
                IList <Card> groupCards = new Card[2];
                groupCards[0] = cards[0];
                groupCards[1] = cards[1];

                if (IsJokerBoom(groupCards))
                {
                    result.Add(groupCards);
                }
            }

            //检索炸弹
            for (int i = cards.Count - 1; i >= 3; i--)
            {
                IList <Card> groupCards = new Card[4];
                groupCards[0] = cards[i - 3];
                groupCards[1] = cards[i - 2];
                groupCards[2] = cards[i - 1];
                groupCards[3] = cards[i];

                if (IsBoom(groupCards) && GetWeight(groupCards, CardsType.Boom) > weight)
                {
                    result.Add(groupCards);
                }
            }

            switch (type)
            {
            case CardsType.OnlyThree:
                for (int i = cards.Count - 1; i >= 2; i--)
                {
                    if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                    {
                        continue;
                    }

                    IList <Card> groupCards = new Card[3];
                    groupCards[0] = cards[i - 2];
                    groupCards[1] = cards[i - 1];
                    groupCards[2] = cards[i];

                    if (IsOnlyThree(groupCards) && GetWeight(groupCards, type) > weight)
                    {
                        result.Add(groupCards);
                    }
                }
                break;

            case CardsType.ThreeAndOne:
                if (cards.Count >= 4)
                {
                    for (int i = cards.Count - 1; i >= 2; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        List <Card> other = new List <Card>(cards);
                        other.RemoveRange(i - 2, 3);

                        IList <Card> groupCards = new Card[4];
                        groupCards[0] = cards[i - 2];
                        groupCards[1] = cards[i - 1];
                        groupCards[2] = cards[i];
                        groupCards[3] = other[RandomHelper.RandomNumber(0, other.Count)];

                        if (IsThreeAndOne(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.ThreeAndTwo:
                if (cards.Count >= 5)
                {
                    for (int i = cards.Count - 1; i >= 2; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        List <Card> other = new List <Card>(cards);
                        other.RemoveRange(i - 2, 3);

                        List <IList <Card> > otherDouble = await GetPrompt(other, deskCardsCache, CardsType.Double);

                        if (otherDouble.Count > 0)
                        {
                            IList <Card> randomDouble = otherDouble[RandomHelper.RandomNumber(0, otherDouble.Count)];
                            IList <Card> groupCards   = new Card[5];
                            groupCards[0] = cards[i - 2];
                            groupCards[1] = cards[i - 1];
                            groupCards[2] = cards[i];
                            groupCards[3] = randomDouble[0];
                            groupCards[4] = randomDouble[1];

                            if (IsThreeAndTwo(groupCards) && GetWeight(groupCards, type) > weight)
                            {
                                result.Add(groupCards);
                            }
                        }
                    }
                }
                break;

            case CardsType.Straight:
                /*
                 * 7 6 5 4 3
                 * 8 7 6 5 4
                 *
                 * */
                if (cards.Count >= deskCards.Count)
                {
                    for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        //是否全部搜索完成
                        bool         isTrue     = true;
                        IList <Card> groupCards = new Card[deskCards.Count];
                        for (int j = 0; j < deskCards.Count; j++)
                        {
                            //搜索连续权重牌
                            Card findCard = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + j).FirstOrDefault();
                            if (findCard == null)
                            {
                                isTrue = false;
                                break;
                            }
                            groupCards[deskCards.Count - 1 - j] = findCard;
                        }

                        if (isTrue && IsStraight(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.DoubleStraight:
                /*
                 * 5 5 4 4 3 3
                 * 6 6 5 5 4 4
                 *
                 * */
                if (cards.Count >= deskCards.Count)
                {
                    for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        //是否全部搜索完成
                        bool         isTrue     = true;
                        IList <Card> groupCards = new Card[deskCards.Count];
                        for (int j = 0; j < deskCards.Count; j += 2)
                        {
                            //搜索连续权重牌
                            IList <Card> findCards = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + (j / 2)).ToArray();
                            if (findCards.Count < 2)
                            {
                                isTrue = false;
                                break;
                            }
                            groupCards[deskCards.Count - 2 - j] = findCards[0];
                            groupCards[deskCards.Count - 1 - j] = findCards[1];
                        }

                        if (isTrue && IsDoubleStraight(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.TripleStraight:
                if (cards.Count >= deskCards.Count)
                {
                    for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        //是否全部搜索完成
                        bool         isTrue     = true;
                        IList <Card> groupCards = new Card[deskCards.Count];
                        for (int j = 0; j < deskCards.Count; j += 3)
                        {
                            //搜索连续权重牌
                            IList <Card> findCards = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + (j / 3)).ToArray();
                            if (findCards.Count < 3)
                            {
                                isTrue = false;
                                break;
                            }
                            groupCards[deskCards.Count - 3 - j] = findCards[0];
                            groupCards[deskCards.Count - 2 - j] = findCards[1];
                            groupCards[deskCards.Count - 1 - j] = findCards[2];
                        }

                        if (isTrue && IsTripleStraight(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.Double:
                if (cards.Count >= 2)
                {
                    for (int i = cards.Count - 1; i >= 1; i--)
                    {
                        IList <Card> groupCards = new Card[2];
                        groupCards[0] = cards[i - 1];
                        groupCards[1] = cards[i];

                        if (IsDouble(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.Single:
                if (cards.Count >= 1)
                {
                    for (int i = cards.Count - 1; i >= 0; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        IList <Card> groupCards = new Card[1];
                        groupCards[0] = cards[i];

                        if (IsSingle(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            default:
                break;
            }

            return(result);
        }
Exemple #16
0
 /// <summary>
 /// 向牌库中添加牌
 /// </summary>
 /// <param name="card"></param>
 public static void AddCard(this DeskCardsCacheComponent self, Card card)
 {
     self.library.Add(card);
 }
        protected override async Task Run(Room room, Actor_PlayerEnterRoom_Req message, Action <Actor_PlayerEnterRoom_Ack> reply)
        {
            Actor_PlayerEnterRoom_Ack response = new Actor_PlayerEnterRoom_Ack();

            try
            {
                Gamer gamer = room.Get(message.UserID);
                if (gamer == null)
                {
                    //创建房间玩家对象
                    gamer = GamerFactory.Create(message.PlayerID, message.UserID);
                    await gamer.AddComponent <MailBoxComponent>().AddLocation();

                    gamer.AddComponent <UnitGateComponent, long>(message.SessionID);

                    //加入到房间
                    room.Add(gamer);

                    Actor_GamerEnterRoom_Ntt broadcastMessage = new Actor_GamerEnterRoom_Ntt();
                    foreach (Gamer _gamer in room.GetAll())
                    {
                        if (_gamer == null)
                        {
                            //添加空位
                            broadcastMessage.Gamers.Add(null);
                            continue;
                        }

                        //添加玩家信息
                        GamerInfo info = new GamerInfo()
                        {
                            UserID = _gamer.UserID, IsReady = _gamer.IsReady
                        };
                        broadcastMessage.Gamers.Add(info);
                    }

                    //广播房间内玩家消息
                    room.Broadcast(broadcastMessage);

                    Log.Info($"玩家{message.UserID}进入房间");
                }
                else
                {
                    //玩家重连
                    gamer.isOffline = false;
                    gamer.PlayerID  = message.PlayerID;
                    gamer.GetComponent <UnitGateComponent>().GateSessionActorId = message.SessionID;

                    //玩家重连移除托管组件
                    gamer.RemoveComponent <TrusteeshipComponent>();

                    Actor_GamerEnterRoom_Ntt broadcastMessage = new Actor_GamerEnterRoom_Ntt();
                    foreach (Gamer _gamer in room.GetAll())
                    {
                        if (_gamer == null)
                        {
                            //添加空位
                            broadcastMessage.Gamers.Add(null);
                            continue;
                        }

                        //添加玩家信息
                        GamerInfo info = new GamerInfo()
                        {
                            UserID = _gamer.UserID, IsReady = _gamer.IsReady
                        };
                        broadcastMessage.Gamers.Add(info);
                    }

                    //发送房间玩家信息
                    ActorMessageSender actorProxy = gamer.GetComponent <UnitGateComponent>().GetActorMessageSender();
                    actorProxy.Send(broadcastMessage);

                    List <GamerCardNum>      gamersCardNum   = new List <GamerCardNum>();
                    List <GamerState>        gamersState     = new List <GamerState>();
                    GameControllerComponent  gameController  = room.GetComponent <GameControllerComponent>();
                    OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
                    DeskCardsCacheComponent  deskCardsCache  = room.GetComponent <DeskCardsCacheComponent>();

                    foreach (Gamer _gamer in room.GetAll())
                    {
                        HandCardsComponent handCards = _gamer.GetComponent <HandCardsComponent>();
                        gamersCardNum.Add(new GamerCardNum()
                        {
                            UserID = _gamer.UserID,
                            Num    = _gamer.GetComponent <HandCardsComponent>().GetAll().Length
                        });
                        gamersState.Add(new GamerState()
                        {
                            UserID            = _gamer.UserID,
                            Identity          = (byte)handCards.AccessIdentity,
                            GrabLandlordState = orderController.GamerLandlordState.ContainsKey(_gamer.UserID)
                            ? orderController.GamerLandlordState[_gamer.UserID]
                            : false
                        });
                    }

                    //发送游戏开始消息
                    Actor_GameStart_Ntt gameStartNotice = new Actor_GameStart_Ntt()
                    {
                        HandCards     = gamer.GetComponent <HandCardsComponent>().GetAll(),
                        GamersCardNum = gamersCardNum
                    };
                    actorProxy.Send(gameStartNotice);

                    Card[] lordCards = null;

                    if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None)
                    {
                        //广播先手玩家
                        actorProxy.Send(new Actor_AuthorityGrabLandlord_Ntt()
                        {
                            UserID = orderController.CurrentAuthority
                        });
                    }
                    else
                    {
                        if (gamer.UserID == orderController.CurrentAuthority)
                        {
                            //发送可以出牌消息
                            bool isFirst = gamer.UserID == orderController.Biggest;
                            actorProxy.Send(new Actor_AuthorityPlayCard_Ntt()
                            {
                                UserID = orderController.CurrentAuthority, IsFirst = isFirst
                            });
                        }
                        lordCards = deskCardsCache.LordCards.ToArray();
                    }
                    //发送重连数据
                    Actor_GamerReconnect_Ntt reconnectNotice = new Actor_GamerReconnect_Ntt()
                    {
                        Multiples   = room.GetComponent <GameControllerComponent>().Multiples,
                        GamersState = gamersState,
                        DeskCards   = new KeyValuePair <long, Card[]>(orderController.Biggest, deskCardsCache.library.ToArray()),
                        LordCards   = lordCards,
                    };
                    actorProxy.Send(reconnectNotice);

                    Log.Info($"玩家{message.UserID}重连");
                }

                response.GamerID = gamer.Id;

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Exemple #18
0
        protected override Task Run(Room entity, PlayerReconnect message)
        {
            Gamer gamer = entity.GetAll().Where(g => g.UserId == message.UserId).FirstOrDefault();

            if (gamer != null)
            {
                long pastId = gamer.Id;
                gamer.Id        = message.PlayerId;
                gamer.isOffline = false;
                entity.Replace(pastId, gamer);

                gamer.RemoveComponent <AutoPlayCardsComponent>();

                UnitGateComponent unitGateComponent = gamer.GetComponent <UnitGateComponent>();
                unitGateComponent.GateSessionId = message.GateSessionId;

                ActorProxy actorProxy = unitGateComponent.GetActorProxy();
                OrderControllerComponent orderController = entity.GetComponent <OrderControllerComponent>();
                DeskCardsCacheComponent  deskCardsCache  = entity.GetComponent <DeskCardsCacheComponent>();
                GameControllerComponent  gameController  = entity.GetComponent <GameControllerComponent>();

                //替换过期玩家ID
                if (orderController.FirstAuthority.Key == pastId)
                {
                    orderController.FirstAuthority = new KeyValuePair <long, bool>(gamer.Id, orderController.FirstAuthority.Value);
                }
                if (orderController.Biggest == pastId)
                {
                    orderController.Biggest = gamer.Id;
                }
                if (orderController.CurrentAuthority == pastId)
                {
                    orderController.CurrentAuthority = gamer.Id;
                }

                entity.Broadcast(new GamerReenter()
                {
                    PastId = pastId, NewId = gamer.Id
                });

                //发送房间玩家信息
                Gamer[]     gamers     = entity.GetAll();
                GamerInfo[] gamersInfo = new GamerInfo[gamers.Length];
                for (int i = 0; i < gamers.Length; i++)
                {
                    gamersInfo[i]          = new GamerInfo();
                    gamersInfo[i].PlayerId = gamers[i].Id;
                    gamersInfo[i].UserId   = gamers[i].UserId;
                    gamersInfo[i].IsReady  = gamers[i].IsReady;
                }
                actorProxy.Send(new GamerEnter()
                {
                    RoomId = entity.Id, GamersInfo = gamersInfo
                });

                Dictionary <long, int>      gamerCardsNum  = new Dictionary <long, int>();
                Dictionary <long, Identity> gamersIdentity = new Dictionary <long, Identity>();
                Array.ForEach(gamers, (g) =>
                {
                    HandCardsComponent handCards = g.GetComponent <HandCardsComponent>();
                    gamerCardsNum.Add(g.Id, handCards.CardsCount);
                    gamersIdentity.Add(g.Id, handCards.AccessIdentity);
                });

                //发送玩家手牌
                actorProxy.Send(new GameStart()
                {
                    GamerCards    = gamer.GetComponent <HandCardsComponent>().GetAll(),
                    GamerCardsNum = gamerCardsNum
                });

                Card[] lordCards = null;
                if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None)
                {
                    //广播先手玩家
                    entity.Broadcast(new SelectAuthority()
                    {
                        PlayerId = orderController.CurrentAuthority
                    });
                }
                else
                {
                    lordCards = deskCardsCache.LordCards.ToArray();
                }

                //发送重连消息
                actorProxy.Send(new GamerReconnect()
                {
                    PlayerId       = gamer.Id,
                    Multiples      = gameController.Multiples,
                    GamersIdentity = gamersIdentity,
                    LordCards      = lordCards,
                    DeskCards      = new KeyValuePair <long, Card[]>(orderController.Biggest, deskCardsCache.library.ToArray())
                });

                //发送当前出牌者消息
                bool isFirst = orderController.Biggest == orderController.CurrentAuthority;
                actorProxy.Send(new AuthorityPlayCard()
                {
                    PlayerId = orderController.CurrentAuthority, IsFirst = isFirst
                });

                Log.Info($"玩家{gamer.Id}重连");
            }
            return(Task.CompletedTask);
        }