I made a small poker program with C but I believe I could've written it better.
Full source on bitbucket.org
int checkhand (struct Card_s * hand)
{
assert (hand) ;
//struct Card_s *suithand = sorthand(hand, true); // Unnecessary
struct Card_s *sorted = sorthand(hand, false);
/* check for flushes */
{
bool flushsuit = false;
int suits[4] = { [0 ... 3] = 0 };
for (int i = 0; i < MAXHAND; ++i)
{
switch (hand[i].nSuit)
{
case spades: suits[0]++; break;
case clubs: suits[1]++; break;
case hearts: suits[2]++; break;
case diamonds: suits[3]++; break;
}
}
for ( int f = 0 ; f < 4 ; ++f )
{
if (suits[f] == 5) { flushsuit = true ; } /* found a flush */
}
if ( flushsuit )
{
if ( sorted[0].nType == (sorted[1].nType-1) && sorted[1].nType == (sorted[2].nType-1) && sorted[2].nType == (sorted[3].nType-1) && sorted[3].nType == (sorted[4].nType-1) )
{
if ( sorted[4].nType == ace ) return 10; /* found royal flush */
else return 9; /* found straight flush */
}
return 6; /* it was a normal flush */
}
}
/* check for 4 of a kind */
{
int type [MAXTYPES ] = { [0 ... 12] = 0 }, *types ;
types = count_types( sorted, type ) ;
for ( int f = 0 ; f < MAXTYPES ; ++f )
{
if ( types[f] == 4 ) { return 8 ; } /* found 4 same types in a row */
}
}
/* check for full house */
{
bool threeKind = false, Twopair = false ;
int type[ MAXTYPES ] = { [0 ... 12] = 0 }, *types ;
types = count_types( sorted, type ) ;
for ( int f = 0 ; f < MAXTYPES ; ++f )
{
if ( types[f] == 3 ) { threeKind = true ; } /* found three of a kind */
}
int pair[MAXTYPES] = { [0 ... 12] = 0 }, *pairs ;
pairs = count_types( sorted, pair );
for ( int f = 0 ; f < MAXTYPES ; ++f )
{
if ( pairs[f] == 2 ) { Twopair = true ; } /* found normal pair */
}
if ( threeKind && Twopair ) return 7; /* found full house */
}
if ( sorted[0].nType == (sorted[1].nType-1) && sorted[1].nType == (sorted[2].nType-1) && sorted[2].nType == (sorted[3].nType-1) && sorted[3].nType == (sorted[4].nType-1) )
{
return 5; /* found straight */
}
/* check for three of a kind */
{
int type[ MAXTYPES ] = { [0 ... 12] = 0 }, *types ;
types = count_types( sorted, type ) ;
for ( int f = 0 ; f < MAXTYPES ; ++f )
{
if ( types[f] == 3 ) { return 4 ; } /* found three of a kind */
}
}
/* check for two pair */
{
int type[MAXTYPES] = { [0 ... 12] = 0 }, *types ;
types = count_types( sorted, type );
int isTwoPair = 0 ;
for ( int f = 0 ; f < MAXTYPES ; ++f )
{
if (types[f] == 2) isTwoPair++;
if (isTwoPair == 2) { return 3 ; } /* found two pair */
}
}
/* check for normal pair */
{
int type[MAXTYPES] = { [0 ... 12] = 0 }, *types ;
types = count_types( sorted, type ) ;
for ( int f = 0 ; f < MAXTYPES ; ++f )
{
if ( types[f] == 2 ) { return 2; } /* found normal pair */
}
}
return 1 ; /* player only has a high card value */
}