public void HandOver(HandInfo info) { if (printedFinishedHand) return; decimal won = 0, bet = 0; for (int i = 0; i < info.PlayerHands.Count(); i++) { var hand = info.PlayerHands.ElementAt(i); if (hand.Player != this) continue; won += hand.Won; bet += hand.Bet; } var profit = won - bet; bankroll += profit; PrintHand(info); //Console.WriteLine("You won ${0} ({1}${2} profit)", won, profit < 0 ? "-" : "", Math.Abs(profit)); if (profit > 0) Console.WriteLine("You Won!"); else if (profit < 0) Console.WriteLine("You Lost."); else Console.WriteLine("You Pushed."); printedFinishedHand = true; UpdateCount(info); }
public ActionTypes GetAction(HandInfo info) { var dealer = info.DealerHand.Cards.ElementAt(0).Rank; var hand = info.PlayerHands.ElementAt(info.HandToPlay); var rank1 = hand.Cards.ElementAt(0).Rank; if (hand.Cards.Count() == 2 && rank1 == hand.Cards.ElementAt(1).Rank) { return(Table[(int)rank1, (int)dealer]); } var value = hand.Value; var soft = hand.Soft; if (value >= 21) { return(ActionTypes.Stand); } if (soft) { return(Table[value - 3, (int)dealer]); } //if (value > 17) // return ActionTypes.Stand; return(Table[value + 14, (int)dealer]); }
public bool DoubleDown(HandInfo info) { //PrintHand(info); //return YesNoQuery(string.Format("Double Down for {0} more?", info.PlayerHands.ElementAt(info.HandToPlay).Bet)); if (nextAction == "") MultiQuery(info); if (nextAction == "d") { nextAction = ""; return true; } return false; }
public bool BuyInsurance(HandInfo info) { PrintCount(info); PrintHand(info); return YesNoQuery("Buy Insurance?"); //if (nextAction == "") // MultiQuery(info); //if (nextAction == "temp") //{ // nextAction = ""; // return true; //} //return false; }
private static void LogError(HandInfo info) { using (TextWriter log = new StreamWriter("error.txt")) { log.WriteLine("Hand:"); var dealer = info.DealerHand; log.WriteLine(); log.WriteLine(" Dealer ({0})", dealer.Value); log.WriteLine(" {0}", dealer.ToString()); log.WriteLine(); List <string> handStr = new List <string>(); foreach (var h in info.PlayerHands) { handStr.Add(h.ToString()); } StringBuilder bets = new StringBuilder(), player = new StringBuilder(), playerHand = new StringBuilder(); int temp = 0; foreach (var h in info.PlayerHands) { if (temp == info.HandToPlay) { player.Append("Player".PadRight(handStr[temp].Length + 2, ' ')); } else { player.Append("".PadRight(handStr[temp].Length + 2, ' ')); } playerHand.Append(string.Format("({0})", h.Value).PadLeft(4).PadRight(handStr[temp].Length + 2, ' ')); bets.Append(string.Format("${0} BET", h.Bet).PadRight(handStr[temp].Length + 2, ' ')); temp++; } log.WriteLine(" " + bets.ToString()); log.WriteLine(); log.Write(" "); foreach (var str in handStr) { log.Write(str + " "); } log.WriteLine(); log.WriteLine(" " + player.ToString()); log.WriteLine(" " + playerHand.ToString()); log.WriteLine(); } }
private void PrintHand(HandInfo info) { Console.Clear(); var dealer = info.DealerHand; Console.WriteLine("Current Bankroll: {0}${1}", bankroll < 0 ? "-" : "", Math.Abs(bankroll)); Console.WriteLine(); Console.WriteLine(" Dealer ({0})", dealer.Value); Console.WriteLine(" {0}", dealer.ToString()); Console.WriteLine(); List<string> handStr = new List<string>(); foreach (var h in info.PlayerHands) handStr.Add(h.ToString()); StringBuilder bets = new StringBuilder(), player = new StringBuilder(), playerHand = new StringBuilder(); int temp = 0; foreach (var h in info.PlayerHands) { if (temp == info.HandToPlay) player.Append("Player".PadRight(handStr[temp].Length + 2, ' ')); else player.Append("".PadRight(handStr[temp].Length + 2, ' ')); playerHand.Append(string.Format("({0})", h.Value).PadLeft(4).PadRight(handStr[temp].Length + 2, ' ')); bets.Append(string.Format("${0} BET", h.Bet).PadRight(handStr[temp].Length + 2, ' ')); temp++; } Console.WriteLine(" " + bets.ToString()); Console.WriteLine(); Console.Write(" "); foreach (var str in handStr) Console.Write(str + " "); Console.WriteLine(); Console.WriteLine(" " + player.ToString()); Console.WriteLine(" " + playerHand.ToString()); Console.WriteLine(); }
private void PrintCount(HandInfo info) { int[] temp = new int[10]; counts.CopyTo(temp, 0); foreach (var hand in info.PlayerHands) foreach (var card in hand.Cards) temp[(int)card.Rank]++; foreach (var card in info.DealerHand.Cards) temp[(int)card.Rank]++; PrintCount(temp); }
private void MultiQuery(HandInfo info) { PrintHand(info); Console.WriteLine(); PrintCount(info); Console.WriteLine(); bool canSurrender = Game.CanSurrender(info.PlayerHands.ElementAt(info.HandToPlay)); bool canSplit = Game.CanSplit(info.PlayerHands.ElementAt(info.HandToPlay)); bool canDoubleDown = Game.CanDoubleDown(info.PlayerHands.ElementAt(info.HandToPlay)); while (nextAction != "h" && nextAction != "s" && (nextAction != "r" || !canSurrender) && (nextAction != "p" || !canSplit) && (nextAction != "d" || !canDoubleDown)) { Console.Write("[h=hit, s=stand"); if(canSurrender) Console.Write(", r=surrender"); if(canSplit) Console.Write(", p=split"); if(canDoubleDown) Console.Write(", d=double down"); Console.WriteLine("]"); Console.Write("Action? "); nextAction = Console.ReadLine().ToLower(); } }
public bool Surrender(HandInfo info) { //PrintHand(info); //return YesNoQuery("Surrender?"); if (nextAction == "") MultiQuery(info); if (nextAction == "r") { nextAction = ""; return true; } return false; }
public bool Split(HandInfo info) { if (nextAction == "") MultiQuery(info); if (nextAction == "p") { nextAction = ""; return true; } return false; }
public bool Hit(HandInfo info) { //PrintHand(info); //return YesNoQuery("Hit?"); if (nextAction == "") MultiQuery(info); if (nextAction == "h") { nextAction = ""; return true; } if (nextAction == "s") { nextAction = ""; return false; } return false; }
public void Play(IEnumerable<IBlackjackPlayer> players) { _shoe.Shuffle(SHUFFLES_PER_SHOE); bool[] done = new bool[players.Count()]; while (done.Count(d => d == false) > 0) { if (_shoe.CardsDealt >= Settings.MinCardsDealtBeforeReshuffle) _shoe.Shuffle(SHUFFLES_PER_SHOE); //get bets List<PlayerHand> hands = new List<PlayerHand>(); for (int i = 0; i < players.Count(); i++) { if (done[i]) continue; var player = players.ElementAt(i); bool play = player.PlayAnotherHand(); if (!play) { done[i] = true; continue; } var bet = player.GetBet(Settings.MinimumBet, Settings.MaximumBet); if (bet < Settings.MinimumBet) bet = Settings.MinimumBet; else if (bet > Settings.MaximumBet) bet = Settings.MaximumBet; hands.Add(new PlayerHand() { Player = player, Bet = bet }); } //deal cards foreach (var hand in hands) { hand.AddCard(_shoe.NextCard()); hand.AddCard(_shoe.NextCard()); } DealerHand dealerHand = new DealerHand(); dealerHand.HiddenCard = _shoe.NextCard(); dealerHand.AddCard(_shoe.NextCard()); HandInfo info = new HandInfo() { DealerHand = dealerHand, PlayerHands = hands }; #region offer insurance if (Settings.InsuranceOffered && dealerHand.Cards.ElementAt(0).Rank == Ranks.Ace) { for (int i = 0; i < hands.Count; i++) { if (hands[i].Finished) continue; info.HandToPlay = i; if (hands[i].Player.BuyInsurance(info)) { hands[i].Insured = true; hands[i].Won -= hands[i].Bet * Settings.InsuranceCost; } } //payoff insurance --> everyone else loses if (dealerHand.HiddenCard.HighValue == 10) { dealerHand.FlipHiddenCard(); foreach (var hand in hands) { if (hand.Insured)//payoff insurance bets hand.Won += hand.Bet * Settings.InsuranceCost * Settings.InsurancePayoff; if (hand.Value == 21)//blackjack pushes hand.Won += hand.Bet; hand.Finished = true;//game's over } } } #endregion //payoff blackjacks --> remove from hand foreach (var hand in hands) { if (hand.Finished) continue; if (hand.Value == 21) { hand.Won += hand.Bet * Settings.BlackjackPayoff; hand.Finished = true; } } //each player acts for (int i = 0; i < hands.Count; i++) { if (hands[i].Finished) continue; info.HandToPlay = i; var hand = hands[i]; //accept surrenders if (CanSurrender(hand)) { if (hand.Player.Surrender(info)) { hands[i].Won = Settings.SurrenderPayoff * hands[i].Bet; hands[i].Finished = true; continue; } } //split loop if (CanSplit(hand) && hand.Player.Split(info)) { var secondHand = hand.Split(); hand.AddCard(_shoe.NextCard()); secondHand.AddCard(_shoe.NextCard()); hands.Insert(i+1, secondHand); i--; continue; } //double down if (CanDoubleDown(hand) && hand.Player.DoubleDown(info)) { hand.Bet *= 2; hand.AddCard(_shoe.NextCard()); if (hand.Value > 21) hand.Finished = true; continue; } //hit/stand loop while (CanHit(hand) && hand.Player.Hit(info)) { hand.AddCard(_shoe.NextCard()); if (hand.Value > 21) hand.Finished = true; } } //dealer acts (only if everyone hasn't busted or hit BJ) if (hands.Count(h => !h.Finished) > 0) { dealerHand.FlipHiddenCard(); while (DealerMustHit(dealerHand)) dealerHand.AddCard(_shoe.NextCard()); //if the dealer busted, everyone wins if (dealerHand.Value > 21) { foreach (var hand in hands) if (!hand.Finished) hand.Won += hand.Bet * 2; } else { //if the dealer didn't bust, then players win if they're closer to 21 foreach (var hand in hands) if (!hand.Finished) { if (hand.Value > dealerHand.Value) hand.Won += hand.Bet * 2; else if (hand.Value == dealerHand.Value) hand.Won += hand.Bet; } } } foreach (var hand in hands) hand.Player.Profit += hand.Won - hand.Bet; for (int i = 0; i < done.Length; i++) if (!done[i]) players.ElementAt(i).HandOver(info); } }
public static ActionTable FromStrategy(IBlackjackPlayer strategy) { var table = new ActionTypes[35, 10]; List<PlayerHand> hands = new List<PlayerHand>(); hands.Add(null); for (int dealer = 0; dealer < 10; dealer++) { DealerHand dealerHand = new DealerHand(); dealerHand.AddCard(new Card((Ranks)dealer)); for (int p = 0; p < 35; p++) { PlayerHand playerHand = new PlayerHand() { Player = strategy, Bet = 1 }; if (p < 10) { playerHand.AddCard(new Card((Ranks)p)); playerHand.AddCard(new Card((Ranks)p)); } else if (p < 19) { playerHand.AddCard(new Card(Ranks.Ace)); playerHand.AddCard(new Card((Ranks)(p - 10))); } else if (p < 26) { playerHand.AddCard(new Card(Ranks.Two)); playerHand.AddCard(new Card((Ranks)(p - 18))); } else { playerHand.AddCard(new Card(Ranks.Ten)); playerHand.AddCard(new Card((Ranks)(p - 26))); } hands[0] = playerHand; HandInfo info = new HandInfo() { DealerHand = dealerHand, HandToPlay = 0, PlayerHands = hands }; var hs = strategy.Hit(info) ? ActionTypes.Hit : ActionTypes.Stand; var type = hs; if (p < 10 && strategy.Split(info)) type = hs == ActionTypes.Hit ? ActionTypes.SplitOrHit : ActionTypes.SplitOrStand; else if (strategy.DoubleDown(info)) type = hs == ActionTypes.Hit ? ActionTypes.DoubleDownOrHit : ActionTypes.DoubleDownOrStand; table[p, dealer] = type; } } return new ActionTable(table); }
public ActionTypes GetAction(HandInfo info) { var dealer = info.DealerHand.Cards.ElementAt(0).Rank; var hand = info.PlayerHands.ElementAt(info.HandToPlay); var rank1 = hand.Cards.ElementAt(0).Rank; if (hand.Cards.Count() == 2 && rank1 == hand.Cards.ElementAt(1).Rank) return Table[(int)rank1,(int)dealer]; var value = hand.Value; var soft = hand.Soft; if (value >= 21) return ActionTypes.Stand; if (soft) return Table[value - 3, (int)dealer]; //if (value > 17) // return ActionTypes.Stand; return Table[value + 14, (int)dealer]; }
public static ActionTable FromStrategy(IBlackjackPlayer strategy) { var table = new ActionTypes[35, 10]; List <PlayerHand> hands = new List <PlayerHand>(); hands.Add(null); for (int dealer = 0; dealer < 10; dealer++) { DealerHand dealerHand = new DealerHand(); dealerHand.AddCard(new Card((Ranks)dealer)); for (int p = 0; p < 35; p++) { PlayerHand playerHand = new PlayerHand() { Player = strategy, Bet = 1 }; if (p < 10) { playerHand.AddCard(new Card((Ranks)p)); playerHand.AddCard(new Card((Ranks)p)); } else if (p < 19) { playerHand.AddCard(new Card(Ranks.Ace)); playerHand.AddCard(new Card((Ranks)(p - 10))); } else if (p < 26) { playerHand.AddCard(new Card(Ranks.Two)); playerHand.AddCard(new Card((Ranks)(p - 18))); } else { playerHand.AddCard(new Card(Ranks.Ten)); playerHand.AddCard(new Card((Ranks)(p - 26))); } hands[0] = playerHand; HandInfo info = new HandInfo() { DealerHand = dealerHand, HandToPlay = 0, PlayerHands = hands }; var hs = strategy.Hit(info) ? ActionTypes.Hit : ActionTypes.Stand; var type = hs; if (p < 10 && strategy.Split(info)) { type = hs == ActionTypes.Hit ? ActionTypes.SplitOrHit : ActionTypes.SplitOrStand; } else if (strategy.DoubleDown(info)) { type = hs == ActionTypes.Hit ? ActionTypes.DoubleDownOrHit : ActionTypes.DoubleDownOrStand; } table[p, dealer] = type; } } return(new ActionTable(table)); }
private void UpdateCount(HandInfo info) { foreach (var hand in info.PlayerHands) foreach (var card in hand.Cards) counts[(int)card.Rank]++; foreach (var card in info.DealerHand.Cards) counts[(int)card.Rank]++; }
public void Play(IEnumerable <IBlackjackPlayer> players) { _shoe.Shuffle(SHUFFLES_PER_SHOE); bool[] done = new bool[players.Count()]; while (done.Count(d => d == false) > 0) { if (_shoe.CardsDealt >= Settings.MinCardsDealtBeforeReshuffle) { _shoe.Shuffle(SHUFFLES_PER_SHOE); } //get bets List <PlayerHand> hands = new List <PlayerHand>(); for (int i = 0; i < players.Count(); i++) { if (done[i]) { continue; } var player = players.ElementAt(i); bool play = player.PlayAnotherHand(); if (!play) { done[i] = true; continue; } var bet = player.GetBet(Settings.MinimumBet, Settings.MaximumBet); if (bet < Settings.MinimumBet) { bet = Settings.MinimumBet; } else if (bet > Settings.MaximumBet) { bet = Settings.MaximumBet; } hands.Add(new PlayerHand() { Player = player, Bet = bet }); } //deal cards foreach (var hand in hands) { hand.AddCard(_shoe.NextCard()); hand.AddCard(_shoe.NextCard()); } DealerHand dealerHand = new DealerHand(); dealerHand.HiddenCard = _shoe.NextCard(); dealerHand.AddCard(_shoe.NextCard()); HandInfo info = new HandInfo() { DealerHand = dealerHand, PlayerHands = hands }; #region offer insurance if (Settings.InsuranceOffered && dealerHand.Cards.ElementAt(0).Rank == Ranks.Ace) { for (int i = 0; i < hands.Count; i++) { if (hands[i].Finished) { continue; } info.HandToPlay = i; if (hands[i].Player.BuyInsurance(info)) { hands[i].Insured = true; hands[i].Won -= hands[i].Bet * Settings.InsuranceCost; } } //payoff insurance --> everyone else loses if (dealerHand.HiddenCard.HighValue == 10) { dealerHand.FlipHiddenCard(); foreach (var hand in hands) { if (hand.Insured)//payoff insurance bets { hand.Won += hand.Bet * Settings.InsuranceCost * Settings.InsurancePayoff; } if (hand.Value == 21)//blackjack pushes { hand.Won += hand.Bet; } hand.Finished = true;//game's over } } } #endregion //payoff blackjacks --> remove from hand foreach (var hand in hands) { if (hand.Finished) { continue; } if (hand.Value == 21) { hand.Won += hand.Bet * Settings.BlackjackPayoff; hand.Finished = true; } } //each player acts for (int i = 0; i < hands.Count; i++) { if (hands[i].Finished) { continue; } info.HandToPlay = i; var hand = hands[i]; //accept surrenders if (CanSurrender(hand)) { if (hand.Player.Surrender(info)) { hands[i].Won = Settings.SurrenderPayoff * hands[i].Bet; hands[i].Finished = true; continue; } } //split loop if (CanSplit(hand) && hand.Player.Split(info)) { var secondHand = hand.Split(); hand.AddCard(_shoe.NextCard()); secondHand.AddCard(_shoe.NextCard()); hands.Insert(i + 1, secondHand); i--; continue; } //double down if (CanDoubleDown(hand) && hand.Player.DoubleDown(info)) { hand.Bet *= 2; hand.AddCard(_shoe.NextCard()); if (hand.Value > 21) { hand.Finished = true; } continue; } //hit/stand loop while (CanHit(hand) && hand.Player.Hit(info)) { hand.AddCard(_shoe.NextCard()); if (hand.Value > 21) { hand.Finished = true; } } } //dealer acts (only if everyone hasn't busted or hit BJ) if (hands.Count(h => !h.Finished) > 0) { dealerHand.FlipHiddenCard(); while (DealerMustHit(dealerHand)) { dealerHand.AddCard(_shoe.NextCard()); } //if the dealer busted, everyone wins if (dealerHand.Value > 21) { foreach (var hand in hands) { if (!hand.Finished) { hand.Won += hand.Bet * 2; } } } else { //if the dealer didn't bust, then players win if they're closer to 21 foreach (var hand in hands) { if (!hand.Finished) { if (hand.Value > dealerHand.Value) { hand.Won += hand.Bet * 2; } else if (hand.Value == dealerHand.Value) { hand.Won += hand.Bet; } } } } } foreach (var hand in hands) { hand.Player.Profit += hand.Won - hand.Bet; } for (int i = 0; i < done.Length; i++) { if (!done[i]) { players.ElementAt(i).HandOver(info); } } } }
private static void LogError(HandInfo info) { using (TextWriter log = new StreamWriter("error.txt")) { log.WriteLine("Hand:"); var dealer = info.DealerHand; log.WriteLine(); log.WriteLine(" Dealer ({0})", dealer.Value); log.WriteLine(" {0}", dealer.ToString()); log.WriteLine(); List<string> handStr = new List<string>(); foreach (var h in info.PlayerHands) handStr.Add(h.ToString()); StringBuilder bets = new StringBuilder(), player = new StringBuilder(), playerHand = new StringBuilder(); int temp = 0; foreach (var h in info.PlayerHands) { if (temp == info.HandToPlay) player.Append("Player".PadRight(handStr[temp].Length + 2, ' ')); else player.Append("".PadRight(handStr[temp].Length + 2, ' ')); playerHand.Append(string.Format("({0})", h.Value).PadLeft(4).PadRight(handStr[temp].Length + 2, ' ')); bets.Append(string.Format("${0} BET", h.Bet).PadRight(handStr[temp].Length + 2, ' ')); temp++; } log.WriteLine(" " + bets.ToString()); log.WriteLine(); log.Write(" "); foreach (var str in handStr) log.Write(str + " "); log.WriteLine(); log.WriteLine(" " + player.ToString()); log.WriteLine(" " + playerHand.ToString()); log.WriteLine(); } }