public static int RateCards(IEnumerable <Card> cards)
        {
            var evaluator = new HandEvaluator();
            var strength  = (int)evaluator.GetBestHand(cards).RankType;

            return(strength);
        }
        public static int RateCards(IEnumerable<Card> cards)
        {
            var evaluator = new HandEvaluator();
            var strength = (int)evaluator.GetBestHand(cards).RankType;

            return strength;
        }
Example #3
0
        public void GetRankTypeShouldWorkCorrectly(ICollection <Card> playerCards, HandRankType expectedHandRankType, ICollection <CardType> expectedBestHandCards)
        {
            IHandEvaluator handEvaluator = new HandEvaluator();
            var            bestHand      = handEvaluator.GetBestHand(playerCards.Shuffle().ToList());

            Assert.Equal(expectedHandRankType, bestHand.RankType);
            CollectionsAssert.SameElements(expectedBestHandCards, bestHand.Cards);
        }
        /// <summary>
        ///     Claculates current CardValuation type based on players cards and community cards
        /// </summary>
        /// <param name="firstCard">first cards</param>
        /// <param name="secondCard">second card</param>
        /// <param name="comunityCards">Comunity cards</param>
        /// <returns>the Card Valuation Type</returns>
        public static CardValuationType Flop(Card firstCard, Card secondCard, IEnumerable<Card> comunityCards)
        {
            var handEvaluator = new HandEvaluator();

            var cards = new List<Card>();
            cards.AddRange(comunityCards);

            var playerCards = new List<Card>();
            playerCards.Add(firstCard);
            playerCards.Add(secondCard);
            var percentageValuation = new PercentageValuation();
            var percentage = percentageValuation.CalculatePercentage(playerCards, cards);

            cards.Add(firstCard);
            cards.Add(secondCard);
            var bestHand = handEvaluator.GetBestHand(cards);

            if (bestHand.RankType >= Logic.HandRankType.FourOfAKind)
            {
                return CardValuationType.PlayItAllIn;
            }

            if (bestHand.RankType >= Logic.HandRankType.ThreeOfAKind)
            {
                return CardValuationType.Recommended;
            }

            if (percentage < 25)
            {
                return CardValuationType.Unplayable;
            }

            if (percentage < 45)
            {
                return CardValuationType.Risky;
            }

            if (percentage < 85)
            {
                return CardValuationType.Recommended;
            }

            return CardValuationType.StronglyRecommended;
        }
        /// <summary>
        ///     Claculates current CardValuation type based on players cards and community cards
        /// </summary>
        /// <param name="firstCard">first cards</param>
        /// <param name="secondCard">second card</param>
        /// <param name="comunityCards">Comunity cards</param>
        /// <returns>the Card Valuation Type</returns>
        public static CardValuationType River(Card firstCard, Card secondCard, IEnumerable<Card> comunityCards)
        {
            var handEvaluator = new HandEvaluator();

            var cards = new List<Card>();
            cards.AddRange(comunityCards);
            cards.Add(firstCard);
            cards.Add(secondCard);

            var bestHand = handEvaluator.GetBestHand(cards);
            if (bestHand.RankType <= Logic.HandRankType.Pair)
            {
                return CardValuationType.Unplayable;
            }

            if (bestHand.RankType <= Logic.HandRankType.TwoPairs)
            {
                return CardValuationType.Risky;
            }

            if (bestHand.RankType > Logic.HandRankType.TwoPairs && bestHand.RankType <= Logic.HandRankType.Straight)
            {
                return CardValuationType.Recommended;
            }

            if (bestHand.RankType > Logic.HandRankType.Flush)
            {
                return CardValuationType.StronglyRecommended;
            }

            return CardValuationType.StronglyRecommended;
        }
        /// <summary>
        ///     Calculates percesentage for the currant hand in the game;
        /// </summary>
        /// <param name="playerCards">The Turing player cards</param>
        /// <param name="cards">Community cards</param>
        /// <returns>Percentage for game development in Turing's favour</returns>
        public double CalculatePercentage(IEnumerable<Card> playerCards, IEnumerable<Card> cards)
        {
            var deck = new List<Card>();

            for (int i = 0; i <= 3; i++)
            {
                for (int j = 2; j <= 14; j++)
                {
                    deck.Add(new Card((CardSuit)i, (CardType)j));
                }
            }

            List<Card[]> pairsCombos = new List<Card[]>();

            for (int i = 0; i < deck.Count; i++)
            {
                for (int j = 0; j < deck.Count; j++)
                {
                    if (i != j)
                    {
                        pairsCombos.Add(new Card[2] { deck[i], deck[j] });
                    }
                }
            }

            HashSet<Card> board = new HashSet<Card>(cards);

            var handEvaluator = new HandEvaluator();

            var myPlayerCards = new HashSet<Card>();

            foreach (var card in playerCards)
            {
                myPlayerCards.Add(card);
            }

            foreach (var card in board)
            {
                myPlayerCards.Add(card);
            }

            var playerBestHand = handEvaluator.GetBestHand(myPlayerCards);

            long wins = 0, ties = 0, loses = 0, count = 0;

            for (var i = 0; i < 1; i++)
            {
                var otherHand = new HashSet<Card>();
                foreach (var pairsCombo in pairsCombos)
                {
                    foreach (var card in pairsCombo)
                    {
                        otherHand.Add(card);
                    }

                    foreach (var card in board)
                    {
                        otherHand.Add(card);
                    }

                    if (otherHand.Count < 5)
                    {
                        continue;
                    }

                    var otherBestHand = handEvaluator.GetBestHand(otherHand);
                    if (playerBestHand.RankType > otherBestHand.RankType)
                    {
                        wins++;
                    }
                    else if (playerBestHand.RankType == otherBestHand.RankType)
                    {
                        ties++;
                    }
                    else
                    {
                        loses++;
                    }

                    count++;
                    otherHand.Clear();
                }
            }

            var percent = (((double)wins) + (((double)ties) / 2.0)) / ((double)count) * 100.0;

            return percent;
        }
        public double CalculateOuts(IEnumerable<Card> playerCards, IEnumerable<Card> cards)
        {
            var deck = new List<Card>();

            for (int i = 0; i <= 3; i++)
            {
                for (int j = 2; j <= 14; j++)
                {
                    deck.Add(new Card((CardSuit)i, (CardType)j));
                }
            }

            List<Card[]> pairsCombos = new List<Card[]>();

            for (int i = 0; i < deck.Count; i++)
            {
                for (int j = 0; j < deck.Count; j++)
                {
                    if (i != j)
                    {
                        pairsCombos.Add(new Card[2] { deck[i], deck[j] });
                    }
                }
            }

            HashSet<Card> board = new HashSet<Card>(cards);

            var handEvaluator = new HandEvaluator();

            var myPlayerCards = new HashSet<Card>();

            foreach (var card in playerCards)
            {
                myPlayerCards.Add(card);
            }

            foreach (var card in board)
            {
                myPlayerCards.Add(card);
            }

            var handEvaluatorExtended = new HandEvaluatorExtension();
            var bestHandFromBoard = handEvaluatorExtended.GetBestHandForFlop(board);
            var playerBestHand = handEvaluator.GetBestHand(myPlayerCards);

            if (playerBestHand.RankType <= bestHandFromBoard.RankType &&
                (cards.ToList().Count() == 3))
            {
                return 21;
            }

            if (cards.Count() == 4 && cards.Any())
            {
                var bestHandFromBoardOnTurn = handEvaluatorExtended.GetBestHandForTurn(board);
                if (playerBestHand.RankType <= bestHandFromBoardOnTurn.RankType)
                {
                    return 21;
                }
            }

            long wins = 0, ties = 0, loses = 0, count = 0;

            // Iterate through all possible opponent hole cards
            // This is one because it is very slow otherwise.
            // I have tested it and there is not much of a difference
            for (var i = 0; i < 1; i++)
            {
                var otherHand = new HashSet<Card>();
                foreach (var pairsCombo in pairsCombos)
                {
                    foreach (var card in pairsCombo)
                    {
                        otherHand.Add(card);
                    }

                    foreach (var card in board)
                    {
                        otherHand.Add(card);
                    }

                    if (otherHand.Count < 5)
                    {
                        continue;
                    }

                    var otherBestHand = handEvaluator.GetBestHand(otherHand);
                    if (playerBestHand.RankType > otherBestHand.RankType)
                    {
                        wins++;
                    }
                    else if (playerBestHand.RankType == otherBestHand.RankType)
                    {
                        ties++;
                    }
                    else
                    {
                        loses++;
                    }

                    count++;
                    otherHand.Clear();
                }
            }

            var percent = (((double)wins) + ((double)ties) / 2.0) / ((double)count) * 100.0;
            return percent;
        }
