예제 #1
0
파일: Deal.cs 프로젝트: kwmcrell/ArmedCards
        private Entities.GameRoundCard CreateQuestion(IEnumerable<Entities.Card> cards, Entities.Game game)
        {
            Entities.Card card = cards.FirstOrDefault();

            Entities.GameRoundCard question = null;

            if (card != null)
            {
                Entities.GameRound round = game.CurrentRound();

                question = new Entities.GameRoundCard(card, round.CardCommander.UserId, round.GameRoundID, game.GameID);
            }

            return question;
        }
예제 #2
0
파일: Deal.cs 프로젝트: kwmcrell/ArmedCards
        /// <summary>
        /// Handle dealing cards to players in <paramref name="game"/>
        /// </summary>
        /// <param name="game">The game to deal cards for</param>
        /// <param name="dealQuestion">Is a question card needed</param>
        public void Execute(Entities.Game game, Boolean dealQuestion)
        {
            List<Entities.Card> questions;
            List<Entities.Card> answers;
            _shuffleCards.Execute(game, out questions, out answers);

            IEnumerable<Entities.Card> filteredQuestions = _excludeByCount.Execute(questions, game.QuestionShuffleCount);

            Entities.GameRoundCard dealtQuestion = null;

            if(dealQuestion)
            {
                dealtQuestion = CreateQuestion(filteredQuestions, game);
            }
            else
            {
                dealtQuestion = new Entities.GameRoundCard
                {
                    Card = game.CurrentRound().Question
                };
            }

            IEnumerable<Entities.Card> filteredAnswers = _excludeCurrentHands.Execute(answers);
            filteredAnswers = _excludeByCount.Execute(filteredAnswers, game.AnswerShuffleCount);

            Dictionary<Int32, Int32> drawCount = _calculateDrawCount.Execute(dealtQuestion.Card, game.Players);

            Boolean needMoreQuestions = dealtQuestion == null && dealQuestion;
            Boolean needMoreAnswers = drawCount.Values.Sum() > filteredAnswers.Count();

            if (needMoreQuestions || needMoreAnswers)
            {
                if (needMoreQuestions)
                {
                    //Update reshuffle counts
                    filteredQuestions = _excludeByCount.Execute(questions, ++game.QuestionShuffleCount);

                    //Reselect question card
                    dealtQuestion = CreateQuestion(filteredQuestions, game);

                    drawCount = _calculateDrawCount.Execute(dealtQuestion.Card, game.Players);

                    needMoreAnswers = drawCount.Values.Sum() > filteredAnswers.Count();
                }

                if (needMoreAnswers)
                {
                    filteredAnswers = _excludeCurrentHands.Execute(answers);
                    filteredAnswers = _excludeByCount.Execute(filteredAnswers, ++game.AnswerShuffleCount);
                }

                _updateGame.Execute(new Entities.Filters.Game.UpdateCounts(game.GameID, game.QuestionShuffleCount, game.AnswerShuffleCount));
            }

            if (dealQuestion)
            {
                _insertGameRoundCard.Execute(new List<Entities.GameRoundCard> { dealtQuestion });
                game.CurrentRound().Question = dealtQuestion.Card;
            }

            _createHand.Execute(filteredAnswers.ToList(), drawCount, game);
        }
예제 #3
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="game"></param>
        /// <param name="userId"></param>
        /// <param name="hand"></param>
        /// <param name="playerType"></param>
        /// <param name="voteToKickList"></param>
        /// <param name="completedRounds"></param>
        public GameBoard(Entities.Game game, Int32 userId, Entities.Enums.GamePlayerType playerType,
                         List<Models.Game.Board.VoteToKick> voteToKickList = null,
                         List<Entities.GameRound> completedRounds = null)
        {
            Game = game;
            UserId = userId;

            Hand = new List<GamePlayerCard>();

            if (playerType == Enums.GamePlayerType.Player)
            {
                Entities.GamePlayer player = Game.Players.FirstOrDefault(x => x.User.UserId == userId);

                if(player != null && player.Hand != null)
                {
                    Hand = player.Hand;
                }
            }

            Hand = playerType == Enums.GamePlayerType.Player ? Game.Players.First(x => x.User.UserId == userId).Hand : new List<GamePlayerCard>();
            ActivePlayer = Hand.Count > 0;
            PlayerType = playerType;

            Entities.GameRound round = Game.CurrentRound();

            if (Game.HasRounds() && round != null)
            {
                Answered = round.HasAnswer(UserId);
                ShowAnswers = round.PlayedCount >= round.CurrentPlayerCount && round.Answers.Count > 0;
                RoundHasWinner = round.Winner() != null;
                GroupedAnswers = round.GroupedAnswers();
                IsCommander = Game.IsCurrentCommander(UserId) && PlayerType == Entities.Enums.GamePlayerType.Player;
            }
            else
            {
                Answered = false;
                ShowAnswers = false;
                RoundHasWinner = false;
                IsCommander = false;
            }

            ShowHand = ActivePlayer && !Answered && !IsCommander && PlayerType == Entities.Enums.GamePlayerType.Player;

            ShowWaiting = (round == null || RoundHasWinner) && Game.IsWaiting();

            WaitingOnAllAnswersOrWinner = !RoundHasWinner && !ShowAnswers;

            ShowBoard = !ShowWaiting && !Game.HasWinner();

            if (ShowBoard && round != null)
            {
                Question = round.Question;
            }
            else
            {
                Question = null;
            }

            AnswersViewModel = new Answers(RoundHasWinner, IsCommander, WaitingOnAllAnswersOrWinner, ShowAnswers, ShowHand, ShowBoard, GroupedAnswers);
            GameOverViewModel = new GameOver(Game.HasWinner(), Game.GameID, Game.Players);
            HandViewModel = new Board.Hand(ShowHand, Hand, ShowBoard);
            LobbyViewModel = new Lobby(PlayerType, Game.Players, Game.MaxNumberOfSpectators > 0, Game.Spectators);
            RoundQuestionViewModel = new RoundQuestion(round, ShowBoard);
            WaitingViewModel = new Waiting(ShowWaiting);
            VotesToKickViewModel = new VotesToKick(voteToKickList ?? new List<Models.Game.Board.VoteToKick>());
            AllRoundsViewModel = new AllRounds(completedRounds ?? new List<GameRound>());

            HeaderViewModel = new Shared.Header();

            if (Game.HasWinner())
            {
                HeaderViewModel.SubHeaderText = "Game Over, man!";
            }
            else if (ShowWaiting)
            {
                HeaderViewModel.SubHeaderText = ArmedCards.Entities.Models.Helpers.WaitingHeader.Build(Game, UserId, PlayerType);
            }
            else
            {
                HeaderViewModel.SubHeaderText = String.Format("{0} is the Card Commander", Game.DetermineCommander().DisplayName);
            }
        }