Ejemplo n.º 1
0
        public void AskEachPlayerAboutTrump(IGameState gameState, Func <ISuit> humanChooseSuit)
        {
            for (var i = 0; i < gameState.Players.Count(); i++)
            {
                gameState.AdvanceToNextPlayer();

                ISuit trumpSelected = null;

                if (gameState.CurrentPlayer.IsHuman)
                {
                    trumpSelected = humanChooseSuit();
                }
                else
                {
                    trumpSelected = gameState.CurrentPlayer.PlayerStrategy.SecondRoundTrumpChoice(gameState);
                }

                if (trumpSelected != null)
                {
                    gameState.Trump            = trumpSelected;
                    gameState.OrderingUpPlayer = gameState.CurrentPlayer;

                    OnAiChoseTrump?.Invoke(this, new AiChoseTrumpEventArgs(gameState.CurrentPlayer, trumpSelected));
                    break;
                }
            }
        }
Ejemplo n.º 2
0
        public virtual void Deal(IGameState gameState)
        {
            var deck = gameState.Deck;

            for (var i = 0; i < 100; i++)
            {
                deck.Shuffle();
            }

            gameState.CurrentPlayer = gameState.Dealer;

            //keep track of three vs two cards
            var isThreeCards = true;

            for (var i = 0; i < 8; i++)
            {
                gameState.AdvanceToNextPlayer();

                //flip the 3/2 pattern on the 4th handout
                if (i == 4)
                {
                    isThreeCards = !isThreeCards;
                }

                if (isThreeCards)
                {
                    gameState.CurrentPlayer.Cards.Add(deck.Cards.Pop());
                    gameState.CurrentPlayer.Cards.Add(deck.Cards.Pop());
                    gameState.CurrentPlayer.Cards.Add(deck.Cards.Pop());
                    isThreeCards = false;
                }
                else
                {
                    gameState.CurrentPlayer.Cards.Add(deck.Cards.Pop());
                    gameState.CurrentPlayer.Cards.Add(deck.Cards.Pop());
                    isThreeCards = true;
                }
            }

            //add rest to kitty
            gameState.Kitty = deck.Cards;

            //turn up top card of kitty
            gameState.TurnedUpCard = gameState.Kitty.Pop();

            //order each players cards
            foreach (var player in gameState.Players)
            {
                player.Cards = player.Cards.OrderBySuitsAndRanks();
            }
        }
Ejemplo n.º 3
0
        public void AskEachPlayerAboutTheTopCard(
            IGameState gameState,
            Func <bool> shouldHumanOrderUp,
            Func <ICard> humanChooseDiscard
            )
        {
            for (var i = 0; i < gameState.Players.Count(); i++)
            {
                gameState.AdvanceToNextPlayer();

                var shouldOrderUp = false;

                if (gameState.CurrentPlayer.IsHuman)
                {
                    shouldOrderUp = shouldHumanOrderUp();
                }
                else
                {
                    shouldOrderUp = gameState.CurrentPlayer.PlayerStrategy.ShouldOrderUpDealerInFirstRound(gameState);

                    OnAiOrderedUpDealer?.Invoke(this, new AiOrderedUpDealerEventArgs(gameState.CurrentPlayer, shouldOrderUp));
                }

                if (shouldOrderUp)
                {
                    //order up the dealer
                    if (gameState.Dealer.IsHuman)
                    {
                        var cardToRemove = humanChooseDiscard();

                        gameState.CurrentPlayer.Cards.Remove(cardToRemove);

                        gameState.Kitty.Push(cardToRemove);
                    }
                    else
                    {
                        gameState.Dealer.DiscardWhenOrderedUp(gameState);
                    }

                    gameState.Dealer.Cards.Add(gameState.TurnedUpCard);
                    gameState.Dealer.Cards     = gameState.Dealer.Cards.OrderBySuitsAndRanks();
                    gameState.Trump            = gameState.TurnedUpCard.Suit;
                    gameState.OrderingUpPlayer = gameState.CurrentPlayer;
                    break;
                }
            }
        }
Ejemplo n.º 4
0
        public void PlayHand(IGameState gameState, Func <ICard> chooseHumanCard)
        {
            //play a hand
            //ignoring loners for now
            for (var i = 0; i < 5; i++)
            {
                //play a trick
                for (var j = 0; j < 4; j++)
                {
                    ICard chosenCard = null;

                    if (gameState.CurrentPlayer.IsHuman)
                    {
                        chosenCard = chooseHumanCard();

                        gameState.CurrentHand.Add(new PlayedCard
                        {
                            Player = gameState.CurrentPlayer,
                            Card   = chosenCard
                        });

                        gameState.CurrentPlayer.Cards.Remove(chosenCard);
                    }
                    else
                    {
                        chosenCard = gameState.CurrentPlayer.ChooseCardToPlay(gameState);

                        gameState.CurrentHand.Add(new PlayedCard
                        {
                            Player = gameState.CurrentPlayer,
                            Card   = chosenCard
                        });

                        OnAiPlayedCard?.Invoke(this, new AiPlayedCardEventArgs(chosenCard));

                        gameState.CurrentPlayer.Cards = gameState.CurrentPlayer.Cards.ToList().Except(new List <ICard> {
                            chosenCard
                        }).ToList();
                    }

                    if (gameState.LeadSuit == null)
                    {
                        if (chosenCard.IsTheLeft(gameState.Trump))
                        {
                            gameState.LeadSuit = CardHelper.GetOppositeSuit(chosenCard.Suit);
                        }
                        else
                        {
                            gameState.LeadSuit = chosenCard.Suit;
                        }
                    }

                    gameState.AdvanceToNextPlayer();
                }

                _evaluateTrick(gameState);
                gameState.CurrentHand.Clear();
                gameState.LeadSuit = null;
            }

            _evaluateHand(gameState);

            foreach (var player in gameState.Players)
            {
                player.TricksTaken = 0;
            }
        }