private void initializeHand() { playerHands = new List<CardCollection>(); dealerHand = new CardCollection(random); CardCollection playerHand = new CardCollection(random); playerBalance -= playerBetSize; playerHand.CashBalance += playerBetSize; playerHands.Add(playerHand); }
private void initializeGame() { dealerHand = new CardCollection(random); playerHands = new List<CardCollection>(); playerBalances = new List<double>(); playerBalances.Add(playerBalance); gameDeck = BJUtility.CreateDeck(random); gameDeck.Shuffle(); gameDeck.Shuffle(); gameDeck.Shuffle(); }
public static CardCollection CreateDeck(Random random) { CardCollection cards = new CardCollection(random); // populate the deck 8 times for (int i = 0; i < 8; i++) { foreach (CardName cardSuit in Enum.GetValues(typeof(CardSuit))) foreach (CardName cardName in Enum.GetValues(typeof(CardName))) cards.AddCard(new Card((CardName)cardName, (CardSuit)cardSuit)); } return cards; }
public static HandOutcome DetermineHandOutcome(CardCollection playerHand, CardCollection dealerHand) { if (playerHand == null || playerHand.Count() == 0) return HandOutcome.DealerWins; if (dealerHand == null || dealerHand.Count() == 0) return HandOutcome.PlayerWins; List<int> nonBustedPlayerValues = playerHand.GetValues().Where(v => v <= 21).ToList(); List<int> nonBustedDealerValues = dealerHand.GetValues().Where(v => v <= 21).ToList(); // check for player bust if (nonBustedPlayerValues.Count() == 0) return HandOutcome.DealerWins; // check for dealer bust if (nonBustedDealerValues.Count() == 0) return HandOutcome.PlayerWins; // get player high value int playerValue = nonBustedPlayerValues.Last(); // get dealer high value int dealerValue = nonBustedDealerValues.Last(); if (dealerValue == playerValue) return HandOutcome.Push; else if (dealerValue > playerValue) return HandOutcome.DealerWins; else if (dealerValue < playerValue) return HandOutcome.PlayerWins; return HandOutcome.Push; }
public static PlayerAction DetermineDealerAction(CardCollection dealerHand) { // if the dealer has no cards, just hit if (dealerHand == null || dealerHand.Count() == 0) return PlayerAction.Hit; // if none of the dealer hand values are below 21, just stand if (dealerHand.GetValues().Where(v => v < 21).Count() == 0) return PlayerAction.Stand; List<int> dealerValues = dealerHand.GetValues(); int dealerValue = dealerValues[0]; // if the dealer has only a hard valued hand if (dealerHand.GetValues().Where(v => v < 21).Count() == 1) { // set the dealerValue equal to the one and only available value below 21 dealerValue = dealerValues[0]; if (dealerValue < 17) return PlayerAction.Hit; else return PlayerAction.Stand; } // if the dealer has a soft value available else { // set the dealerValue equal to the highest available value below 21 dealerValue = dealerValues[dealerValues.Where(v => v < 21).Count() - 1]; if (dealerValue < 17) return PlayerAction.Hit; else // In AC, dealer stands on all 17's return PlayerAction.Stand; } }
public static bool TransferCard(CardCollection from, CardCollection to) { if (from == null || to == null || from.Count() == 0) return false; to.AddCard(from.PopCard()); return true; }
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); } }
public static void PlayDealerHand(PlayerAction dealerAction, CardCollection dealerHand, CardCollection gameDeck) { if (dealerAction == PlayerAction.Hit) { Console.WriteLine("Hit"); BJUtility.TransferCard(gameDeck, dealerHand); PlayDealerHand(BJUtility.DetermineDealerAction(dealerHand), dealerHand, gameDeck); } else if (dealerAction == PlayerAction.Stand) { Console.WriteLine("Stand"); } }
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; }