public void InitGameContext(UserContext first, UserContext second, BaseHero firstHero, BaseHero secondHero)
        {
            gameContext = new GameContext()
            {
                GameCode        = "GameCode",
                CurrentTurnCode = "CurrentTurnCode",
                NextTurnCode    = "NextTurnCode",
                Players         = new List <UserContext> {
                    first, second
                },
                GameStatus = GameStatus.进行中,
                TurnIndex  = 10,
            };
            gameContext.DeskCards = new DeskBoard()
            {
                firstHero, null, null, null, null, null, null, null, secondHero, null, null, null, null, null, null, null
            };

            IGameCache gameCache = Substitute.For <IGameCache>();

            gameCache.GetAllCard().Returns(CardsUtil.AllCard);
            gameCache.GetContext(Arg.Any <string>()).Returns(gameContext);

            gameContext.GameCache = gameCache;
            proxy = new Controller_Base_Proxy(gameCache);
        }
        public void GameStart(GameModel game, PlayerModel firstPlayer, PlayerModel secondPlayer, List <UserCardGroupDetailModel> firstCardGroup, List <UserCardGroupDetailModel> secondCardGroup, string firstUserProfession, string secondUserProfession)
        {
            #region 加载玩家卡组
            UserContext firstUser = new UserContext
            {
                UserCode     = firstPlayer.UserCode,
                Player       = firstPlayer,
                IsActivation = true,
                IsFirst      = true,
                AllCards     = new List <Card>()
            };
            List <Card> lstCardLib = _gameCache.GetAllCard();

            int cardInGameIndex = 0;
            foreach (var cg in firstCardGroup)
            {
                Card libCard = lstCardLib.First(c => c.CardCode == cg.CardCode);
                var  card    = Activator.CreateInstance(libCard.GetType()) as Card;
                card.CardInGameCode    = cardInGameIndex.ToString();
                card.IsFirstPlayerCard = true;
                firstUser.AllCards.Add(card);
                cardInGameIndex++;
            }

            UserContext secondUser = new UserContext
            {
                UserCode     = secondPlayer.UserCode,
                Player       = secondPlayer,
                IsActivation = true,
                IsFirst      = false,
                AllCards     = new List <Card>()
            };
            secondCardGroup.ForEach(delegate(UserCardGroupDetailModel detail)
            {
                Card libCard           = lstCardLib.First(c => c.CardCode == detail.CardCode);
                var card               = Activator.CreateInstance(libCard.GetType()) as Card;
                card.CardInGameCode    = cardInGameIndex.ToString();
                card.IsFirstPlayerCard = false;
                secondUser.AllCards.Add(card);
                cardInGameIndex++;
            });

            //secondUser.StockCards = secondUser.AllCards;


            GameContext = new GameContext
            {
                Players         = new List <UserContext>(),
                DeskCards       = null,
                GameCode        = game.GameCode,
                CurrentTurnCode = game.CurrentTurnCode,
                NextTurnCode    = game.NextTurnCode,
                GameStatus      = GameStatus.进行中,
                GameCache       = _gameCache
            };
            GameContext.Players.Add(firstUser);
            GameContext.Players.Add(secondUser);
            #endregion

            #region 初始化开场选牌
            int        firstPickUpCount = 4;
            List <int> lstRndIndex      = RandomUtil.CreateRandomInt(0, GameContext.Players.First(c => c.IsFirst).AllCards.Count - 1, firstPickUpCount);
            for (int i = 0; i < lstRndIndex.Count; i++)
            {
                if (i < lstRndIndex.Count - 1)
                {
                    //lstFirstPickUpCard.Add(GameContext.Players.First(c => c.IsFirst).AllCards[lstRndIndex[i]]);
                    GameContext.Players.First(c => c.IsFirst).AllCards[lstRndIndex[i]].CardLocation = CardLocation.InitCard;
                }
                //lstSecondPickUpCard.Add(GameContext.Players.First(c => c.IsFirst == false).AllCards[lstRndIndex[i]]);
                GameContext.Players.First(c => c.IsFirst == false).AllCards[lstRndIndex[i]].CardLocation = CardLocation.InitCard;
            }

            BaseHero firstHero = null, secondHero = null;
            switch (firstUserProfession)
            {
            case "Druid": firstHero = new Druid(); break;

            case "Hunter": firstHero = new Hunter(); break;

            case "Mage": firstHero = new Mage(); break;

            case "Paladin": firstHero = new Paladin(); break;

            case "Priest": firstHero = new Priest(); break;

            case "Rogue": firstHero = new Rogue(); break;

            case "Shaman": firstHero = new Shaman(); break;

            case "Warlock": firstHero = new Warlock(); break;

            case "Warrior": firstHero = new Warrior(); break;
            }
            switch (secondUserProfession)
            {
            case "Druid": secondHero = new Druid(); break;

            case "Hunter": secondHero = new Hunter(); break;

            case "Mage": secondHero = new Mage(); break;

            case "Paladin": secondHero = new Paladin(); break;

            case "Priest": secondHero = new Priest(); break;

            case "Rogue": secondHero = new Rogue(); break;

            case "Shaman": secondHero = new Shaman(); break;

            case "Warlock": secondHero = new Warlock(); break;

            case "Warrior": secondHero = new Warrior(); break;
            }

            cardInGameIndex++;
            firstHero.CardLocation      = CardLocation.场上;
            firstHero.CardInGameCode    = cardInGameIndex.ToString();
            firstHero.DeskIndex         = 0;
            firstHero.IsFirstPlayerCard = true;
            firstUser.AllCards.Add(firstHero);

            cardInGameIndex++;
            secondHero.CardLocation      = CardLocation.场上;
            secondHero.CardInGameCode    = cardInGameIndex.ToString();
            secondHero.DeskIndex         = 8;
            secondHero.IsFirstPlayerCard = false;
            secondUser.AllCards.Add(secondHero);

            GameContext.DeskCards = new DeskBoard()
            {
                firstHero, null, null, null, null, null, null, null, secondHero, null, null, null, null, null, null, null
            };
            #endregion

            GameContext.Settlement();
            _gameCache.SetContext(GameContext);
        }