internal void PlaceWager(BlackjackGamePlayer player, double amount)
        {
            if (!Players.Contains(player))
            {
                throw new InvalidOperationException("'player' is null or invalid");
            }

            if (player.IsLive)
            {
                throw new InvalidOperationException("Player is in live round");
            }

            if (RoundPlayersQueuedForNextRound.Any(a => a.Player.Id == player.Id))
            {
                throw new InvalidOperationException();
            }

            if (amount > player.Account.Balance)
            {
                throw new InvalidOperationException("Insufficient funds");
            }

            if (amount < MinWager || amount > MaxWager)
            {
                throw new InvalidOperationException("Player wager is out of range");
            }

            player.Account.Debit(amount);
            RoundPlayersQueuedForNextRound.Add(new BlackjackGameRoundPlayer(player, amount));
        }
Beispiel #2
0
        public void PlayerActionRequest(BlackjackGamePlayer player, string request)
        {
            var currentAction = Players.FirstOrDefault(a => a.HasAction);

            if (PlayerActionIsExpired)
            {
                player.Stand();
            }
            else
            {
                switch (request.ToLower())
                {
                case "hit": player.Hit(); break;

                case "doubledown": player.DoubleDown(); break;

                case "stand": player.Stand(); break;
                }
            }

            var nextAction = Players.FirstOrDefault(a => a.HasAction);

            if (nextAction == null)
            {
                SettlePlayers();
                AwaitingPlayerActionSince = null;
            }
            else if (nextAction.Id != currentAction.Id)
            {
                AwaitingPlayerActionSince = DateTime.UtcNow;
            }
        }
        public void HandleRequestToHit(BlackjackGamePlayer player)
        {
            if (RoundInProgress == null)
            {
                throw new InvalidOperationException("No round in play");
            }

            var roundplayer = RoundInProgress.GetRoundPlayer(player);

            if (roundplayer == null)
            {
                throw new ArgumentException("'player' is null or invalid");
            }

            if (!roundplayer.HasAction || roundplayer.Hand == null)
            {
                throw new InvalidOperationException("Out of turn");
            }

            if (roundplayer.Hand.IsBusted)
            {
                throw new InvalidOperationException("Cannot hit busted hand");
            }

            roundplayer.AddCardToHand(_shoe.DealCard());

            if (roundplayer.Hand.IsBusted)
            {
                moveToNextAction();
            }
        }
        public void HandleRequestToDoubleDown(BlackjackGamePlayer player, double amount)
        {
            if (RoundInProgress == null)
            {
                throw new InvalidOperationException("No round in play");
            }

            var roundplayer = RoundInProgress.GetRoundPlayer(player);

            if (roundplayer == null)
            {
                throw new ArgumentException("'player' is null or invalid");
            }

            if (!roundplayer.HasAction || roundplayer.Hand == null)
            {
                throw new InvalidOperationException("Out of turn");
            }

            if (roundplayer.Hand.Cards.Count() != 2)
            {
                throw new InvalidOperationException("Must have 2 cards to double");
            }

            if (amount > roundplayer.Wager)
            {
                throw new InvalidOperationException("Amounts exceeds current wager");
            }

            roundplayer.AddCardToHand(_shoe.DealCard());
            roundplayer.Wager += amount;
            roundplayer.Player.Account.Debit(amount);

            moveToNextAction();
        }
        internal void RequestToDoubleDown(BlackjackGamePlayer player, double amount)
        {
            if (amount > player?.Account?.Balance)
            {
                throw new InvalidOperationException("Insufficient funds");
            }

            Dealer.HandleRequestToDoubleDown(player, amount);
        }
        public BlackjackHandSettlement SettleHand(BlackjackGamePlayer player)
        {
            var roundplayer = RoundInProgress.GetRoundPlayer(player);

            if (roundplayer == null)
            {
                throw new ArgumentException("'player' is null or invalid");
            }

            return(settleHand(roundplayer, player));
        }
