Jump to content

  • Log In with Google      Sign In   
  • Create Account


Find poker combination in a set of cards


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 mudslinger   Members   -  Reputation: 139

Like
0Likes
Like

Posted 10 October 2012 - 07:48 AM

Hello,

I'm looking for an algorithm that finds the poker combinations (specifically straight, flush, full house, four of a kind, and straight flush) in a set of 13 cards. The most naive implementations is to check each element in a power set of the cards (hence 1287 possible combinations), but experience tells me there is always a better way.

thanks.

Sponsor:

#2 Brother Bob   Moderators   -  Reputation: 8053

Like
1Likes
Like

Posted 10 October 2012 - 08:08 AM

For such a limited set of rules as poker hands, I would not extract 5-card hands and search for winning hands but search for hands in the entire set of cards.

Sort the cards by face value and start with the most valuable hand and search for it:
  • Is there any sequence of 5 consecutive face values of the same suite?
  • Are there four cards of the same face value?
  • Are there three cards of one face value and two cards of another face value?
  • Are there five cards of the same suite?
  • ... and so on.
Sorting the cards by decreasing face value makes it easy to find sequences of identical (for a 4-of-a-kind) or consecutive (for a straight) values.

#3 clb   Members   -  Reputation: 1780

Like
0Likes
Like

Posted 10 October 2012 - 08:29 AM

Brother Bob's approach is the best and traditionally used one, also in the case when joker cards are present. Even though the logic needs to be carefully thought out, it will beat a naive "check all 5-subsets of 13 cards".
Me+PC=clb.demon.fi | C++ Math and Geometry library: MathGeoLib, test it live! | C++ Game Networking: kNet | 2D Bin Packing: RectangleBinPack | Use gcc/clang/emcc from VS: vs-tool | Resume+Portfolio | gfxapi, test it live!

#4 Glass_Knife   Moderators   -  Reputation: 4117

Like
0Likes
Like

Posted 10 October 2012 - 10:48 AM

Is this for open faced Chinese poker?
I think, therefore I am. I think? - "George Carlin"
Indie Game Programming

#5 Álvaro   Crossbones+   -  Reputation: 12950

Like
1Likes
Like

Posted 10 October 2012 - 08:45 PM

Brother Bob's idea is generally right, but there is a representation of the hand that allows for much faster code: Store each suit as a 13-bit integer, indicating which cards are present in the hand.

Since 2^13 = 8192 is a reasonably small number, you can aid the algorithm by using a few precomputed tables, with things like what is the highest bit set in a word, or what is the highest bit of a group of at least 5 consecutive bits (to detect straights).

The code would look something like this:
struct Hand {
  unsigned short suit[4];
  unsigned evaluate() const;
};
unsigned Hand::evaluate() const {
  // Straigth flush															
  unsigned highest_straight_flush = 0u;
  for (int i=0; i<4; ++i) {
    unsigned value = highest_card_of_straight_table[suit[i]];
    if (value > highest_straight_flush)
	  highest_straight_flush = value;
  }
  if (highest_straight_flush != 0u)
    return STRAIGHT_FLUSH | heighest_straight_flush;
  // 4 of a kind															   
  unsigned short all_suits = ~0u;
  for (int i=0; i<4; ++i)
    all_suits &= suit[i];
  if (all_suits != 0)
    return FOUR_OF_A_KIND | highest_card_table[all_suits];
  // ...																	   
}


#6 mudslinger   Members   -  Reputation: 139

Like
0Likes
Like

Posted 11 October 2012 - 11:53 AM

Is this for open faced Chinese poker?

No, it's for this: http://www.gamedev.n...ding-card-game/

I believe this is logically complete, but is still a bit naive:

straight
  look for cards with the same face value, keep only one of them in the temporary deck
  sort, look for cards with consecutive face values
  5+n consecutive cards = n+1 straights (so far)
  substitute cards in the straight with the same face value, add each to list

flush
  sort the cards by suite,
  5+n cards with the same suite = n+1 flushes

full house
  sort cards, look for cards that occur >= 3. if none, quit
  look for cards that occur in pairs.
  C(n1,3) . C(n2,2) for faces that occur >= 3.
  C(n,3) . pairs

4 of a kind
  sort cards, look for 4 same face values
  5th card any other card

straight flush
  use previously found straights and flushes, avoid duplicate combinations


I'm still looking at alvaro's code.

Edited by mudslinger, 11 October 2012 - 11:54 AM.


#7 Glass_Knife   Moderators   -  Reputation: 4117

Like
0Likes
Like

Posted 12 October 2012 - 07:05 AM

Have you looked at the ideas and algorithms at

http://www.codingthe...aluator-roundup

I have ported the two-plus-two evaluator for Java to do hand matchups,
and it worked very well, although the 128 Mb table was a little ridiculous.

Between the ideas already presented, and all the free code,
I'd say you're on your way!

Edited by Glass_Knife, 12 October 2012 - 07:07 AM.
bad grammer

I think, therefore I am. I think? - "George Carlin"
Indie Game Programming




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS