michael_hartman_cz

NTHU Introduction to Programming: Assignment 1

May 11th, 2015
523
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.11 KB | None | 0 0
  1. /* Michael Hartman, X1030035, NTHU, Spring 2015 */
  2.  
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5.  
  6. #define HAND_CARD_NUM 5
  7.  
  8. typedef struct Card
  9.  {
  10.     char suit;
  11.     unsigned short int rank;
  12.  } card;
  13.  
  14. /* comparator funciton for library qsort */
  15. int compareCards ( const void * c1, const void * c2 )
  16.  {
  17.     card a = *( const card * ) c1;
  18.     card b = *( const card * ) c2;
  19.    
  20.     if ( a . rank > b . rank )
  21.         return -1;
  22.     if ( a . rank < b . rank )
  23.         return 1;
  24.     if ( a . suit > b . suit )
  25.         return -1;
  26.     return 1;
  27.  }
  28.  
  29. /* convert human readable rank to number used by computer */
  30. unsigned short int rankCard ( char r )
  31.  {
  32.     if ( r >= '2' && r <= '9')
  33.         return r - '0';
  34.  
  35.     switch ( r )
  36.      {
  37.         case 'T': return 10;
  38.         case 'J': return 11;
  39.         case 'Q': return 12;
  40.         case 'K': return 13;
  41.         case 'A': return 14;
  42.         default: return 0;
  43.      }
  44.  }
  45.  
  46. int verifySuit ( char c )
  47.  {
  48.     if ( c == 'S' || c == 'D' || c == 'H' || c == 'C' )
  49.         return 0;
  50.     return 1;    
  51.  }
  52.  
  53. int readCard ( card * c )
  54.  {
  55.     char tmpSuit, tmpRank;
  56.     if ( scanf ( " %c%c", & tmpSuit, & tmpRank ) != 2 )
  57.         return 1; /* error: wrong input */
  58.  
  59.     if ( verifySuit ( tmpSuit ) )
  60.         return 2; /* error: wrong suit */
  61.        
  62.     c -> suit = tmpSuit;
  63.     if ( ! ( c -> rank = rankCard ( tmpRank ) ) )
  64.         return 3; /* error: wrong rank */
  65.     return 0; /* ok */
  66.  }
  67.  
  68. /* expecting sorted cards */
  69. int checkDuplicities ( card * h )
  70.  {    
  71.     int i;
  72.     for ( i = 1; i < HAND_CARD_NUM; ++ i )
  73.         if ( h[i] . suit == h[i-1] . suit && h[i] . rank == h[i-1] . rank )
  74.             return 4;
  75.     return 0;
  76.  }
  77.  
  78. void sortHand ( card * h )
  79.  {
  80.     qsort ( h, HAND_CARD_NUM, sizeof ( card ), compareCards );
  81.  }
  82.  
  83. /* reading user input */
  84. int readHand ( card * h )
  85.  {
  86.     int i, errCode;
  87.     for ( i = 0; i < HAND_CARD_NUM; ++ i )
  88.         if ( ( errCode = readCard ( & h[i] ) ) )
  89.             return errCode;
  90.     sortHand ( h );
  91.     if ( ( errCode = checkDuplicities ( h ) ) )
  92.         return errCode;
  93.     return 0;
  94.  }
  95.  
  96. int printError ( int errCode )
  97.  {
  98.     switch ( errCode )
  99.      {
  100.         case 1:
  101.             printf ( "Wrong input!\n" );
  102.             return 1;
  103.         case 2:
  104.             printf ( "Wrong suit!\n" );
  105.             return 2;
  106.         case 3:
  107.             printf ( "Wrong rank!\n" );
  108.             return 3;
  109.         case 4:
  110.             printf ( "Dupcities detected!\nAre you cheating??\n" );
  111.             return 4;
  112.         default:
  113.             printf ( "Unspecified error!\n" ); /* should never happen */
  114.             return -1;
  115.      }
  116.  }
  117.  
  118. int isFlush ( card * h )
  119.  {
  120.     int i;
  121.     for ( i = 1; i < HAND_CARD_NUM; ++ i )
  122.         if ( h[i] . suit != h[0] . suit )
  123.             return 0;
  124.     return 1;
  125.  }
  126.  
  127. int isStraight ( card * h )
  128.  {
  129.     int highest = h[0] . rank, i;
  130.     if ( highest < 6 ) /* lower straights are not possible */
  131.         return 0;
  132.  
  133.     for ( i = 0; i < HAND_CARD_NUM; ++ i )
  134.         if ( h[i] . rank != highest - i )
  135.             return 0;
  136.          
  137.     return 1;      
  138.  }
  139.  
  140. int isBomb ( card * h )
  141.  {  /* check middle three cards first and then if first or last card matches them */
  142.     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 );
  143.  }
  144.  
  145. int isFullHouse ( card * h )
  146.  {  /* check first and last pairs first and than if middle card matches first or second pair */
  147.     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 );
  148.  }
  149.  
  150. int isTriplet ( card * h )
  151.  {  /* check for first three cards, then middle three and last three */
  152.     return ( h[0] . rank == h[1] . rank && h[1] . rank == h[2] . rank ) ||
  153.            ( h[1] . rank == h[2] . rank && h[2] . rank == h[3] . rank ) ||
  154.            ( h[2] . rank == h[3] . rank && h[3] . rank == h[4] . rank );
  155.  }
  156.  
  157. int isTwoPairs ( card * h )
  158.  { /* simply check if there are two pairs present */
  159.     return ( h[0] . rank == h[1] . rank && h[2] . rank == h[3] . rank ) ||
  160.            ( h[0] . rank == h[1] . rank && h[3] . rank == h[4] . rank ) ||
  161.            ( h[1] . rank == h[2] . rank && h[3] . rank == h[4] . rank );
  162.  }
  163.  
  164. int isPair ( card * h )
  165.  { /* check if there is at least one pair */
  166.     return ( h[0] . rank == h[1] . rank ) ||
  167.            ( h[1] . rank == h[2] . rank ) ||
  168.            ( h[2] . rank == h[3] . rank ) ||
  169.            ( h[3] . rank == h[4] . rank );
  170.  }
  171.  
  172. void printSuit ( card c )
  173.  {
  174.     printf ( "%c", c . suit );
  175.  }
  176.  
  177. /* print cards rank in human readable form */
  178. void printRank ( card c )
  179.  {
  180.     if ( c . rank > 1 && c . rank < 11 )
  181.         printf ( "%d", c . rank );
  182.     switch ( c . rank )
  183.      {
  184.       case 11:
  185.         printf ( "J" );
  186.         break;
  187.       case 12:
  188.         printf ( "Q" );
  189.         break;
  190.       case 13:
  191.         printf ( "K" );
  192.         break;
  193.       case 14:
  194.         printf ( "A" );
  195.         break;
  196.      }
  197.  }
  198.  
  199. void printCard ( card c )
  200.  {
  201.     printSuit ( c );
  202.     printRank ( c );
  203.  }
  204.  
  205. /* print whole hand in ascending order */
  206. void printAscending ( card * h )
  207.  {
  208.     int i;
  209.     for ( i = HAND_CARD_NUM - 1; i >= 0; -- i )
  210.      {
  211.         printCard ( h[i] );
  212.         if ( i )
  213.             printf ( " " );
  214.         else
  215.             printf ( "\n" );
  216.      }
  217.  }
  218.  
  219. /* print cards in hand in given order */
  220. void printHand ( card a, card b, card c , card d, card e )
  221.  {
  222.     printCard ( a );
  223.     printf ( " " );
  224.     printCard ( b );
  225.     printf ( " " );
  226.     printCard ( c );
  227.     printf ( " " );
  228.     printCard ( d );
  229.     printf ( " " );
  230.     printCard ( e );
  231.     printf ( "\n" );
  232.  }
  233.  
  234. void printStraightFlush ( card * h )
  235.  {
  236.     printCard ( h[0] );
  237.     printf ( "-straight flush\n" );
  238.     printAscending ( h );
  239.  }
  240.  
  241. void printBomb ( card * h )
  242.  {
  243.     printRank ( h[2] );
  244.     printf ( "-four of a kind\n" );
  245.     if ( h[0] . rank != h[1] . rank )
  246.         printHand ( h[0], h[4], h[3], h[2], h[1] );
  247.     else
  248.         printAscending ( h );
  249.  }
  250.  
  251. void printFullHouse ( card * h )
  252.  {
  253.     printRank ( h[2] );
  254.     printf ( "-full house\n" );
  255.     if ( h[1] . rank != h[2] . rank )
  256.         printHand ( h[1], h[0], h[4], h[3], h[2] );
  257.     else
  258.         printAscending ( h );
  259.  }
  260.  
  261. void printFlush ( card * h )
  262.  {
  263.     printCard ( h[0] );
  264.     printf ( "-flush\n" );
  265.     printAscending ( h );
  266.  }
  267.  
  268. void printStraight ( card * h )
  269.  {
  270.     printCard ( h[0] );
  271.     printf ( "-straight\n" );
  272.     printAscending ( h );
  273.  }
  274.  
  275. void printTriplet ( card * h )
  276.  {
  277.     printRank ( h[2] );
  278.     printf ( "-three of a kind\n" );
  279.     if ( h[0] . rank == h[1] . rank && h[1] . rank == h[2] . rank )
  280.         printAscending ( h );
  281.     else if ( h[1] . rank == h[2] . rank && h[2] . rank == h[3] . rank )
  282.         printHand ( h[4], h[0], h[3], h[2], h[1] );
  283.     else
  284.         printHand ( h[1], h[0], h[4], h[3], h[2] );
  285.  }
  286.  
  287. void printTwoPairs ( card * h )
  288.  {
  289.     if ( h[0] . rank == h[1] . rank && h[2] . rank == h[3] . rank )
  290.      {
  291.         printCard ( h[0] );
  292.         printf ( "-two pairs\n" );
  293.         printAscending ( h );
  294.      }
  295.     else if ( h[0] . rank == h[1] . rank && h[3] . rank == h[4] . rank )
  296.      {
  297.         printCard ( h[0] );
  298.         printf ( "-two pairs\n" );
  299.         printHand ( h[2], h[4], h[3], h[1], h[0] );    
  300.      }
  301.     else
  302.      {
  303.         printCard ( h[1] );
  304.         printf ( "-two pairs\n" );
  305.         printHand ( h[0], h[4], h[3], h[2], h[1] );
  306.      }
  307.  }
  308.  
  309. void printPair ( card * h )
  310.  {
  311.     if ( h[0] . rank == h[1] . rank )
  312.      {
  313.         printCard ( h[0] );
  314.         printf ( "-pair\n" );
  315.         printAscending ( h );
  316.      }
  317.     else if ( h[1] . rank == h[2] . rank )
  318.      {
  319.         printCard ( h[1] );
  320.         printf ( "-pair\n" );
  321.         printHand ( h[4], h[3], h[0], h[2], h[1] );
  322.      }
  323.     else if ( h[2] . rank == h[3] . rank )
  324.      {
  325.         printCard ( h[2] );
  326.         printf ( "-pair\n" );
  327.         printHand ( h[4], h[1], h[0], h[3], h[2] );
  328.      }
  329.     else
  330.      {
  331.         printCard ( h[3] );
  332.         printf ( "-pair\n" );
  333.         printHand ( h[2], h[1], h[0], h[4], h[3] );
  334.      }
  335.  }
  336.  
  337. void printHighCard ( card * h )
  338.  {
  339.     printCard ( h[0] );
  340.     printf ( "-high card\n" );
  341.     printAscending ( h );
  342.  }
  343.  
  344. /* check for highest card combination and call corresponding print function */
  345. void evaulateHand ( card * h )
  346.  {
  347.     if ( isStraight ( h ) && isFlush ( h ) )
  348.         printStraightFlush ( h );
  349.     else if ( isBomb ( h ) )
  350.         printBomb ( h );
  351.     else if ( isFullHouse ( h ) )
  352.         printFullHouse ( h );
  353.     else if ( isFlush ( h ) )
  354.         printFlush ( h );
  355.     else if ( isStraight ( h ) )
  356.         printStraight ( h );
  357.     else if ( isTriplet ( h ) )
  358.         printTriplet ( h );
  359.     else if ( isTwoPairs ( h ) )
  360.         printTwoPairs ( h );
  361.     else if ( isPair ( h ) )
  362.         printPair ( h );
  363.     else
  364.         printHighCard ( h );
  365.  }
  366.  
  367. int main ( int argc, char ** argv )
  368.  {  
  369.     int errCode;
  370.     card hand[HAND_CARD_NUM];
  371.  
  372.     if ( ( errCode = readHand ( hand ) ) )
  373.         return printError ( errCode );
  374.    
  375.     evaulateHand ( hand );
  376.     return 0;
  377.  }
Advertisement
Add Comment
Please, Sign In to add comment