Fork me on Github

Fork me on GitHub

Jul 3, 2012

Calculating outcomes of Texas Holdem poker, functional approach with CSharp

Taking part in the Udacity CS212 course inspired me to take a look at how to calculate outcomes for Texas Holdem poker.

I created an C# application to calculate poker outcomes and uploaded it onto my GitHub account.


Looking at other programming languages has been really instructive in that it has changed the way that I look at my C# code.

For example I used the following two list comprehensions with LINQ.

        // returns all pairs, disregarding order, 
        // that can be chosen from the remaining cards in the deck
        public static IEnumerable<List<PokerEntities.Card>> GeneratePairs(
              this List<PokerEntities.Card> remainingCards)
        {
            var allPairs =
                from cardOne in remainingCards
                from cardTwo in remainingCards
                where !cardOne.Equals(cardTwo)
                where cardOne.CompareTo(cardTwo) == 1
                select new List<PokerEntities.Card> {cardOne, cardTwo};

            return allPairs;
        }

        // returns all triples, disregarding order, 
        // that can be chosen from the seven cards in the flop
               public static IEnumerable<List<PokerEntities.Card>>
                    GenerateTriples(this List<PokerEntities.Card> theFlop)
        {
            var allFlopTriples = from cardOne in theFlop
                                 from cardTwo in theFlop
                                 from cardThree in theFlop
                                 where !cardOne.Equals(cardTwo)
                                 where !cardTwo.Equals(cardThree)
                                 where !cardThree.Equals(cardOne)
                                 where cardOne.CompareTo(cardTwo) == 1
                                 where cardTwo.CompareTo(cardThree) == 1
                                 select new List<PokerEntities.Card> { cardOne, cardTwo, cardThree };
            return allFlopTriples;
        }
I have implemented all the functionality as pure functions, which renders a bit of performance penalty in C#. More blog entries will follow on how I optimize the code to get rid of these performance bottlenecks.