Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Michael Hartman, X1030035, NTHU, Spring 2015 */
- #include <stdlib.h>
- #include <stdio.h>
- #define HAND_CARD_NUM 5
- typedef struct Card
- {
- char suit;
- unsigned short int rank;
- } card;
- /* comparator funciton for library qsort */
- int compareCards ( const void * c1, const void * c2 )
- {
- card a = *( const card * ) c1;
- card b = *( const card * ) c2;
- if ( a . rank > b . rank )
- return -1;
- if ( a . rank < b . rank )
- return 1;
- if ( a . suit > b . suit )
- return -1;
- return 1;
- }
- /* convert human readable rank to number used by computer */
- unsigned short int rankCard ( char r )
- {
- if ( r >= '2' && r <= '9')
- return r - '0';
- switch ( r )
- {
- case 'T': return 10;
- case 'J': return 11;
- case 'Q': return 12;
- case 'K': return 13;
- case 'A': return 14;
- default: return 0;
- }
- }
- int verifySuit ( char c )
- {
- if ( c == 'S' || c == 'D' || c == 'H' || c == 'C' )
- return 0;
- return 1;
- }
- int readCard ( card * c )
- {
- char tmpSuit, tmpRank;
- if ( scanf ( " %c%c", & tmpSuit, & tmpRank ) != 2 )
- return 1; /* error: wrong input */
- if ( verifySuit ( tmpSuit ) )
- return 2; /* error: wrong suit */
- c -> suit = tmpSuit;
- if ( ! ( c -> rank = rankCard ( tmpRank ) ) )
- return 3; /* error: wrong rank */
- return 0; /* ok */
- }
- /* expecting sorted cards */
- int checkDuplicities ( card * h )
- {
- int i;
- for ( i = 1; i < HAND_CARD_NUM; ++ i )
- if ( h[i] . suit == h[i-1] . suit && h[i] . rank == h[i-1] . rank )
- return 4;
- return 0;
- }
- void sortHand ( card * h )
- {
- qsort ( h, HAND_CARD_NUM, sizeof ( card ), compareCards );
- }
- /* reading user input */
- int readHand ( card * h )
- {
- int i, errCode;
- for ( i = 0; i < HAND_CARD_NUM; ++ i )
- if ( ( errCode = readCard ( & h[i] ) ) )
- return errCode;
- sortHand ( h );
- if ( ( errCode = checkDuplicities ( h ) ) )
- return errCode;
- return 0;
- }
- int printError ( int errCode )
- {
- switch ( errCode )
- {
- case 1:
- printf ( "Wrong input!\n" );
- return 1;
- case 2:
- printf ( "Wrong suit!\n" );
- return 2;
- case 3:
- printf ( "Wrong rank!\n" );
- return 3;
- case 4:
- printf ( "Dupcities detected!\nAre you cheating??\n" );
- return 4;
- default:
- printf ( "Unspecified error!\n" ); /* should never happen */
- return -1;
- }
- }
- int isFlush ( card * h )
- {
- int i;
- for ( i = 1; i < HAND_CARD_NUM; ++ i )
- if ( h[i] . suit != h[0] . suit )
- return 0;
- return 1;
- }
- int isStraight ( card * h )
- {
- int highest = h[0] . rank, i;
- if ( highest < 6 ) /* lower straights are not possible */
- return 0;
- for ( i = 0; i < HAND_CARD_NUM; ++ i )
- if ( h[i] . rank != highest - i )
- return 0;
- return 1;
- }
- int isBomb ( card * h )
- { /* check middle three cards first and then if first or last card matches them */
- return ( h[1] . rank == h[2] . rank && h[2] . rank == h[3] . rank ) && ( h[0] . rank == h[1] . rank || h[4] . rank == h[1] . rank );
- }
- int isFullHouse ( card * h )
- { /* check first and last pairs first and than if middle card matches first or second pair */
- return ( h[0] . rank == h[1] . rank && h[3] . rank == h[4] . rank ) && ( h[2] . rank == h[1] . rank || h[2] . rank == h[3] . rank );
- }
- int isTriplet ( card * h )
- { /* check for first three cards, then middle three and last three */
- return ( h[0] . rank == h[1] . rank && h[1] . rank == h[2] . rank ) ||
- ( h[1] . rank == h[2] . rank && h[2] . rank == h[3] . rank ) ||
- ( h[2] . rank == h[3] . rank && h[3] . rank == h[4] . rank );
- }
- int isTwoPairs ( card * h )
- { /* simply check if there are two pairs present */
- return ( h[0] . rank == h[1] . rank && h[2] . rank == h[3] . rank ) ||
- ( h[0] . rank == h[1] . rank && h[3] . rank == h[4] . rank ) ||
- ( h[1] . rank == h[2] . rank && h[3] . rank == h[4] . rank );
- }
- int isPair ( card * h )
- { /* check if there is at least one pair */
- return ( h[0] . rank == h[1] . rank ) ||
- ( h[1] . rank == h[2] . rank ) ||
- ( h[2] . rank == h[3] . rank ) ||
- ( h[3] . rank == h[4] . rank );
- }
- void printSuit ( card c )
- {
- printf ( "%c", c . suit );
- }
- /* print cards rank in human readable form */
- void printRank ( card c )
- {
- if ( c . rank > 1 && c . rank < 11 )
- printf ( "%d", c . rank );
- switch ( c . rank )
- {
- case 11:
- printf ( "J" );
- break;
- case 12:
- printf ( "Q" );
- break;
- case 13:
- printf ( "K" );
- break;
- case 14:
- printf ( "A" );
- break;
- }
- }
- void printCard ( card c )
- {
- printSuit ( c );
- printRank ( c );
- }
- /* print whole hand in ascending order */
- void printAscending ( card * h )
- {
- int i;
- for ( i = HAND_CARD_NUM - 1; i >= 0; -- i )
- {
- printCard ( h[i] );
- if ( i )
- printf ( " " );
- else
- printf ( "\n" );
- }
- }
- /* print cards in hand in given order */
- void printHand ( card a, card b, card c , card d, card e )
- {
- printCard ( a );
- printf ( " " );
- printCard ( b );
- printf ( " " );
- printCard ( c );
- printf ( " " );
- printCard ( d );
- printf ( " " );
- printCard ( e );
- printf ( "\n" );
- }
- void printStraightFlush ( card * h )
- {
- printCard ( h[0] );
- printf ( "-straight flush\n" );
- printAscending ( h );
- }
- void printBomb ( card * h )
- {
- printRank ( h[2] );
- printf ( "-four of a kind\n" );
- if ( h[0] . rank != h[1] . rank )
- printHand ( h[0], h[4], h[3], h[2], h[1] );
- else
- printAscending ( h );
- }
- void printFullHouse ( card * h )
- {
- printRank ( h[2] );
- printf ( "-full house\n" );
- if ( h[1] . rank != h[2] . rank )
- printHand ( h[1], h[0], h[4], h[3], h[2] );
- else
- printAscending ( h );
- }
- void printFlush ( card * h )
- {
- printCard ( h[0] );
- printf ( "-flush\n" );
- printAscending ( h );
- }
- void printStraight ( card * h )
- {
- printCard ( h[0] );
- printf ( "-straight\n" );
- printAscending ( h );
- }
- void printTriplet ( card * h )
- {
- printRank ( h[2] );
- printf ( "-three of a kind\n" );
- if ( h[0] . rank == h[1] . rank && h[1] . rank == h[2] . rank )
- printAscending ( h );
- else if ( h[1] . rank == h[2] . rank && h[2] . rank == h[3] . rank )
- printHand ( h[4], h[0], h[3], h[2], h[1] );
- else
- printHand ( h[1], h[0], h[4], h[3], h[2] );
- }
- void printTwoPairs ( card * h )
- {
- if ( h[0] . rank == h[1] . rank && h[2] . rank == h[3] . rank )
- {
- printCard ( h[0] );
- printf ( "-two pairs\n" );
- printAscending ( h );
- }
- else if ( h[0] . rank == h[1] . rank && h[3] . rank == h[4] . rank )
- {
- printCard ( h[0] );
- printf ( "-two pairs\n" );
- printHand ( h[2], h[4], h[3], h[1], h[0] );
- }
- else
- {
- printCard ( h[1] );
- printf ( "-two pairs\n" );
- printHand ( h[0], h[4], h[3], h[2], h[1] );
- }
- }
- void printPair ( card * h )
- {
- if ( h[0] . rank == h[1] . rank )
- {
- printCard ( h[0] );
- printf ( "-pair\n" );
- printAscending ( h );
- }
- else if ( h[1] . rank == h[2] . rank )
- {
- printCard ( h[1] );
- printf ( "-pair\n" );
- printHand ( h[4], h[3], h[0], h[2], h[1] );
- }
- else if ( h[2] . rank == h[3] . rank )
- {
- printCard ( h[2] );
- printf ( "-pair\n" );
- printHand ( h[4], h[1], h[0], h[3], h[2] );
- }
- else
- {
- printCard ( h[3] );
- printf ( "-pair\n" );
- printHand ( h[2], h[1], h[0], h[4], h[3] );
- }
- }
- void printHighCard ( card * h )
- {
- printCard ( h[0] );
- printf ( "-high card\n" );
- printAscending ( h );
- }
- /* check for highest card combination and call corresponding print function */
- void evaulateHand ( card * h )
- {
- if ( isStraight ( h ) && isFlush ( h ) )
- printStraightFlush ( h );
- else if ( isBomb ( h ) )
- printBomb ( h );
- else if ( isFullHouse ( h ) )
- printFullHouse ( h );
- else if ( isFlush ( h ) )
- printFlush ( h );
- else if ( isStraight ( h ) )
- printStraight ( h );
- else if ( isTriplet ( h ) )
- printTriplet ( h );
- else if ( isTwoPairs ( h ) )
- printTwoPairs ( h );
- else if ( isPair ( h ) )
- printPair ( h );
- else
- printHighCard ( h );
- }
- int main ( int argc, char ** argv )
- {
- int errCode;
- card hand[HAND_CARD_NUM];
- if ( ( errCode = readHand ( hand ) ) )
- return printError ( errCode );
- evaulateHand ( hand );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment