// Used by PlayTimedGame to process the players winnings public static void processPlayerWinnings(BSPlayer player, BSDealer dealer) { // If this player is playing (do they have cards?) // cant use "hasQuit", because that's set in the previous loop, and the player may still need to be processed if (player.getHand(0).Count > 0) { // Loop through each hand the player has (Split Hands) for (int j = 0; j < player.getHandCount(); j++) { BlackjackResult bjr = BlackJack.getGameResult(dealer.getHand(), player.getHand(j)); // Give player the money / take it away if (bjr == BlackjackResult.PlayerWins) { // If the player wins, has only one hand and has blackjack then pay 3:2 instead of 1:1 if ((player.getHandCount() == 1) & (BlackJack.doesHandHaveBlackjack(player.getHand(j)))) { player.winBlackJack(j); } else { player.winNormalBet(j); } } else if (bjr == BlackjackResult.Push) { player.pushBet(j); } else // Dealer Wins { player.loseBet(j); } } } }
// Used to display text for debugging the end of the game private void showGameEnd(List <BSPlayer> players, BSDealer dealer) { // Loop through each player for (int i = 0; i < players.Count; i++) { // Code for debgging the playHand function for (int x = 0; x < players[i].getHandCount(); x++) { if (!players[i].hasQuit) { if (i == blackJackGameParams.tablePosition) { System.Diagnostics.Debug.WriteLine("Player Index: " + i.ToString()); System.Diagnostics.Debug.WriteLine("Bankroll: $" + players[i].getBankroll()); System.Diagnostics.Debug.WriteLine("Initial Bet: " + players[i].getInitialBet()); System.Diagnostics.Debug.WriteLine("List Index: " + x.ToString()); System.Diagnostics.Debug.Write("Dealer: "); foreach (Card c in dealer.getHand()) { System.Diagnostics.Debug.Write(c.value.ToString() + ", "); } System.Diagnostics.Debug.Write("\nCards: "); foreach (Card c in players[i].getHand(x)) { System.Diagnostics.Debug.Write(c.value.ToString() + ", "); } System.Diagnostics.Debug.WriteLine("\nWinner: " + BlackJack.getGameResult(dealer.getHand(), players[i].getHand(x)).ToString()); System.Diagnostics.Debug.WriteLine("Winnings: $" + players[i].getHandWinnings(x).ToString()); System.Diagnostics.Debug.WriteLine("Total: " + BlackJack.getHandValue(players[i].getHand(x)).ToString() + "\n"); } } } } }
// Initializes the class with the game parameters public BasicStrategySimulator(BlackJackGameParams blackJackGameParams) { this.blackJackGameParams = blackJackGameParams; this.cardCounter = new CardCounting(blackJackGameParams); deck = new Deck(blackJackGameParams.numDecks, Deck.ShuffleType.Durstenfeld, cardCounter); players = new List <BSPlayer>(); dealer = new BSDealer(blackJackGameParams.H17, deck); // Initialize the players for (int i = 0; i < blackJackGameParams.numPlayers; i++) { BSPlayer newBSPlayer = new BSPlayer(blackJackGameParams); players.Add(newBSPlayer); } }
public void playHand(BSDealer dealer, CardCounting cardCounter) { // We know the dealer doesn't have blackjack because this is tested before this portion of the game even occurs Stack <Card> splitCards = new Stack <Card>(); // Make a stack for holding the split cards int processesListCount = 0; // Keeps track of how many lists have been processed (Also reports the current lists index // While there are cards in the split pile, or their are unprocessed lists... while ((splitCards.Count > 0) | (processesListCount < this.cardList.Count)) { // If we have the same number of lists as we have processed, we must have to handle another split if (this.cardList.Count == processesListCount) { // Add the split card to the new list this.cardList.Add(new List <Card>()); // Add a new wager to the new hand this.currentBet.Add(this.initialBet); this.playerWin.Add(0); // Add the card to the new hand this.cardList[processesListCount].Add(splitCards.Pop()); } // Check if the hand has at least two cards, if it does'nt, then add one. This happens when we split if (this.cardList[processesListCount].Count == 1) { this.cardList[processesListCount].Add(dealer.takeHit()); } // Check if the higher, and lower values are both busted. If so then we've busted this hand so move to the next. if ((BlackJack.getHandValue_Lower(this.cardList[processesListCount]) > 21) & (BlackJack.getHandValue_Lower(this.cardList[processesListCount]) > 21)) { processesListCount += 1; } else { // Get the Basic Strategy move for the current card list BlackJackMove bjm = new BlackJackMove(); // If the player has doubles, but not enough money to split, then find an alternative move if (hasDoublesInHand(processesListCount) & hasQuit) { bjm = bsc.GetStrategyPairToNoPair(this.cardList[processesListCount], dealer.getUpCard()); } else { bjm = bsc.GetStrategy(this.cardList[processesListCount], dealer.getUpCard()); } switch (bjm) { case BlackJackMove.Stay: processesListCount += 1; break; case BlackJackMove.Hit: this.cardList[processesListCount].Add(dealer.takeHit()); // Add a card but don't finish processing this hand break; case BlackJackMove.Double: if (this.cardList[processesListCount].Count == 2) { // If we have enough money to double then do it, otherwise leave the table after the end of the round if ((BankRoll - currentBet[processesListCount]) > 0) { this.cardList[processesListCount].Add(dealer.takeHit()); this.BankRoll -= this.currentBet[processesListCount]; this.currentBet[processesListCount] = 2 * this.currentBet[processesListCount]; processesListCount += 1; break; } else { // Take a hit if we can't double due to money, and mark this as our last round to minimize losses hasQuit = true; this.cardList[processesListCount].Add(dealer.takeHit()); break; } } else { this.cardList[processesListCount].Add(dealer.takeHit()); // Add a card but don't finish processing this hand break; } case BlackJackMove.Double_Stay: // If we haven't hit this hand yet then double, otherwise stay if (this.cardList[processesListCount].Count == 2) { // If we have enough money to double then do it, otherwise leave the table. if ((BankRoll - currentBet[processesListCount]) > 0) { this.cardList[processesListCount].Add(dealer.takeHit()); this.BankRoll -= this.currentBet[processesListCount]; this.currentBet[processesListCount] = 2 * this.currentBet[processesListCount]; processesListCount += 1; break; } else { // Stay if we can't double due to money, and mark this as our last round to minimize losses hasQuit = true; processesListCount += 1; break; } } else { processesListCount += 1; break; } case BlackJackMove.Split: // Put the card from index 0 of the current hand into the stack. // Now, don't increment the processListCount, and reprocesses this hand. // It will only have one card so we will have to add that first. if (((BankRoll - this.initialBet) > 0) & (cardList.Count < 4)) { BankRoll -= this.initialBet; splitCards.Push(this.cardList[processesListCount][1]); this.cardList[processesListCount].RemoveAt(1); break; } else { // If we can't split due to money, then re-evaluate as a hard/soft hand and determine the new best move, mark // as the last turn to minimize losses hasQuit = true; break; } } } } // Even odds paid on split card blackjack }
public void test_BSPlayer_playHand(BlackJackGameParams blackJackGameParams, string filePath) { var lines = File.ReadAllLines(filePath).Select(a => a.Split(',', ':')); IEnumerator <string[]> iter = lines.GetEnumerator(); while (1 == 1) { int itemCount = 0; List <Card> deckList = new List <Card>(); List <Card> playersHand = new List <Card>(); List <Card> dealersHand = new List <Card>(); Double initialBet = 0; Double winnings = 0; string name = ""; while (iter.MoveNext() & (itemCount < 5)) { var l = iter.Current; switch (l[0]) { case "Name": name = l[1]; break; case "Player": for (int i = 1; i < l.Length; i++) { l[i].Replace(" ", ""); playersHand.Add(getCardFromText(l[i])); } itemCount += 1; break; case "Dealer": for (int i = 1; i < l.Length; i++) { l[i].Replace(" ", ""); dealersHand.Add(getCardFromText(l[i])); } itemCount += 1; break; case "Deck": for (int i = 1; i < l.Length; i++) { l[i].Replace(" ", ""); deckList.Add(getCardFromText(l[i])); } itemCount += 1; break; case "Initial": l[1].Replace(" ", ""); initialBet = Double.Parse(l[1]); itemCount += 1; break; case "Win": l[1].Replace(" ", ""); winnings = Double.Parse(l[1]); itemCount += 1; break; default: break; } } // When the iterator has run out of new items then return if (!(itemCount == 5)) { return; } BSPlayer player = new BSPlayer(blackJackGameParams); DeckDummy deck = new DeckDummy(); BSDealer dealer = new BSDealer(false, deck); deck.setCardList(deckList); dealer.setHand(dealersHand); player.clearCurrentBets(); player.clearHand(); player.setBankRoll(blackJackGameParams.bankroll); player.setInitialBet(initialBet); player.setFirstHand(playersHand); player.playHand(dealer, new CardCounting(blackJackGameParams)); BasicStrategySimulator.processPlayerWinnings(player, dealer); if (player.getTotalHandWinnings() == winnings) { System.Diagnostics.Debug.WriteLine(name + ": PASS"); } else { System.Diagnostics.Debug.WriteLine(name + ": FAIL"); } } }