private PokerHand GetHand(PlayingCard one, PlayingCard two, PlayingCard three, PlayingCard four, PlayingCard five)
        {
            OrderedCardSet cards = new OrderedCardSet(new List <PlayingCard> {
                one, two, three, four, five
            });
            PokerHand hand = HoldemHand.IdentitfyHand(cards);

            return(hand);
        }
        public void TestCardCombo()
        {
            PokerPlayer pl1    = new FakePokerPlayer();
            PokerPlayer pl2    = new FakePokerPlayer();
            ICardDealer dealer = new DefaultCardDealer();

            dealer.ShuffleAndDealDeck(pl1, pl2);
            List <OrderedCardSet> p1PossHands = HoldemHand.GetOpponentCombinationOfHandCards(dealer.FullDeck, pl2.HandCards, dealer.CommunityCards);
            List <OrderedCardSet> p2PossHands = HoldemHand.GetOpponentCombinationOfHandCards(dealer.FullDeck, pl1.HandCards, dealer.CommunityCards);

            List <PlayingCard> totalCards = new List <PlayingCard>();

            totalCards.AddRange(pl1.HandCards);
            totalCards.AddRange(dealer.CommunityCards);
            Assert.AreEqual(7, totalCards.Count);

            int len   = 7;
            int count = 0;

            for (int t1 = 0; t1 < len; t1 += 1)
            {
                for (int t2 = t1 + 1; t2 < len; t2 += 1)
                {
                    for (int t3 = t2 + 1; t3 < len; t3 += 1)
                    {
                        for (int t4 = t3 + 1; t4 < len; t4 += 1)
                        {
                            for (int t5 = t4 + 1; t5 < len; t5 += 1)
                            {
                                count += 1;
                            }
                        }
                    }
                }
            }

            Assert.AreEqual(21, count);

            List <OrderedCardSet> p1PokerHands = HoldemHand.GetCombinationOfPokerHands(pl1.HandCards, dealer.CommunityCards);
            List <OrderedCardSet> p2PokerHands = HoldemHand.GetCombinationOfPokerHands(pl2.HandCards, dealer.CommunityCards);

            Assert.AreEqual(990, p1PossHands.Count);
            Assert.AreEqual(990, p2PossHands.Count);
            Assert.AreEqual(21, p1PokerHands.Count);
            Assert.AreEqual(21, p2PokerHands.Count);

            pl1.Hand = HoldemHand.ChooseBestHand(pl1.HandCards, dealer.CommunityCards);
            pl2.Hand = HoldemHand.ChooseBestHand(pl2.HandCards, dealer.CommunityCards);

            //  OrderedCardSet set = CardChances.GetOtherCards(dealer.FullDeck, pl2.HandCards, dealer.CommunityCards);

            HoldemHand.HandPlayResult result = HoldemHand.TestHandChances(pl1.Hand, pl1.HandCards, dealer);

            Assert.AreEqual(990, result.Wins + result.Losses + result.Ties);
        }
