Exemplo n.º 1
0
 public static void PlayPlayerHand(PlayerAction playerAction, CardCollection playerHand, List<CardCollection> playerHands,
     CardCollection dealerHand, CardCollection gameDeck, int splitCount, ref double playerBalance, double playerBetSize)
 {
     if (playerAction == PlayerAction.Hit || (playerHand.Count() > 2 && playerAction == PlayerAction.DoubleOrHit))
     {
         Console.WriteLine("Hit");
         BJUtility.TransferCard(gameDeck, playerHand);
         if (playerHand.ContainsAce() && splitCount == 1 && playerHand.Count() == 2)
             Console.WriteLine("Stand");
         else
             PlayPlayerHand(DeterminePlayerAction(playerHand, dealerHand.PeekCard(), splitCount < 3 ? true : false),
                 playerHand, playerHands, dealerHand, gameDeck, splitCount, ref playerBalance, playerBetSize);
     }
     else if (playerAction == PlayerAction.Split)
     {
         Console.WriteLine("Split");
         if (playerHand.Count() != 2) return;
         CardCollection hand1 = new CardCollection(null);
         CardCollection hand2 = new CardCollection(null);
         hand1.CashBalance = playerHand.CashBalance;
         playerBalance -= playerBetSize;
         hand2.CashBalance += playerBetSize;
         BJUtility.TransferCard(playerHand, hand1);
         BJUtility.TransferCard(playerHand, hand2);
         playerHands.Add(hand1);
         playerHands.Add(hand2);
         playerHands.RemoveAt(playerHands.Count() - 3);
         int newSplitCount = splitCount + 1;
         PlayPlayerHand(
             BJUtility.DeterminePlayerAction(playerHands[playerHands.Count() - 1], dealerHand.PeekCard(), (newSplitCount < 3 && !playerHands[0].ContainsAce()) ? true : false),
             playerHands[playerHands.Count() - 1], playerHands, dealerHand, gameDeck, newSplitCount, ref playerBalance, playerBetSize);
         PlayPlayerHand(
             BJUtility.DeterminePlayerAction(playerHands[playerHands.Count() - 2], dealerHand.PeekCard(), (newSplitCount < 3 && !playerHands[0].ContainsAce()) ? true : false),
             playerHands[playerHands.Count() - 2], playerHands, dealerHand, gameDeck, newSplitCount, ref playerBalance, playerBetSize);
     }
     else if (playerAction == PlayerAction.Stand || (playerHand.Count() > 2 && playerAction == PlayerAction.DoubleOrStand))
     {
         Console.WriteLine("Stand");
     }
     else if ((playerAction == PlayerAction.DoubleOrStand || playerAction == PlayerAction.DoubleOrHit) && playerHand.Count() <= 2)
     {
         Console.WriteLine("Double");
         playerBalance -= playerBetSize;
         playerHand.CashBalance += playerBetSize;
         BJUtility.TransferCard(gameDeck, playerHand);
     }
 }
