Example #1
0
        private async Task <Player> DoScoreHand()
        {
            int score = 0;

            await LogLine(_nondealer.PlayerName, LogType.ScoreHand, $"{Card.CardsToString(_nondealer.Hand)} Shared: {_sharedCard}");

            score = CardScoring.ScoreHand(_nondealer.Hand, _sharedCard, HandType.Regular);
            _nondealer.HandCount++;
            if (await AddScore(_nondealer, score, ScoreType.Hand))
            {
                return(_nondealer);                                                    // has side effects...
            }
            await LogLine(_dealer.PlayerName, LogType.ScoreHand, $"{Card.CardsToString(_dealer.Hand)} Shared: {_sharedCard}");

            score = CardScoring.ScoreHand(_dealer.Hand, _sharedCard, HandType.Regular);
            _dealer.HandCount++;
            if (await AddScore(_dealer, score, ScoreType.Hand))
            {
                return(_dealer);                                                 // has side effects...
            }
            await LogLine(_dealer.PlayerName, LogType.ScoreCrib, $"{Card.CardsToString(_dealer.Crib)} Shared: {_sharedCard}");

            score = CardScoring.ScoreHand(_dealer.Crib, _sharedCard, HandType.Crib);
            _dealer.CribCount++;
            if (await AddScore(_dealer, score, ScoreType.Crib))
            {
                return(_dealer);                                                 // has side effects...
            }
            return(null);
        }
Example #2
0
        public override List <Card> SelectCribCards(List <Card> hand, bool myCrib)
        {
            Combinations <Card> combinations = new Combinations <Card>(hand, 4);
            List <Card>         maxCrib      = null;
            double maxScore = -1000.0;

            foreach (List <Card> cards in combinations)
            {
                double      score = (double)CardScoring.ScoreHand(cards, null, HandType.Regular);
                List <Card> crib  = GetCrib(hand, cards);
                if (UseDropTable)
                {
                    double expectedValue = 0.0;
                    if (myCrib)
                    {
                        expectedValue = CribbageStats.dropTableToMyCrib[crib[0].Rank - 1, crib[1].Rank - 1];
                        score        += expectedValue;
                    }
                    else
                    {
                        expectedValue = CribbageStats.dropTableToYouCrib[crib[0].Rank - 1, crib[1].Rank - 1];
                        score        -= expectedValue;
                    }
                }
                if (score > maxScore)
                {
                    maxScore = score;
                    maxCrib  = crib;
                }
            }

            return(maxCrib);
        }
Example #3
0
        public override Task <List <Card> > SelectCribCards(List <Card> hand, bool myCrib)
        {
            var         combinations = new Combinations <Card>(hand, 4);
            List <Card> maxCrib      = null;
            var         maxScore     = -1000.0;

            foreach (List <Card> cards in combinations)
            {
                double score = CardScoring.ScoreHand(cards, null, HandType.Hand, out var scoreList);
                var    crib  = GetCrib(hand, cards);
                if (UseDropTable)
                {
                    var expectedValue = 0.0;
                    if (myCrib)
                    {
                        expectedValue = CribbageStats.DropTableToMyCrib[crib[0].Rank - 1, crib[1].Rank - 1];
                        score        += expectedValue;
                    }
                    else
                    {
                        expectedValue = CribbageStats.DropTableToYouCrib[crib[0].Rank - 1, crib[1].Rank - 1];
                        score        -= expectedValue;
                    }
                }

                if (score > maxScore)
                {
                    maxScore = score;
                    maxCrib  = crib;
                }
            }

            return(Task.FromResult(maxCrib));
        }
        public ActionResult <ScoreResponse> ScoreHand(string handCSV, string sharedCardName, bool isCrib)
        {
            (bool success, List <Card> hand, string badCard) = ParseCards(handCSV);
            if (!success)
            {
                return(NotFound($"Bad Card in hand: {badCard}"));
            }

            if (!Enum.TryParse <CardName>(sharedCardName, true, out CardName sharedCard))
            {
                return(NotFound($"Invalid Shared Card Name: {sharedCardName}"));
            }

            int score = CardScoring.ScoreHand(hand, Card.CardNameToCard(sharedCard), isCrib ? HandType.Crib : HandType.Hand, out List <Score> scoreList);

            return(new ScoreResponse(score, scoreList));
        }