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)); }
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)); }
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)); } }
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); }