Exemple #1
0
        public CasinoPlayerBotPlugin(IConnectionManager connMgr, JObject config)
        {
            ConnectionManager = connMgr;
            Config            = new PlayerConfig(config);
            Dispatcher        = new EventDispatcher();
            State             = new BlackjackState();
            Randomizer        = new Random();
            CardCounter       = TabularCardCounter.Zen.Value;
            AssistPlayers     = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            StrategyDebuggers = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            ConnectionManager.ChannelMessage += HandleChannelMessage;
            ConnectionManager.QueryMessage   += HandleQueryMessage;
            ConnectionManager.QueryNotice    += HandleQueryNotice;

            ConnectionManager.CommandManager.RegisterQueryMessageCommandHandler(
                new Command(
                    CommandUtil.MakeNames("casinoassist", "nocasinoassist"),
                    CommandUtil.NoOptions,
                    CommandUtil.NoArguments
                    ),
                HandleCasinoAssistCommand
                );
            ConnectionManager.CommandManager.RegisterQueryMessageCommandHandler(
                new Command(
                    CommandUtil.MakeNames("stratdebug", "nostratdebug"),
                    CommandUtil.NoOptions,
                    CommandUtil.NoArguments
                    ),
                HandleStratDebugCommand
                );
        }
Exemple #2
0
        public CourseOfAction?ApplyStrategy(BlackjackState gameState, int handIndex)
        {
            Debug.Assert(handIndex >= 0 && handIndex < gameState.MyHands.Count);
            Hand hand = gameState.MyHands[handIndex];

            Debug.Assert(hand != null);

            CardValue dealersUpcardValue = gameState.DealersUpcard.Value;

            if (dealersUpcardValue > CardValue.Ten)
            {
                dealersUpcardValue = CardValue.Ten;
            }

            StrategyOutcome outcome;

            if (hand.Cards.BlackjackValues().Contains(BlackjackTargetValue))
            {
                // blackjack!
                outcome = StrategyOutcome.Stand;
            }
            else if (hand.Cards.Count == 2 && hand.Cards.All(c => c.Value == hand.Cards.First().Value))
            {
                // pair

                CardValue singleCardValue = hand.Cards.First().Value;
                if (singleCardValue > CardValue.Ten)
                {
                    singleCardValue = CardValue.Ten;
                }
                outcome = Pairs[singleCardValue][dealersUpcardValue];
            }
            else if (hand.Cards.Count == 2 && hand.Cards.Any(c => c.Value == CardValue.Ace))
            {
                // one is an ace

                // the other mustn't be an ace; that's handled above
                Debug.Assert(hand.Cards.Any(c => c.Value != CardValue.Ace));

                CardValue nonAceValue = hand.Cards.First(c => c.Value != CardValue.Ace).Value;
                if (nonAceValue > CardValue.Ten)
                {
                    nonAceValue = CardValue.Ten;
                }
                outcome = SoftTotals[nonAceValue][dealersUpcardValue];
            }
            else
            {
                List <int> nonBustValues = hand.Cards.BlackjackValues()
                                           .Where(v => v <= BlackjackTargetValue)
                                           .ToList();
                if (nonBustValues.Count == 0)
                {
                    return(null);
                }

                int maxHandValueNotBust = nonBustValues.Max();
                Debug.Assert(maxHandValueNotBust >= 5 && maxHandValueNotBust <= 20);
                outcome = HardTotals[maxHandValueNotBust][dealersUpcardValue];
            }

            switch (outcome)
            {
            case StrategyOutcome.Stand:
                return(CourseOfAction.Stand);

            case StrategyOutcome.Hit:
                return(CourseOfAction.Hit);

            case StrategyOutcome.DoubleOrHit:
                return(gameState.CanDoubleDownOnHand(handIndex)
                        ? CourseOfAction.DoubleDown
                        : CourseOfAction.Hit);

            case StrategyOutcome.DoubleOrStand:
                return(gameState.CanDoubleDownOnHand(handIndex)
                        ? CourseOfAction.DoubleDown
                        : CourseOfAction.Stand);

            case StrategyOutcome.SplitOrHit:
                return(gameState.CanSplitHand(handIndex)
                        ? CourseOfAction.Split
                        : CourseOfAction.Hit);

            case StrategyOutcome.SplitOrStand:
                return(gameState.CanSplitHand(handIndex)
                        ? CourseOfAction.Split
                        : CourseOfAction.Stand);

            case StrategyOutcome.SurrenderOrHit:
                return(gameState.CanSurrender
                        ? CourseOfAction.Surrender
                        : CourseOfAction.Hit);

            default:
                Debug.Fail("unhandled strategy outcome");
                return(null);
            }
        }