Beispiel #7
0
        public void PlayerWagerRequest(BlackjackGamePlayer player, double wager)
        {
            player.SetWager(wager);

            if (!IsRoundInProgress && Players.Count() == 1)
            {
                StartRound();
                return;
            }

            if (!AwaitingNextRoundSince.HasValue)
            {
                AwaitingNextRoundSince = DateTime.UtcNow;
            }
        }
        public void RemovePlayer(BlackjackGamePlayer player)
        {
            if (Players.Contains(player))
            {
                if (player.IsLive)
                {
                    throw new InvalidOperationException("Player is in live round");
                }

                Players.Remove(player);
                RoundPlayersQueuedForNextRound
                .Remove(RoundPlayersQueuedForNextRound
                        .FirstOrDefault(a => a.Player.Id == player.Id));
            }
        }
Beispiel #9
0
        public BlackjackGameRoundPlayer(BlackjackGamePlayer player, double wager)
        {
            if (player == null)
            {
                throw new ArgumentNullException("player", "Player is null");
            }

            if (wager <= 0)
            {
                throw new InvalidOperationException("Wager cannot be negative");
            }

            Cards  = new List <Card>();
            Player = player;
            Wager  = wager;
        }
        public void HandleRequestToStand(BlackjackGamePlayer player)
        {
            if (RoundInProgress == null)
            {
                throw new InvalidOperationException("No round in play");
            }

            var roundplayer = RoundInProgress.GetRoundPlayer(player);

            if (roundplayer == null)
            {
                throw new ArgumentException("'player' is null or invalid");
            }

            if (!roundplayer.HasAction || roundplayer.Hand == null)
            {
                throw new InvalidOperationException("Out of turn");
            }

            moveToNextAction();
        }
 internal bool GetPlayerHasAction(BlackjackGamePlayer player)
 {
     return(_roundInProgress?.GetRoundPlayer(player)?.HasAction ?? false);
 }
 internal double GetPlayerWager(BlackjackGamePlayer player)
 {
     return(_roundInProgress?.GetRoundPlayer(player)?.Wager
            ?? RoundPlayersQueuedForNextRound.SingleOrDefault(a => a.Player.Id == player.Id)?.Wager
            ?? 0);
 }
 internal BlackjackHand GetPlayerHand(BlackjackGamePlayer player)
 {
     return(_roundInProgress?.GetRoundPlayer(player)?.Hand);
 }
 internal bool GetPlayerIsLive(BlackjackGamePlayer player)
 {
     return(_roundInProgress?.GetRoundPlayer(player) != null);
 }
 internal void RequestToStand(BlackjackGamePlayer player)
 {
     Dealer.HandleRequestToStand(player);
 }
 public BlackjackGameRoundPlayer GetRoundPlayer(BlackjackGamePlayer player)
 {
     return(RoundPlayers.SingleOrDefault(a => a.Player.Id == player.Id));
 }
 public BlackjackHandSettlement SettlePlayerHand(BlackjackGamePlayer player)
 {
     return(Dealer.SettleHand(player));
 }
        private BlackjackHandSettlement settleHand(BlackjackGameRoundPlayer roundplayer, BlackjackGamePlayer realPlayer)
        {
            if (RoundInProgress.RoundPlayers.Any(a => a.HasAction))
            {
                if (!roundplayer.Hand.IsBusted)
                {
                    throw new InvalidOperationException("Non-busted hands cannot settle until round completes");
                }
            }

            var settlement = new BlackjackHandSettlement(roundplayer, RoundInProgress.DealerHand);

            if (settlement.WagerOutcome == WagerOutcome.Draw)
            {
                roundplayer.Player.Account.Credit(settlement.WagerAmount);
                realPlayer.Account.Credit(settlement.WagerAmount);
            }
            else if (settlement.WagerOutcome == WagerOutcome.Win)
            {
                roundplayer.Player.Account.Credit(settlement.WagerAmount * 2);
                realPlayer.Account.Credit(settlement.WagerAmount * 2);
            }



            RoundInProgress.SettleRoundPlayer(roundplayer, settlement);

            return(settlement);
        }