Example #3
0
        public void TestGeneratingBestPokerHand()
        {
            //Arrange
            HoldemHand[] HoldemHandArray = new HoldemHand[21];
            PokerHand[]  PokerHandArray  = new PokerHand[21];

            for (int i = 0; i < 21; ++i)
            {
                HoldemHandArray[i] = new HoldemHand();
            }
            for (int i = 0; i < 21; ++i)
            {
                PokerHandArray[i] = new PokerHand();
            }

            /***************************************/

            HoldemHandArray[0].Hand[0] = new Card(Rank.Three, Suit.Club);
            HoldemHandArray[0].Hand[1] = new Card(Rank.Three, Suit.Heart);

            PokerHandArray[0].Hand[0] = new Card(Rank.Ace, Suit.Diamond);
            PokerHandArray[0].Hand[1] = new Card(Rank.King, Suit.Diamond);
            PokerHandArray[0].Hand[2] = new Card(Rank.Jack, Suit.Heart);
            PokerHandArray[0].Hand[3] = new Card(Rank.Eight, Suit.Heart);
            PokerHandArray[0].Hand[4] = new Card(Rank.Nine, Suit.Diamond);


            HoldemHandArray[1].Hand[0] = new Card(Rank.Seven, Suit.Diamond);
            HoldemHandArray[1].Hand[1] = new Card(Rank.Four, Suit.Diamond);

            PokerHandArray[1].Hand[0] = new Card(Rank.Four, Suit.Club);
            PokerHandArray[1].Hand[1] = new Card(Rank.Seven, Suit.Spade);
            PokerHandArray[1].Hand[2] = new Card(Rank.Nine, Suit.Diamond);
            PokerHandArray[1].Hand[3] = new Card(Rank.Seven, Suit.Club);
            PokerHandArray[1].Hand[4] = new Card(Rank.Eight, Suit.Heart);


            HoldemHandArray[2].Hand[0] = new Card(Rank.King, Suit.Spade);
            HoldemHandArray[2].Hand[1] = new Card(Rank.Queen, Suit.Club);

            PokerHandArray[2].Hand[0] = new Card(Rank.Six, Suit.Club);
            PokerHandArray[2].Hand[1] = new Card(Rank.King, Suit.Diamond);
            PokerHandArray[2].Hand[2] = new Card(Rank.Jack, Suit.Club);
            PokerHandArray[2].Hand[3] = new Card(Rank.Two, Suit.Spade);
            PokerHandArray[2].Hand[4] = new Card(Rank.Six, Suit.Diamond);


            HoldemHandArray[3].Hand[0] = new Card(Rank.Seven, Suit.Club);
            HoldemHandArray[3].Hand[1] = new Card(Rank.Three, Suit.Spade);

            PokerHandArray[3].Hand[0] = new Card(Rank.Four, Suit.Heart);
            PokerHandArray[3].Hand[1] = new Card(Rank.King, Suit.Heart);
            PokerHandArray[3].Hand[2] = new Card(Rank.King, Suit.Spade);
            PokerHandArray[3].Hand[3] = new Card(Rank.Five, Suit.Heart);
            PokerHandArray[3].Hand[4] = new Card(Rank.Six, Suit.Heart);


            HoldemHandArray[4].Hand[0] = new Card(Rank.Seven, Suit.Spade);
            HoldemHandArray[4].Hand[1] = new Card(Rank.Eight, Suit.Diamond);

            PokerHandArray[4].Hand[0] = new Card(Rank.Four, Suit.Diamond);
            PokerHandArray[4].Hand[1] = new Card(Rank.Queen, Suit.Spade);
            PokerHandArray[4].Hand[2] = new Card(Rank.Five, Suit.Club);
            PokerHandArray[4].Hand[3] = new Card(Rank.King, Suit.Club);
            PokerHandArray[4].Hand[4] = new Card(Rank.Ace, Suit.Club);


            HoldemHandArray[5].Hand[0] = new Card(Rank.Two, Suit.Spade);
            HoldemHandArray[5].Hand[1] = new Card(Rank.Queen, Suit.Spade);

            PokerHandArray[5].Hand[0] = new Card(Rank.Queen, Suit.Diamond);
            PokerHandArray[5].Hand[1] = new Card(Rank.Nine, Suit.Diamond);
            PokerHandArray[5].Hand[2] = new Card(Rank.Ace, Suit.Spade);
            PokerHandArray[5].Hand[3] = new Card(Rank.Four, Suit.Spade);
            PokerHandArray[5].Hand[4] = new Card(Rank.Five, Suit.Spade);


            HoldemHandArray[6].Hand[0] = new Card(Rank.Ace, Suit.Spade);
            HoldemHandArray[6].Hand[1] = new Card(Rank.Four, Suit.Diamond);

            PokerHandArray[6].Hand[0] = new Card(Rank.King, Suit.Diamond);
            PokerHandArray[6].Hand[1] = new Card(Rank.Nine, Suit.Diamond);
            PokerHandArray[6].Hand[2] = new Card(Rank.King, Suit.Club);
            PokerHandArray[6].Hand[3] = new Card(Rank.King, Suit.Heart);
            PokerHandArray[6].Hand[4] = new Card(Rank.King, Suit.Spade);


            HoldemHandArray[7].Hand[0] = new Card(Rank.Seven, Suit.Spade);
            HoldemHandArray[7].Hand[1] = new Card(Rank.Two, Suit.Spade);

            PokerHandArray[7].Hand[0] = new Card(Rank.Three, Suit.Spade);
            PokerHandArray[7].Hand[1] = new Card(Rank.Four, Suit.Spade);
            PokerHandArray[7].Hand[2] = new Card(Rank.Five, Suit.Spade);
            PokerHandArray[7].Hand[3] = new Card(Rank.Six, Suit.Spade);
            PokerHandArray[7].Hand[4] = new Card(Rank.Eight, Suit.Spade);


            HoldemHandArray[8].Hand[0] = new Card(Rank.Three, Suit.Heart);
            HoldemHandArray[8].Hand[1] = new Card(Rank.Five, Suit.Club);

            PokerHandArray[8].Hand[0] = new Card(Rank.Three, Suit.Diamond);
            PokerHandArray[8].Hand[1] = new Card(Rank.Ten, Suit.Heart);
            PokerHandArray[8].Hand[2] = new Card(Rank.Ten, Suit.Spade);
            PokerHandArray[8].Hand[3] = new Card(Rank.Queen, Suit.Heart);
            PokerHandArray[8].Hand[4] = new Card(Rank.Queen, Suit.Diamond);


            HoldemHandArray[9].Hand[0] = new Card(Rank.Six, Suit.Diamond);
            HoldemHandArray[9].Hand[1] = new Card(Rank.Three, Suit.Heart);

            PokerHandArray[9].Hand[0] = new Card(Rank.Ten, Suit.Heart);
            PokerHandArray[9].Hand[1] = new Card(Rank.Ten, Suit.Diamond);
            PokerHandArray[9].Hand[2] = new Card(Rank.Queen, Suit.Diamond);
            PokerHandArray[9].Hand[3] = new Card(Rank.Ten, Suit.Spade);
            PokerHandArray[9].Hand[4] = new Card(Rank.Nine, Suit.Spade);


            HoldemHandArray[10].Hand[0] = new Card(Rank.Jack, Suit.Diamond);
            HoldemHandArray[10].Hand[1] = new Card(Rank.Nine, Suit.Spade);

            PokerHandArray[10].Hand[0] = new Card(Rank.Nine, Suit.Diamond);
            PokerHandArray[10].Hand[1] = new Card(Rank.Queen, Suit.Heart);
            PokerHandArray[10].Hand[2] = new Card(Rank.Queen, Suit.Diamond);
            PokerHandArray[10].Hand[3] = new Card(Rank.Queen, Suit.Spade);
            PokerHandArray[10].Hand[4] = new Card(Rank.Nine, Suit.Heart);


            HoldemHandArray[11].Hand[0] = new Card(Rank.Four, Suit.Spade);
            HoldemHandArray[11].Hand[1] = new Card(Rank.Two, Suit.Heart);

            PokerHandArray[11].Hand[0] = new Card(Rank.Four, Suit.Diamond);
            PokerHandArray[11].Hand[1] = new Card(Rank.Nine, Suit.Heart);
            PokerHandArray[11].Hand[2] = new Card(Rank.Two, Suit.Club);
            PokerHandArray[11].Hand[3] = new Card(Rank.Nine, Suit.Spade);
            PokerHandArray[11].Hand[4] = new Card(Rank.Nine, Suit.Diamond);


            HoldemHandArray[12].Hand[0] = new Card(Rank.Two, Suit.Spade);
            HoldemHandArray[12].Hand[1] = new Card(Rank.Seven, Suit.Club);

            PokerHandArray[12].Hand[0] = new Card(Rank.Five, Suit.Club);
            PokerHandArray[12].Hand[1] = new Card(Rank.Eight, Suit.Spade);
            PokerHandArray[12].Hand[2] = new Card(Rank.Three, Suit.Spade);
            PokerHandArray[12].Hand[3] = new Card(Rank.Six, Suit.Club);
            PokerHandArray[12].Hand[4] = new Card(Rank.Four, Suit.Club);


            HoldemHandArray[13].Hand[0] = new Card(Rank.King, Suit.Diamond);
            HoldemHandArray[13].Hand[1] = new Card(Rank.Jack, Suit.Club);

            PokerHandArray[13].Hand[0] = new Card(Rank.Seven, Suit.Club);
            PokerHandArray[13].Hand[1] = new Card(Rank.Two, Suit.Club);
            PokerHandArray[13].Hand[2] = new Card(Rank.Six, Suit.Diamond);
            PokerHandArray[13].Hand[3] = new Card(Rank.Three, Suit.Club);
            PokerHandArray[13].Hand[4] = new Card(Rank.Ace, Suit.Heart);


            HoldemHandArray[14].Hand[0] = new Card(Rank.Jack, Suit.Diamond);
            HoldemHandArray[14].Hand[1] = new Card(Rank.King, Suit.Diamond);

            PokerHandArray[14].Hand[0] = new Card(Rank.Ten, Suit.Diamond);
            PokerHandArray[14].Hand[1] = new Card(Rank.Six, Suit.Diamond);
            PokerHandArray[14].Hand[2] = new Card(Rank.Seven, Suit.Diamond);
            PokerHandArray[14].Hand[3] = new Card(Rank.King, Suit.Spade);
            PokerHandArray[14].Hand[4] = new Card(Rank.Nine, Suit.Diamond);


            HoldemHandArray[15].Hand[0] = new Card(Rank.Jack, Suit.Spade);
            HoldemHandArray[15].Hand[1] = new Card(Rank.Ace, Suit.Club);

            PokerHandArray[15].Hand[0] = new Card(Rank.King, Suit.Spade);
            PokerHandArray[15].Hand[1] = new Card(Rank.Ace, Suit.Spade);
            PokerHandArray[15].Hand[2] = new Card(Rank.Ace, Suit.Diamond);
            PokerHandArray[15].Hand[3] = new Card(Rank.Ace, Suit.Heart);
            PokerHandArray[15].Hand[4] = new Card(Rank.Queen, Suit.Club);


            HoldemHandArray[16].Hand[0] = new Card(Rank.Queen, Suit.Spade);
            HoldemHandArray[16].Hand[1] = new Card(Rank.Two, Suit.Spade);

            PokerHandArray[16].Hand[0] = new Card(Rank.Queen, Suit.Heart);
            PokerHandArray[16].Hand[1] = new Card(Rank.Ace, Suit.Club);
            PokerHandArray[16].Hand[2] = new Card(Rank.Ace, Suit.Heart);
            PokerHandArray[16].Hand[3] = new Card(Rank.Eight, Suit.Heart);
            PokerHandArray[16].Hand[4] = new Card(Rank.Eight, Suit.Diamond);


            HoldemHandArray[17].Hand[0] = new Card(Rank.Ace, Suit.Club);
            HoldemHandArray[17].Hand[1] = new Card(Rank.Three, Suit.Heart);

            PokerHandArray[17].Hand[0] = new Card(Rank.King, Suit.Club);
            PokerHandArray[17].Hand[1] = new Card(Rank.Queen, Suit.Club);
            PokerHandArray[17].Hand[2] = new Card(Rank.Jack, Suit.Club);
            PokerHandArray[17].Hand[3] = new Card(Rank.Six, Suit.Diamond);
            PokerHandArray[17].Hand[4] = new Card(Rank.Ten, Suit.Club);


            HoldemHandArray[18].Hand[0] = new Card(Rank.Ace, Suit.Club);
            HoldemHandArray[18].Hand[1] = new Card(Rank.Ten, Suit.Club);

            PokerHandArray[18].Hand[0] = new Card(Rank.Six, Suit.Diamond);
            PokerHandArray[18].Hand[1] = new Card(Rank.King, Suit.Club);
            PokerHandArray[18].Hand[2] = new Card(Rank.Jack, Suit.Club);
            PokerHandArray[18].Hand[3] = new Card(Rank.Three, Suit.Heart);
            PokerHandArray[18].Hand[4] = new Card(Rank.Queen, Suit.Club);


            HoldemHandArray[19].Hand[0] = new Card(Rank.Ten, Suit.Club);
            HoldemHandArray[19].Hand[1] = new Card(Rank.Ace, Suit.Club);

            PokerHandArray[19].Hand[0] = new Card(Rank.King, Suit.Club);
            PokerHandArray[19].Hand[1] = new Card(Rank.Three, Suit.Heart);
            PokerHandArray[19].Hand[2] = new Card(Rank.Queen, Suit.Club);
            PokerHandArray[19].Hand[3] = new Card(Rank.Jack, Suit.Club);
            PokerHandArray[19].Hand[4] = new Card(Rank.Six, Suit.Diamond);

            HoldemHandArray[20].Hand[0] = new Card(Rank.Three, Suit.Heart);
            HoldemHandArray[20].Hand[1] = new Card(Rank.Ace, Suit.Club);

            PokerHandArray[20].Hand[0] = new Card(Rank.Queen, Suit.Club);
            PokerHandArray[20].Hand[1] = new Card(Rank.Ten, Suit.Club);
            PokerHandArray[20].Hand[2] = new Card(Rank.Jack, Suit.Club);
            PokerHandArray[20].Hand[3] = new Card(Rank.Six, Suit.Diamond);
            PokerHandArray[20].Hand[4] = new Card(Rank.King, Suit.Club);


            //Act
            PokerHandArray[0]  = HoldemHandArray[0].FindBestPokerHand(PokerHandArray[0]);
            PokerHandArray[1]  = HoldemHandArray[1].FindBestPokerHand(PokerHandArray[1]);
            PokerHandArray[2]  = HoldemHandArray[2].FindBestPokerHand(PokerHandArray[2]);
            PokerHandArray[3]  = HoldemHandArray[3].FindBestPokerHand(PokerHandArray[3]);
            PokerHandArray[4]  = HoldemHandArray[4].FindBestPokerHand(PokerHandArray[4]);
            PokerHandArray[5]  = HoldemHandArray[5].FindBestPokerHand(PokerHandArray[5]);
            PokerHandArray[6]  = HoldemHandArray[6].FindBestPokerHand(PokerHandArray[6]);
            PokerHandArray[7]  = HoldemHandArray[7].FindBestPokerHand(PokerHandArray[7]);
            PokerHandArray[8]  = HoldemHandArray[8].FindBestPokerHand(PokerHandArray[8]);
            PokerHandArray[9]  = HoldemHandArray[9].FindBestPokerHand(PokerHandArray[9]);
            PokerHandArray[10] = HoldemHandArray[10].FindBestPokerHand(PokerHandArray[10]);
            PokerHandArray[11] = HoldemHandArray[11].FindBestPokerHand(PokerHandArray[11]);
            PokerHandArray[12] = HoldemHandArray[12].FindBestPokerHand(PokerHandArray[12]);
            PokerHandArray[13] = HoldemHandArray[13].FindBestPokerHand(PokerHandArray[13]);
            PokerHandArray[14] = HoldemHandArray[14].FindBestPokerHand(PokerHandArray[14]);
            PokerHandArray[15] = HoldemHandArray[15].FindBestPokerHand(PokerHandArray[15]);
            PokerHandArray[16] = HoldemHandArray[16].FindBestPokerHand(PokerHandArray[16]);
            PokerHandArray[17] = HoldemHandArray[17].FindBestPokerHand(PokerHandArray[17]);
            PokerHandArray[18] = HoldemHandArray[18].FindBestPokerHand(PokerHandArray[18]);
            PokerHandArray[19] = HoldemHandArray[19].FindBestPokerHand(PokerHandArray[19]);
            PokerHandArray[20] = HoldemHandArray[20].FindBestPokerHand(PokerHandArray[20]);

            //Assert
            Array.Sort(PokerHandArray[0].Hand);
            Array.Sort(PokerHandArray[1].Hand);
            Array.Sort(PokerHandArray[2].Hand);
            Array.Sort(PokerHandArray[3].Hand);
            Array.Sort(PokerHandArray[4].Hand);
            Array.Sort(PokerHandArray[5].Hand);
            Array.Sort(PokerHandArray[6].Hand);
            Array.Sort(PokerHandArray[7].Hand);
            Array.Sort(PokerHandArray[8].Hand);
            Array.Sort(PokerHandArray[9].Hand);
            Array.Sort(PokerHandArray[10].Hand);
            Array.Sort(PokerHandArray[11].Hand);
            Array.Sort(PokerHandArray[12].Hand);
            Array.Sort(PokerHandArray[13].Hand);
            Array.Sort(PokerHandArray[14].Hand);
            Array.Sort(PokerHandArray[15].Hand);
            Array.Sort(PokerHandArray[16].Hand);
            Array.Sort(PokerHandArray[17].Hand);
            Array.Sort(PokerHandArray[18].Hand);
            Array.Sort(PokerHandArray[19].Hand);
            Array.Sort(PokerHandArray[20].Hand);

            /***************************************/

            Assert.AreEqual(new Card(Rank.Ace, Suit.Diamond), PokerHandArray[0].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Diamond), PokerHandArray[0].Hand[1]);
            Assert.AreEqual(new Card(Rank.Jack, Suit.Heart), PokerHandArray[0].Hand[2]);
            Assert.AreEqual(new Card(Rank.Three, Suit.Club), PokerHandArray[0].Hand[3]);
            Assert.AreEqual(new Card(Rank.Three, Suit.Heart), PokerHandArray[0].Hand[4]);

            Assert.AreEqual(new Card(Rank.Seven, Suit.Diamond), PokerHandArray[1].Hand[0]);
            Assert.AreEqual(new Card(Rank.Seven, Suit.Spade), PokerHandArray[1].Hand[1]);
            Assert.AreEqual(new Card(Rank.Seven, Suit.Club), PokerHandArray[1].Hand[2]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Diamond), PokerHandArray[1].Hand[3]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Club), PokerHandArray[1].Hand[4]);

            Assert.AreEqual(new Card(Rank.King, Suit.Spade), PokerHandArray[2].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Diamond), PokerHandArray[2].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Club), PokerHandArray[2].Hand[2]);
            Assert.AreEqual(new Card(Rank.Six, Suit.Club), PokerHandArray[2].Hand[3]);
            Assert.AreEqual(new Card(Rank.Six, Suit.Diamond), PokerHandArray[2].Hand[4]);

            Assert.AreEqual(new Card(Rank.Seven, Suit.Club), PokerHandArray[3].Hand[0]);
            Assert.AreEqual(new Card(Rank.Six, Suit.Heart), PokerHandArray[3].Hand[1]);
            Assert.AreEqual(new Card(Rank.Five, Suit.Heart), PokerHandArray[3].Hand[2]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Heart), PokerHandArray[3].Hand[3]);
            Assert.AreEqual(new Card(Rank.Three, Suit.Spade), PokerHandArray[3].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Club), PokerHandArray[4].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Club), PokerHandArray[4].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Spade), PokerHandArray[4].Hand[2]);
            Assert.AreEqual(new Card(Rank.Eight, Suit.Diamond), PokerHandArray[4].Hand[3]);
            Assert.AreEqual(new Card(Rank.Seven, Suit.Spade), PokerHandArray[4].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Spade), PokerHandArray[5].Hand[0]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Spade), PokerHandArray[5].Hand[1]);
            Assert.AreEqual(new Card(Rank.Five, Suit.Spade), PokerHandArray[5].Hand[2]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Spade), PokerHandArray[5].Hand[3]);
            Assert.AreEqual(new Card(Rank.Two, Suit.Spade), PokerHandArray[5].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Spade), PokerHandArray[6].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Diamond), PokerHandArray[6].Hand[1]);
            Assert.AreEqual(new Card(Rank.King, Suit.Club), PokerHandArray[6].Hand[2]);
            Assert.AreEqual(new Card(Rank.King, Suit.Heart), PokerHandArray[6].Hand[3]);
            Assert.AreEqual(new Card(Rank.King, Suit.Spade), PokerHandArray[6].Hand[4]);

            Assert.AreEqual(new Card(Rank.Eight, Suit.Spade), PokerHandArray[7].Hand[0]);
            Assert.AreEqual(new Card(Rank.Seven, Suit.Spade), PokerHandArray[7].Hand[1]);
            Assert.AreEqual(new Card(Rank.Six, Suit.Spade), PokerHandArray[7].Hand[2]);
            Assert.AreEqual(new Card(Rank.Five, Suit.Spade), PokerHandArray[7].Hand[3]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Spade), PokerHandArray[7].Hand[4]);

            Assert.AreEqual(new Card(Rank.Queen, Suit.Heart), PokerHandArray[8].Hand[0]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Diamond), PokerHandArray[8].Hand[1]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Heart), PokerHandArray[8].Hand[2]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Spade), PokerHandArray[8].Hand[3]);
            Assert.AreEqual(new Card(Rank.Five, Suit.Club), PokerHandArray[8].Hand[4]);

            Assert.AreEqual(new Card(Rank.Queen, Suit.Diamond), PokerHandArray[9].Hand[0]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Heart), PokerHandArray[9].Hand[1]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Diamond), PokerHandArray[9].Hand[2]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Spade), PokerHandArray[9].Hand[3]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Spade), PokerHandArray[9].Hand[4]);

            Assert.AreEqual(new Card(Rank.Queen, Suit.Heart), PokerHandArray[10].Hand[0]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Diamond), PokerHandArray[10].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Spade), PokerHandArray[10].Hand[2]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Spade), PokerHandArray[10].Hand[3]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Heart), PokerHandArray[10].Hand[4]);

            Assert.AreEqual(new Card(Rank.Nine, Suit.Heart), PokerHandArray[11].Hand[0]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Spade), PokerHandArray[11].Hand[1]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Diamond), PokerHandArray[11].Hand[2]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Spade), PokerHandArray[11].Hand[3]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Diamond), PokerHandArray[11].Hand[4]);

            Assert.AreEqual(new Card(Rank.Nine, Suit.Heart), PokerHandArray[11].Hand[0]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Spade), PokerHandArray[11].Hand[1]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Diamond), PokerHandArray[11].Hand[2]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Spade), PokerHandArray[11].Hand[3]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Diamond), PokerHandArray[11].Hand[4]);

            Assert.AreEqual(new Card(Rank.Eight, Suit.Spade), PokerHandArray[12].Hand[0]);
            Assert.AreEqual(new Card(Rank.Seven, Suit.Club), PokerHandArray[12].Hand[1]);
            Assert.AreEqual(new Card(Rank.Six, Suit.Club), PokerHandArray[12].Hand[2]);
            Assert.AreEqual(new Card(Rank.Five, Suit.Club), PokerHandArray[12].Hand[3]);
            Assert.AreEqual(new Card(Rank.Four, Suit.Club), PokerHandArray[12].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Heart), PokerHandArray[13].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Diamond), PokerHandArray[13].Hand[1]);
            Assert.AreEqual(new Card(Rank.Jack, Suit.Club), PokerHandArray[13].Hand[2]);
            Assert.AreEqual(new Card(Rank.Seven, Suit.Club), PokerHandArray[13].Hand[3]);
            Assert.AreEqual(new Card(Rank.Six, Suit.Diamond), PokerHandArray[13].Hand[4]);

            Assert.AreEqual(new Card(Rank.King, Suit.Diamond), PokerHandArray[14].Hand[0]);
            Assert.AreEqual(new Card(Rank.Jack, Suit.Diamond), PokerHandArray[14].Hand[1]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Diamond), PokerHandArray[14].Hand[2]);
            Assert.AreEqual(new Card(Rank.Nine, Suit.Diamond), PokerHandArray[14].Hand[3]);
            Assert.AreEqual(new Card(Rank.Seven, Suit.Diamond), PokerHandArray[14].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Club), PokerHandArray[15].Hand[0]);
            Assert.AreEqual(new Card(Rank.Ace, Suit.Spade), PokerHandArray[15].Hand[1]);
            Assert.AreEqual(new Card(Rank.Ace, Suit.Diamond), PokerHandArray[15].Hand[2]);
            Assert.AreEqual(new Card(Rank.Ace, Suit.Heart), PokerHandArray[15].Hand[3]);
            Assert.AreEqual(new Card(Rank.King, Suit.Spade), PokerHandArray[15].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Club), PokerHandArray[16].Hand[0]);
            Assert.AreEqual(new Card(Rank.Ace, Suit.Heart), PokerHandArray[16].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Spade), PokerHandArray[16].Hand[2]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Heart), PokerHandArray[16].Hand[3]);
            Assert.AreEqual(new Card(Rank.Eight, Suit.Heart), PokerHandArray[16].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Club), PokerHandArray[17].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Club), PokerHandArray[17].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Club), PokerHandArray[17].Hand[2]);
            Assert.AreEqual(new Card(Rank.Jack, Suit.Club), PokerHandArray[17].Hand[3]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Club), PokerHandArray[17].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Club), PokerHandArray[18].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Club), PokerHandArray[18].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Club), PokerHandArray[18].Hand[2]);
            Assert.AreEqual(new Card(Rank.Jack, Suit.Club), PokerHandArray[18].Hand[3]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Club), PokerHandArray[18].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Club), PokerHandArray[19].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Club), PokerHandArray[19].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Club), PokerHandArray[19].Hand[2]);
            Assert.AreEqual(new Card(Rank.Jack, Suit.Club), PokerHandArray[19].Hand[3]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Club), PokerHandArray[19].Hand[4]);

            Assert.AreEqual(new Card(Rank.Ace, Suit.Club), PokerHandArray[20].Hand[0]);
            Assert.AreEqual(new Card(Rank.King, Suit.Club), PokerHandArray[20].Hand[1]);
            Assert.AreEqual(new Card(Rank.Queen, Suit.Club), PokerHandArray[20].Hand[2]);
            Assert.AreEqual(new Card(Rank.Jack, Suit.Club), PokerHandArray[20].Hand[3]);
            Assert.AreEqual(new Card(Rank.Ten, Suit.Club), PokerHandArray[20].Hand[4]);
        }