Example #8
0
        public override async Task RunAsync()
        {
            this.Started = true;

            DiscordMessage msg = await this.Channel.EmbedAsync("Starting Hold'Em game... Keep an eye on DM!");

            foreach (HoldemParticipant participant in this.Participants)
            {
                participant.Card1 = this.deck.GetNextCard();
                participant.Card2 = this.deck.GetNextCard();
                try {
                    participant.DmHandle = await participant.DmHandle.ModifyAsync($"Your hand: {participant.Card1.ToUserFriendlyString()} {participant.Card2.ToUserFriendlyString()}");
                } catch {
                }
            }

            await Task.Delay(TimeSpan.FromSeconds(10));

            this.drawn.AddRange(this.deck.DrawCards(3));

            int bet = 5;

            for (int step = 0; step < 2; step++)
            {
                foreach (HoldemParticipant participant in this.ActiveParticipants)
                {
                    participant.Bet = 0;
                }

                while (this.ActiveParticipants.Any(p => p.Bet != bet))
                {
                    foreach (HoldemParticipant participant in this.ActiveParticipants)
                    {
                        await this.PrintGameAsync(msg, bet, participant);

                        if (await this.Interactivity.WaitForBoolReplyAsync(this.Channel.Id, participant.Id))
                        {
                            await this.Channel.SendMessageAsync($"Do you wish to raise the current bet? If yes, reply yes and then reply raise amount in new message, otherwise say no. Max: {participant.Balance - bet}");

                            if (await this.Interactivity.WaitForBoolReplyAsync(this.Channel.Id, participant.Id))
                            {
                                int            raise = 0;
                                MessageContext mctx  = await this.Interactivity.WaitForMessageAsync(
                                    m => m.Channel.Id == this.Channel.Id && m.Author.Id == participant.Id && int.TryParse(m.Content, out raise) && bet + raise <= participant.Balance
                                    );

                                if (mctx != null)
                                {
                                    bet += raise;
                                }
                            }
                            participant.Balance -= bet - participant.Bet;
                            participant.Bet      = bet;
                            this.Pot            += bet;
                        }
                        else
                        {
                            participant.Folded = true;
                        }
                    }
                }

                this.drawn.Add(this.deck.GetNextCard());
            }

            this.GameOver = true;
            await this.PrintGameAsync(msg, bet, showhands : true);

            foreach (HoldemParticipant p in this.ActiveParticipants)
            {
                p.HandRank = _evaluator.GetBestHand(new List <Card>(this.drawn)
                {
                    p.Card1, p.Card2
                }).RankType;
            }


            var winner = this.Participants.OrderByDescending(p => p.HandRank).FirstOrDefault();

            if (winner != null)
            {
                winner.Balance += this.Pot;
            }
            this.Winner = winner?.User;
        }
        public static CardValuationType Turn(Card firstCard, Card secondCard, IEnumerable<Card> comunityCards)
        {
            var handEvaluator = new HandEvaluator();

            var cards = new List<Card>();
            cards.AddRange(comunityCards);

            var playerCards = new List<Card>();
            playerCards.Add(firstCard);
            playerCards.Add(secondCard);

            //var bestHand = handEvaluator.GetBestHand(cards);
            var outsValuation = new GameOutsValuation();
            var outsResult = outsValuation.CalculateOuts(playerCards, cards);

            cards.Add(firstCard);
            cards.Add(secondCard);

            var bestHand = handEvaluator.GetBestHand(cards);

            if (bestHand.RankType >= Logic.HandRankType.FourOfAKind)
            {
                return CardValuationType.PlayItAllIn;
            }

            if (outsResult < 25)
            {
                return CardValuationType.Unplayable;
            }

            if (outsResult < 45)
            {
                return CardValuationType.Risky;
            }

            if (outsResult < 85)
            {
                return CardValuationType.Recommended;
            }

            return CardValuationType.StronglyRecommended;
        }