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