Example #4
0
        public static Results ParseFromHH(String hh, bool completeSimulation, bool includeHero)
        {
            Environment.CurrentDirectory = Path.GetDirectoryName(Application.ExecutablePath);

            Dictionary <String, IHand> hands = new Dictionary <String, IHand>();
            Board board = new Board();
            Dictionary <String, double> stackSizes = new Dictionary <String, double>();
            ArrayList seatsInHand = new ArrayList();
            Dictionary <String, String> playerNames = new Dictionary <String, String>();
            Dictionary <String, String> playerSeats = new Dictionary <String, String>();
            double totalBet = 0;

            Consts.GameTypes gameType;
            String           heroName  = String.Empty;
            String           heroCards = String.Empty;

            StringReader reader = new StringReader(hh);

            try
            {
                double currentBet = 0;


                String nextLine = reader.ReadLine();
                while (nextLine == String.Empty)
                {
                    nextLine = reader.ReadLine();
                }
                //determine Game
                if (nextLine.Contains("Omaha") || nextLine.Contains("OMAHA"))
                {
                    if (nextLine.Contains("/L"))
                    {
                        gameType = Consts.GameTypes.OmahaHiLo;
                    }
                    else
                    {
                        gameType = Consts.GameTypes.Omaha;
                    }
                }
                else if (nextLine.Contains("Hold") || nextLine.Contains("HOLD"))
                {
                    gameType = Consts.GameTypes.Holdem;
                }
                else
                {
                    //for Seals with Clubs, game type is on second line
                    nextLine = reader.ReadLine();
                    if (nextLine.Contains("Omaha"))
                    {
                        if (nextLine.Contains("Hi-Lo"))
                        {
                            gameType = Consts.GameTypes.OmahaHiLo;
                        }
                        else
                        {
                            gameType = Consts.GameTypes.Omaha;
                        }
                    }
                    else if (nextLine.Contains("Hold"))
                    {
                        gameType = Consts.GameTypes.Holdem;
                    }
                    else
                    {
                        throw new Exception("Could not detect valid game type.");
                    }
                }

                //start loop to read HH
                nextLine = reader.ReadLine();
                //loop to read players at table and stack sizes
                while (!nextLine.Contains("big blind"))
                {
                    if (nextLine.StartsWith("Seat "))
                    {
                        String seatNumber;
                        int    nameStartIndex;
                        if (nextLine.Contains(":"))
                        {
                            //Full Tilt, Stars, Seals
                            seatNumber     = nextLine.Substring(5, nextLine.IndexOf(':') - 5);
                            nameStartIndex = nextLine.IndexOf(": ") + 2;
                        }
                        else
                        {
                            //AP
                            seatNumber     = nextLine.Substring(5, nextLine.IndexOf(" - ") - 5);
                            nameStartIndex = nextLine.IndexOf(" - ") + 3;
                        }

                        //this is first time we've seen "Seat ", so this is chip count and name
                        int    nameEndIndex = nextLine.IndexOf(" (", 8);
                        String chipCount    = nextLine.Substring(nameEndIndex + 2,
                                                                 nextLine.IndexOf(")", 10) - nextLine.IndexOf(" (", 8) - 2);
                        chipCount = chipCount.Replace("$", "");
                        if (chipCount.Contains(" "))
                        {
                            chipCount = chipCount.Remove(chipCount.IndexOf(" "));
                        }
                        stackSizes.Add(seatNumber, Double.Parse(chipCount));

                        String name = nextLine.Substring(nameStartIndex, nameEndIndex - nameStartIndex);
                        playerNames.Add(seatNumber, name);
                        playerSeats.Add(name, seatNumber);
                    }
                    nextLine = reader.ReadLine();
                }
                if (nextLine.Contains("big blind of "))                 //Full Tilt
                {
                    String bet = nextLine.Substring(nextLine.IndexOf("big blind of ") + "big blind of ".Length);
                    bet = bet.Replace("$", "");
                    double.TryParse(bet, out currentBet);
                    nextLine = reader.ReadLine();
                }
                else                 //Pokerstars, AP, Seals
                {
                    String bet = nextLine.Substring(nextLine.IndexOf("big blind ") + "big blind ".Length);
                    bet = bet.Replace("$", "");
                    double.TryParse(bet, out currentBet);
                    nextLine = reader.ReadLine();

                    /*if (nextLine.Contains("sitout (wait for BB)"))
                     * {
                     *  String sitoutName = nextLine.Substring(0, nextLine.IndexOf(" - "));
                     *  foreach (KeyValuePair<String, String> playerName in playerNames)
                     *      if (playerName.Value.Equals(sitoutName))
                     *          stackSizes.Remove(playerName.Key);
                     *  nextLine = reader.ReadLine();
                     * }*/
                }

                //loop to read board and betting action
                while (!nextLine.StartsWith("Seat ") && !nextLine.StartsWith("** Pot"))
                {
                    if (nextLine.Contains(" raises ") || nextLine.Contains(" Raise ") || nextLine.Contains(" Raises "))
                    {
                        String bet = nextLine.Substring(nextLine.IndexOf(" to ") + 4);
                        bet = bet.Replace("$", "");
                        if (bet.Contains(", and is"))
                        {
                            bet = bet.Remove(bet.IndexOf(", and is"));
                        }
                        else if (bet.Contains(" and is"))
                        {
                            bet = bet.Remove(bet.IndexOf(" and is"));
                        }
                        else if (bet.Contains("(All-in)")) //Seals
                        {
                            bet = bet.Remove(bet.IndexOf(" ( All-in)"));
                        }
                        double.TryParse(bet, out currentBet);
                    }
                    else if (nextLine.Contains(" bets ") || nextLine.Contains(" Bets "))
                    {
                        String bet;
                        if (nextLine.Contains(" bets "))
                        {
                            bet = nextLine.Substring(nextLine.IndexOf(" bets ") + 6);
                        }
                        else
                        {
                            bet = nextLine.Substring(nextLine.IndexOf(" Bets ") + 6);
                        }

                        bet = bet.Replace("$", "");
                        if (bet.Contains(", and is"))
                        {
                            bet = bet.Remove(bet.IndexOf(", and is"));
                        }
                        else if (bet.Contains(" and is "))
                        {
                            bet = bet.Remove(bet.IndexOf(" and is"));
                        }
                        else if (bet.Contains("(All-in)")) //Seals
                        {
                            bet = bet.Remove(bet.IndexOf(" ( All-in)"));
                        }
                        double.TryParse(bet, out currentBet);
                    }
                    else if (nextLine.Contains("All-In"))
                    {
                        String bet = nextLine.Substring(nextLine.IndexOf("All-In ") + 7);
                        bet = bet.Replace("$", "");
                        double tempCurrentBet = currentBet;
                        if (!double.TryParse(bet, out currentBet))
                        {
                            if (nextLine.Contains("All-In(Raise) "))
                            {
                                bet = nextLine.Substring(nextLine.IndexOf("All-In(Raise) "));
                                bet = bet.Substring(bet.IndexOf("to ") + 3);
                                bet = bet.Replace("$", "");

                                double.TryParse(bet, out currentBet);
                            }
                        }
                        if (tempCurrentBet > currentBet)
                        {
                            currentBet = tempCurrentBet;
                        }
                    }
                    else if (nextLine.StartsWith("*** F"))
                    {
                        nextLine = nextLine.Replace("10", "T");
                        board.Add(Card.Parse(nextLine.Substring(14, 2)));
                        board.Add(Card.Parse(nextLine.Substring(17, 2)));
                        board.Add(Card.Parse(nextLine.Substring(20, 2)));
                        totalBet  += currentBet;
                        currentBet = 0;
                    }
                    else if (nextLine.StartsWith("*** T"))
                    {
                        nextLine = nextLine.Replace("10", "T");
                        board.Add(Card.Parse(nextLine.Substring(25, 2)));
                        totalBet  += currentBet;
                        currentBet = 0;
                    }
                    else if (nextLine.StartsWith("*** R"))
                    {
                        nextLine = nextLine.Replace("10", "T");
                        board.Add(Card.Parse(nextLine.Substring(29, 2)));
                        totalBet  += currentBet;
                        currentBet = 0;
                    }
                    else if (nextLine.StartsWith("** F")) //Seals
                    {
                        board.Add(Card.Parse(nextLine.Substring(12, 2)));
                        board.Add(Card.Parse(nextLine.Substring(15, 2)));
                        board.Add(Card.Parse(nextLine.Substring(18, 2)));
                        totalBet  += currentBet;
                        currentBet = 0;
                    }
                    else if (nextLine.StartsWith("** T")) //Seals
                    {
                        board.Add(Card.Parse(nextLine.Substring(12, 2)));
                        totalBet  += currentBet;
                        currentBet = 0;
                    }
                    else if (nextLine.StartsWith("** R")) //Seals
                    {
                        board.Add(Card.Parse(nextLine.Substring(13, 2)));
                        totalBet  += currentBet;
                        currentBet = 0;
                    }
                    else if (nextLine.StartsWith("Uncalled bet "))
                    {
                        if (nextLine.Contains(" of "))
                        {
                            //for Full Tilt HH
                            String returnedBet = nextLine.Substring(16, nextLine.IndexOf(" returned") - 16);
                            returnedBet = returnedBet.Replace("$", "");
                            currentBet -= Double.Parse(returnedBet);
                        }
                        else
                        {
                            //for PS HH
                            String returnedBet = nextLine.Substring(14, nextLine.IndexOf(")") - 14);
                            returnedBet = returnedBet.Replace("$", "");
                            currentBet -= Double.Parse(returnedBet);
                        }
                    }
                    else if (nextLine.Contains("returned ("))
                    {
                        //for AP HH
                        int    returnedBetStartIndex = nextLine.IndexOf("(") + 1;
                        int    returnedBetEndIndex   = nextLine.IndexOf(")");
                        String returnedBet           = nextLine.Substring(returnedBetStartIndex, returnedBetEndIndex - returnedBetStartIndex);
                        returnedBet = returnedBet.Replace("$", "");
                        currentBet -= Double.Parse(returnedBet);
                    }
                    else if (nextLine.Contains("refunded "))
                    {
                        //Seals
                        int    returnedBetStartIndex = nextLine.IndexOf("refunded ") + "refunded ".Length;
                        String returnedBet           = nextLine.Substring(returnedBetStartIndex);
                        currentBet -= Double.Parse(returnedBet);
                    }
                    else if (nextLine.StartsWith("Dealt to "))
                    {
                        heroName  = nextLine.Substring("Dealt to ".Length);
                        heroCards = heroName.Substring(heroName.IndexOf(" [") + 2);
                        heroName  = heroName.Remove(heroName.IndexOf(" ["));
                        heroCards = heroCards.Remove(heroCards.IndexOf(']'));
                    }
                    nextLine = reader.ReadLine();
                }
                totalBet += currentBet;

                if (nextLine.Contains("Seat "))
                {
                    //loop to read showdown
                    while (nextLine.StartsWith("Seat "))
                    {
                        String seatNumber = nextLine.Substring(5, nextLine.IndexOf(':') - 5);
                        try
                        {
                            //this is second time we've seen "Seat ", so this is showdown
                            if (playerNames[seatNumber].Equals(heroName) && includeHero)
                            {
                                stackSizes[seatNumber] = double.MaxValue;
                                if (gameType == Consts.GameTypes.Holdem)
                                {
                                    hands.Add(seatNumber, HoldemHand.Parse(heroCards));
                                }
                                else
                                {
                                    hands.Add(seatNumber, OmahaHand.Parse(heroCards));
                                }
                            }
                            //else if (nextLine.Contains("showed") || nextLine.Contains("mucked"))
                            else if (nextLine.Contains("["))
                            {
                                int index;
                                nextLine = nextLine.Replace("10", "T");
                                if (nextLine.Contains("[Mucked]"))
                                {
                                    index = nextLine.IndexOf("[", nextLine.IndexOf("[") + 1);
                                }
                                else
                                {
                                    index = nextLine.IndexOf("[");
                                }
                                if (gameType == Consts.GameTypes.Holdem)
                                {
                                    hands.Add(seatNumber, HoldemHand.Parse(nextLine.Substring(index + 1, 5)));
                                }
                                else
                                {
                                    hands.Add(seatNumber, OmahaHand.Parse(nextLine.Substring(index + 1, 11)));
                                }
                                seatsInHand.Add(seatNumber);
                            }
                            else
                            {
                                stackSizes.Remove(seatNumber);
                            }
                        }
                        catch (Exception)
                        {
                            //player might have sat in previous round and bought in this round
                            //this causes a bug in some FT HHs
                            nextLine = nextLine.Substring(nextLine.Substring(1).IndexOf("Seat") + 1);
                            nextLine = nextLine.Replace("10", "T");
                            int tempSeatNumber = Int32.Parse(seatNumber);
                            tempSeatNumber++;
                            seatNumber = tempSeatNumber.ToString();
                            if (nextLine.Contains("["))
                            {
                                int index = nextLine.IndexOf("[");
                                if (gameType == Consts.GameTypes.Holdem)
                                {
                                    hands.Add(seatNumber, HoldemHand.Parse(nextLine.Substring(index + 1, 5)));
                                }
                                else
                                {
                                    hands.Add(seatNumber, OmahaHand.Parse(nextLine.Substring(index + 1, 11)));
                                }
                            }
                            else
                            {
                                stackSizes.Remove(seatNumber);
                            }
                        }

                        nextLine = reader.ReadLine();
                        if (nextLine == null)
                        {
                            break;
                        }
                    }
                }
                else if (nextLine.StartsWith("** Pot"))
                {
                    //Seals, different showdown format
                    nextLine = reader.ReadLine();

                    while (nextLine.Contains("shows"))
                    {
                        String playerName = nextLine.Substring(0, nextLine.IndexOf(" shows"));
                        String seatNumber = playerSeats[playerName];

                        if (playerName.Equals(heroName) && includeHero)
                        {
                            stackSizes[seatNumber] = double.MaxValue;
                            if (gameType == Consts.GameTypes.Holdem)
                            {
                                hands.Add(seatNumber, HoldemHand.Parse(heroCards));
                            }
                            else
                            {
                                hands.Add(seatNumber, OmahaHand.Parse(heroCards));
                            }
                        }
                        else if (nextLine.Contains("["))
                        {
                            int index = nextLine.IndexOf("[");
                            if (gameType == Consts.GameTypes.Holdem)
                            {
                                hands.Add(seatNumber, HoldemHand.Parse(nextLine.Substring(index + 1, 5)));
                            }
                            else
                            {
                                hands.Add(seatNumber, OmahaHand.Parse(nextLine.Substring(index + 1, 11)));
                            }
                            seatsInHand.Add(seatNumber);
                        }
                        nextLine = reader.ReadLine();
                    }
                }
            }
            catch (CardException e)
            {
                if (e.CardString.Equals("Do"))
                {
                    return(new Results("Error parsing hand history. At least two shown hands are required for simulation.", hh));
                }
                else
                {
                    return(new Results("Error parsing hand history. Could not parse card '" + e.CardString + "'", hh));
                }
            }
            catch (Exception)
            {
                return(new Results("Error parsing hand history.", hh));
            }

            if (board.Cards.Count != 5)
            {
                return(new Results("Error parsing hand history. There must be five board cards.", hh));
            }
            else if (hands.Count < 2)
            {
                return(new Results("Error parsing hand history. At least two shown hands are required for simulation.", hh));
            }

            Deck      deck           = new Deck();
            ArrayList handsArrayList = new ArrayList(hands.Values);

            deck.RemoveHands(handsArrayList);
            Calculator calc    = new Calculator(deck, handsArrayList, board, gameType);
            Results    results = new Results(gameType, board, hh);

            if (hands.Count < stackSizes.Count)
            {
                ArrayList seatsToRemove = new ArrayList();
                foreach (KeyValuePair <String, double> stackSize in stackSizes)
                {
                    if (!seatsInHand.Contains(stackSize.Key))
                    {
                        seatsToRemove.Add(stackSize.Key);
                    }
                }
                foreach (String seatToRemove in seatsToRemove)
                {
                    stackSizes.Remove(seatToRemove);
                }
            }

            //create results summary
            String summary    = "";
            double smallStack = totalBet;

            foreach (KeyValuePair <String, double> stackSize in stackSizes)
            {
                summary += ((IHand)hands[stackSize.Key]).Cards.ToString(false) + " v ";
                ((IHand)hands[stackSize.Key]).ChipCount  = stackSize.Value;
                ((IHand)hands[stackSize.Key]).PlayerName = playerNames[stackSize.Key];
                if (((IHand)hands[stackSize.Key]).ChipCount < smallStack)
                {
                    smallStack = ((IHand)hands[stackSize.Key]).ChipCount;
                }
            }
            summary         = summary.Remove(summary.Length - 3);
            results.Summary = summary;

            DateTime startTime = DateTime.Now;
            bool     sidePot;

            do
            {
                sidePot = false;

                //Calculate Equities
                double[] preflopEquities = calc.CalculatePreflopEquity();
                double[] flopEquities    = calc.CalculateFlopEquity();
                double[] turnEquities    = calc.CalculateTurnEquity();
                double[] riverEquities   = calc.CalculateRiverEquity();

                Simulation simulation = new Simulation((IHand[])handsArrayList.ToArray(typeof(IHand)), preflopEquities, flopEquities, turnEquities, riverEquities);

                results.AddSimulation(simulation);

                if (smallStack < (totalBet - .009))
                {
                    double    tempSmallStack = smallStack;
                    ArrayList tempHands      = (ArrayList)handsArrayList.Clone();
                    smallStack = totalBet;
                    foreach (IHand hand in tempHands)
                    {
                        if (hand.ChipCount == tempSmallStack)
                        {
                            handsArrayList.Remove(hand);
                            if (hands.Count > 1)
                            {
                                sidePot = true;
                            }
                        }
                        else if (hand.ChipCount < smallStack)
                        {
                            smallStack = hand.ChipCount;
                        }
                    }
                    calc.Deck = deck;
                }
            } while (sidePot && completeSimulation);

            TimeSpan totalTime = DateTime.Now - startTime;

            results.Time = totalTime.TotalSeconds;
            return(results);
        }