Matching two card values in a poker hand counts as a pair. It’s the lowest-ranking hand (above the non-ranked “high card”) and the most common. In my poker program, it’s also the last ranking hand tested.
Because the winning hands four-of-a-kind, three-of-a-kind, and full house have already been eliminated in last week’s Lesson, the single pair hand isn’t that complex of a test. What I discovered when coding my pairs() function, however, was that it also makes sense to check for two pairs after the first pair is detected.
The playing_card array p[]
is sorted by card value. In this arrangement, only four possible positions exist for a pair:
p[0].value==p[1].value
p[1].value==p[2].value
p[2].value==p[3].value
p[3].value==p[4].value
If checked in the above order, only three possibilities exist for two pairs:
p[0].value==p[1].value && p[2].value==p[3].value
p[0].value==p[1].value && p[3].value==p[4].value
p[1].value==p[2].value &&p[3].value==p[4].value
These combinations can be tested in sequence, which is what I did in my pairs() function:
/* Check for pairs */ int pairs(struct playing_card p[]) { /* test the first two cards */ if( p[0].value==p[1].value ) { /* check for a second pair */ if( p[2].value==p[3].value || p[3].value==p[4].value ) return(2); else return(TRUE); } /* test the second two cards */ if( p[1].value==p[2].value ) { /* check for a second pair */ if( p[3].value==p[4].value ) return(2); else return(TRUE); } /* test for a pair at the 3rd position */ if( p[2].value==p[3].value ) return(TRUE); /* test for a pair at the final position */ if( p[3].value==p[4].value ) return(TRUE); return(FALSE); }
The first if test compares values for the first two cards. If true, the second pair (at two positions) is also tested.
The second if test checks for a pair at the second position, as well as a second pair at the fourth position.
The third if text checks for a pair at the third position, and the final if test checks for a pair at the fourth position.
Like the threekind() function (covered in last week’s Lesson), this function returns values other than TRUE and FALSE: TRUE (1) for a pair, 2 for two pair, and FALSE (0) for no match.
The main() function is updated to call and evaluate the pairs() function and evaluate its return value. I also added the final test, which returns the high-card value:
wprintf(L" - High card %s%lc\n",hand[x][a].face,hand[x][a].suit);
Click here to view the full code on GitHub.
Here’s a sample run:
Hand 1: 5♦ 5♠ 6♦ 9♦ 9♥ - Two Pairs
Hand 2: 2♠ 4♠ 6♠ 10♠ K♠ - Flush
Hand 3: 6♠ 7♣ 7♥ 9♥ J♦ - One Pair
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 wrap up the program. The original randomizer and sorter are restored as the code simulates drawing a poker hand and reporting its value.