using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace BlackjackClasses { public enum RoundStatus { UnfinishedRound, DealerWin, PlayerWin, Draw } public class Round { private RoundStatus _roundStatus = RoundStatus.UnfinishedRound; public RoundStatus status { get { return isGameOver(); } } private readonly List _deck = new List(); private readonly Player _house; private readonly Player _player; private const int NumOfDecks = 1; public List Deck { get { return _deck; } } public int PlayerScore { get { return _player.Score; } } public int HouseScore { get { return _house.Score; } } public Round(Player paraHouse, Player paraPlayer) { _house = paraHouse; _player = paraPlayer; for( int i = 0; i < NumOfDecks; i++) _deck = PopulateDeckWith52Cards(); } public Round() { _house = new Player(); _player = new Player(); } public void firstRound() { //deal to cards at random to each player. _house.Hand.Add(dealCard()); _house.Hand.Add(dealCard()); _player.Hand.Add(dealCard()); _player.Hand.Add(dealCard()); } public void CheatRound(List paramHouseCards, List paramPlayerCards) { //pick card straight from deck if (paramHouseCards.Count() != 0) { _house.Hand.Add(pickCard(paramHouseCards[0])); _house.Hand.Add(pickCard(paramHouseCards[1])); } else //no cards selected for the house {//deal to cards at random instead _house.Hand.Add(dealCard()); _house.Hand.Add(dealCard()); } //choose which cards are dealt to this player if (paramPlayerCards.Count() != 0) { _player.Hand.Add(pickCard(paramPlayerCards[0])); _player.Hand.Add(pickCard(paramPlayerCards[1])); } else //no cards selected for the player {//deal to cards at random instead _player.Hand.Add(dealCard()); _player.Hand.Add(dealCard()); } //check for winner } public void hit() { _player.Hand.Add(dealCard()); if (_house.Score < 17) _house.Hand.Add(dealCard()); } public void stay() { while (isGameOver().Equals(RoundStatus.UnfinishedRound)) { if (_house.Score < 17) _house.Hand.Add(dealCard()); else { determineWinner(); } } } private void determineWinner() { int i = _house.Score.CompareTo(_player.Score); if (i == 0) _roundStatus = RoundStatus.Draw; if (i == -1) _roundStatus = RoundStatus.PlayerWin; if (i == 1) _roundStatus = RoundStatus.DealerWin; } public void cheatHitPlayer(Card paraCard) { _player.Hand.Add(paraCard); } public void cheatHitDealer(Card paraCard) { _house.Hand.Add(paraCard); } public Card dealCard() { var randy = new Random(); Thread.Sleep(20); var ranNum = randy.Next((NumOfDecks * _deck.Count)); var card = _deck[ranNum]; if (_deck != null) _deck.RemoveAt(ranNum); return card; } /// /// Selects a Card to remove from the Deck. If the Card is not in the deck and Exception is thrown /// /// Card to remove. Must be in the deck, or an Exception is thrown /// The selected Card public Card pickCard(Card c) { var cardsRemoved = _deck.RemoveAll(theCard => theCard.CompareTo(c) == 0); if (cardsRemoved == 1) return c; throw new Exception("Card not Removed, was not in the deck"); } public static List PopulateDeckWith52Cards() { var deck = new List(); foreach (Card.CardSuits suit in Enum.GetValues(typeof(Card.CardSuits))) { foreach (Card.CardValues name in Enum.GetValues(typeof(Card.CardValues))) { var card = new Card(suit, name); deck.Add(card); } } return deck; } private RoundStatus isGameOver() { if (_player.Score == 21 && _house.Score == 21) { _roundStatus = RoundStatus.Draw; } else if (_player.Score == 21) { _roundStatus = RoundStatus.PlayerWin; } else if (_house.Score == 21) { _roundStatus = RoundStatus.DealerWin; } if (_player.isBust) { _roundStatus = RoundStatus.DealerWin; } if (_house.isBust) { _roundStatus = RoundStatus.PlayerWin; } return _roundStatus; } public override string ToString() { var sb = new StringBuilder(); sb.AppendLine("House Score: " + _house.CalculateScore()); foreach (Card c in _house.Hand.Cards) sb.AppendLine(c.ToString()); sb.AppendLine("Player Score: " + _player.CalculateScore()); foreach (Card c in _player.Hand.Cards) sb.AppendLine(c.ToString()); return sb.ToString(); } public void CheatHand(List cards, Game.Gamer player) { foreach (Card card in cards) { if (player.Equals(Game.Gamer.Player)) _player.Hand.Cards.Add(pickCard(card)); else { _house.Hand.Cards.Add(pickCard(card)); } } } } }