Exemplo n.º 2
0
        public static PlayerAction DeterminePlayerAction(CardCollection playerHand, Card dealerCard, bool canSplit)
        {
            // if the player has no cards, just hit
            if (playerHand == null || playerHand.Count() == 0)
                return PlayerAction.Hit;

            // if none of the player hand values are below 21, just stand
            if (playerHand.GetValues().Where(v => v < 21).Count() == 0 || playerHand.GetValues().Contains(21))
                return PlayerAction.Stand;

            List<int> playerValues = playerHand.GetValues();
            int playerValue = playerValues[0];
            int dealerValue = new CardCollection(null, new List<Card>() { dealerCard }).GetValues()[0];

            // if the player hand is a pair
            if (playerHand.IsPair() && canSplit)
            {
                // set the playerValue equal to the value of just one of their cards
                playerValue = new CardCollection(null, new List<Card>() { playerHand.PeekCard() }).GetValues()[0];

                // if the dealer shows an ace
                if (dealerCard.IsAce())
                {
                    if (playerValue <= 7) return PlayerAction.Hit;
                    if (playerValue == 8 || playerHand.ContainsAce()) return PlayerAction.Split;
                    return PlayerAction.Stand;
                }
                // if the dealer shows hard value (no ace)
                if (playerValue <= 3 && dealerValue <= 7) return PlayerAction.Split;
                if (playerValue <= 3 && dealerValue >= 8) return PlayerAction.Hit;
                if (playerValue == 4 && (dealerValue == 5 || dealerValue == 6)) return PlayerAction.Split;
                if (playerValue == 4 && (dealerValue <= 4 || dealerValue >= 7)) return PlayerAction.Hit;
                if (playerValue == 5 && dealerValue <= 9) return PlayerAction.DoubleOrHit;
                if (playerValue == 5 && dealerValue == 10) return PlayerAction.Hit;
                if (playerValue == 6 && dealerValue <= 6) return PlayerAction.Split;
                if (playerValue == 6 && dealerValue >= 7) return PlayerAction.Hit;
                if (playerValue == 7 && dealerValue <= 7) return PlayerAction.Split;
                if (playerValue == 7 && dealerValue >= 8) return PlayerAction.Hit;
                if (playerValue == 8) return PlayerAction.Split;
                if (playerValue == 9 && (dealerValue == 7 || dealerValue == 10)) return PlayerAction.Stand;
                if (playerValue == 9 && (dealerValue <= 6 || dealerValue == 8 || dealerValue == 9)) return PlayerAction.Split;
                if (playerValue == 10) return PlayerAction.Stand;
                if (playerHand.ContainsAce()) return PlayerAction.Split;
            }
            // if the player has only a hard valued hand
            else if (playerValues.Where(v => v < 21).Count() == 1)
            {
                // set the playerValue equal to the one and only available value below 21
                playerValue = playerValues[0];

                // if the dealer shows an ace
                if (dealerCard.IsAce())
                {
                    if ((playerValue >= 5 && playerValue <= 10) || (playerValue >= 12 && playerValue <= 16)) return PlayerAction.Hit;
                    if (playerValue == 11) return PlayerAction.DoubleOrHit;
                    if (playerValue >= 17) return PlayerAction.Stand;
                }
                // if the dealer shows hard value (no ace)
                if (playerValue <= 8) return PlayerAction.Hit;
                if (playerValue == 9 && (dealerValue == 2 || dealerValue >= 7)) return PlayerAction.Hit;
                if (playerValue == 9 && (dealerValue >= 3 && dealerValue <= 6)) return PlayerAction.DoubleOrHit;
                if (playerValue == 10 && dealerValue <= 9) return PlayerAction.DoubleOrHit;
                if (playerValue == 10 && dealerValue == 10) return PlayerAction.Hit;
                if (playerValue == 11) return PlayerAction.DoubleOrHit;
                if (playerValue == 12 && (dealerValue == 2 || dealerValue == 3 || dealerValue >= 7)) return PlayerAction.Hit;
                if (playerValue == 12 && (dealerValue >= 4 && dealerValue <= 6)) return PlayerAction.Stand;
                if (playerValue >= 13 && playerValue <= 16 && dealerValue >= 2 && dealerValue <= 6) return PlayerAction.Stand;
                if (playerValue >= 13 && playerValue <= 16 && dealerValue >= 7) return PlayerAction.Hit;
            }
            // if the player has a soft value available
            else
            {
                // set the playerValue equal to the highest available value below 21
                playerValue = playerValues[playerValues.Where(v => v < 21).Count() - 1];

                if (dealerCard.IsAce())
                {
                    if (playerValue <= 18) return PlayerAction.Hit;
                    if (playerValue >= 19) return PlayerAction.Stand;
                }

                if (playerValue == 11) return PlayerAction.DoubleOrHit;
                if ((playerValue == 13 || playerValue == 14) && (dealerValue == 5 || dealerValue == 6)) return PlayerAction.DoubleOrHit;
                if ((playerValue == 13 || playerValue == 14) && !(dealerValue == 5 || dealerValue == 6)) return PlayerAction.Hit;
                if ((playerValue == 15 || playerValue == 16) && (dealerValue >= 4 && dealerValue <= 6)) return PlayerAction.DoubleOrHit;
                if ((playerValue == 15 || playerValue == 16) && !(dealerValue >= 4 && dealerValue <= 6)) return PlayerAction.Hit;
                if (playerValue == 17 && (dealerValue == 2 || dealerValue >= 7)) return PlayerAction.Hit;
                if (playerValue == 17 && (dealerValue >= 3 && dealerValue <= 6)) return PlayerAction.DoubleOrHit;
                if (playerValue == 18 && dealerValue <= 6) return PlayerAction.DoubleOrStand;
                if (playerValue == 18 && (dealerValue == 7 || dealerValue == 8)) return PlayerAction.Stand;
                if (playerValue == 18 && dealerValue >= 9) return PlayerAction.Hit;
                if (playerValue == 19 && dealerValue == 6) return PlayerAction.DoubleOrStand;
                if (playerValue == 19 && dealerValue != 6) return PlayerAction.Stand;
                if (playerValue == 20) return PlayerAction.Stand;
            }

            return PlayerAction.Stand;
        }