To effectively evaluate poker hands, the next sequence after a straight, straight flush, and flush draw (covered in last week’s Lesson) is to evaluate four-of-a-kind, then three-of-a-kind, and (while you’re at it) a full house.
After the hand of playing cards is sorted by value, the four-of-a-kind test has only two possible solutions: the first four cards all have the same value or the last four cards all have the same value. Here’s the fourkind() function I wrote to test both conditions:
/* only two possible hand patterns for four-of-a-kind */ int fourkind(struct playing_card p[]) { /* test the first four cards */ if( p[0].value==p[1].value && p[1].value==p[2].value && p[2].value==p[3].value ) return(TRUE); /* test the last four cards */ if( p[1].value==p[2].value && p[2].value==p[3].value && p[3].value==p[4].value ) return(TRUE); return(FALSE); }
The if statements are logically complex but serve the task of identifying the two possible patterns for a four-of-a-kind draw. When all the card values compare positively, TRUE
is returned.
I used a similar approach to evaluate a three-of-a-kind draw. In this pattern, the first three cards, middle three cards, or last three cards must have the same values to generate a true condition. Here is my threekind() function:
/* three possible hand patterns for three-of-a-kind */ int threekind(struct playing_card p[]) { /* test the first three cards */ if( p[0].value==p[1].value && p[1].value==p[2].value ) return(TRUE); /* test the next three cards */ if( p[1].value==p[2].value && p[2].value==p[3].value ) return(TRUE); /* test the last three cards */ if( p[2].value==p[3].value && p[3].value==p[4].value ) return(TRUE); return(FALSE); }
After coding these two functions, I ran some tests. I updated the playing_card hand[][]
array to add some positives for four-of-a-kind and three-of-a-kind draws, as well as keeping some of the positive matches for straights and flushes. You can view the full code for this draft on Github. Here’s sample output:
Hand 1: 5♦ 5♠ 6♦ 9♦ 9♥
Hand 2: 2♠ 4♠ 6♠ 10♠ K♠ - Flush
Hand 3: 6♠ 7♣ 7♥ 9♥ J♦
Hand 4: 4♥ 5♥ 6♥ 7♥ 8♥ - Straight Flush
Hand 5: A♠ A♥ A♦ A♣ K♥ - Four-of-a-kind
Hand 6: A♦ 4♣ 4♠ 4♥ 4♦ - Four-of-a-kind
Hand 7: 5♠ 5♣ 5♦ 9♣ J♥ - Three-of-a-kind
Hand 8: A♠ 9♥ 9♦ 9♣ Q♥ - Three-of-a-kind
Hand 9: A♠ A♥ K♦ K♣ K♥ - Three-of-a-kind
The next logical hand to evaluate is a full house, which is a combination three-of-a-kind and a pair. After much sweat and gnashing of teeth, I determined that a separate fullhouse() function would be redundant to the threekind() function. So I modified the threekind() function to also detect a full house:
/* three possible hand patterns for three-of-a-kind - and full house */ int threekind(struct playing_card p[]) { /* test the first three cards */ if( p[0].value==p[1].value && p[1].value==p[2].value ) { /* also test for full house */ if( p[3].value==p[4].value ) return(2); else return(1); } /* test the next three cards */ if( p[1].value==p[2].value && p[2].value==p[3].value ) return(TRUE); /* test the last three cards */ if( p[2].value==p[3].value && p[3].value==p[4].value ) { /* also test for a full house */ if( p[0].value==p[1].value ) return(2); else return(1); } return(FALSE); }
With the cards in the hand sorted, only two arrangements are possible for a full house: a pair and three-of-a-kind or three-of-a-kind and a pair. The first and last if tests in the threekind() function check for both conditions.
I also modified the return values from this function: FALSE
, or zero, means no pattern was found; 1 (TRUE
) means the function found a three-of-a-kind match; 2 is returned for a full house. Modifications were also made to the main() function both to show sample full house draws in the hand[][]
array.
Click here to view the full code on Github. Here’s a sample run:
Hand 1: 5♦ 5♠ 6♦ 9♦ 9♥
Hand 2: 2♠ 4♠ 6♠ 10♠ K♠ - Flush
Hand 3: 6♠ 7♣ 7♥ 9♥ J♦
Hand 4: 4♥ 5♥ 6♥ 7♥ 8♥ - Straight Flush
Hand 5: A♠ A♥ A♦ A♣ K♥ - Four-of-a-kind
Hand 6: A♦ 4♣ 4♠ 4♥ 4♦ - Four-of-a-kind
Hand 7: 5♠ 5♣ 5♦ 9♣ 9♥ - Full House
Hand 8: A♠ 9♥ 9♦ 9♣ Q♥ - Three-of-a-kind
Hand 9: A♠ A♥ K♦ K♣ K♥ - Full House
In next week’s Lesson I add the final function, pairs(), which checks for one or two pairs.