home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / GAMES / BLACKJAC.ARC / BJ1.C < prev    next >
Text File  |  1988-08-07  |  8KB  |  262 lines

  1. /*------------------------------------------------------------------------*/
  2. /* Subroutines for Blackjack. 
  3.  
  4.   function prototypes. */
  5. /*------------------------------------------------------------------------*/
  6. extern void copy_bytes (char *, int, int);     /* (from, to, count)       */
  7. extern void draw_border (int, int, int, int);  /* (x, y, width, height)   */
  8. extern void show_card (int, int, int);         /* (card, x, y)            */
  9. extern void erase_card (int, int);             /* (x, y)                  */
  10. extern void put_string (int, int, char *);     /* (x, y, string)          */
  11. extern char one_deal (void);                   /* one deal and bet.       */
  12. extern int  draw_card (void);                  /* select a card from pack */
  13. extern int  random (int, int);                 /* (nin, max)              */
  14.  
  15. void   delay (int);                            /* time delay              */
  16. int    get_score (int);                        /* compute score of hand.  */
  17. char   get_reply (char *);                     /* get reply from user.    */
  18. void   dollars (long, int, char *);            /* decode dollar values.   */
  19. void   play_game (char, char);                 /* play one game.          */
  20. /*------------------------------------------------------------------------*/
  21.  
  22. /* includes */
  23.  
  24. #include <stdio.h>
  25. #include <conio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <cpm.h>
  29. #include <ctype.h>
  30.  
  31. /* defines */
  32.  
  33. #define DRAWN 7
  34. #define AVAIL 0
  35. #define BACK  54
  36.  
  37.  
  38. /* Global Variables */
  39. /*--------------------------------------------------------------------------*/
  40. extern char deck   [53];      /* deck of 52 cards 1 - 52                    */
  41. extern char hands  [2] [11];  /* two hands with a maximum of 11 cards each. */
  42. extern int  scores [2];       /* total scores for player and banker.        */
  43. extern int  cards  [2];       /* number of cards in hands.                  */
  44. extern int  dealt;            /* number of cards taken from pack.           */
  45. extern long max_bet;          /* maximum bet.                               */
  46. extern long min_bet;          /* minimum bet.                               */
  47. extern long bank;             /* Bank funds.                                */
  48. extern long funds;            /* players funds.                             */
  49. extern char message [80];     /* message to user.                           */
  50. extern char bankt   [12];     /* decoded number.                            */
  51. extern char fundt   [12];     /* decoded number.                            */
  52. extern char bett    [12];     /* decoded number.                            */
  53. extern char mint    [12];     /* decoded number.                            */
  54. extern char maxt    [12];     /* decoded number.                            */
  55. /*--------------------------------------------------------------------------*/
  56. char get_reply (list)                          /* get reply from user.    */
  57. char *list;
  58. {
  59.     char j;
  60.     int  k;
  61.  
  62.     for (;;)
  63.     {
  64.         k = rand ();                
  65.         j = bdos (CPMDCIO, 255);     
  66.         if (j != '\n')
  67.         {
  68.             if ((j >= 'a') && (j <= 'z')) j = toupper (j);
  69.             for (k = 0; k < strlen(list); k++)
  70.             {
  71.                 if (j == list [k]) return j;
  72.             }
  73.         }
  74.     }
  75. }
  76. /*--------------------------------------------------------------------------*/
  77.  
  78. void dollars (number, size, line)
  79. long number;
  80. int  size;
  81. char *line;
  82. {
  83.     int j, k, n;
  84.     char text [20];
  85.  
  86.     sprintf (text, "%ld", number);
  87.  
  88.     k = size;
  89.     n = 0;
  90.     j = strlen (text);
  91.     line [k--] = text [j];
  92.     
  93.     for (j--; j >= 0; j--)
  94.     {
  95.         line [k--] = text [j];
  96.         n++;
  97.         if (((n % 3) == 0) && (j > 0))
  98.         {
  99.             line [k--] = ',';
  100.         }     
  101.     }
  102.     
  103.     line [k--] = ' ';
  104.     line [k--] = '$';
  105.  
  106.     while (k >= 0)
  107.     {
  108.         line [k--] = ' ';
  109.     }
  110.     
  111.     return;
  112. }
  113.  
  114. /*--------------------------------------------------------------------------*/
  115.  
  116. int  get_score (no)                             /* compute score of hand.  */
  117. int no;
  118. {
  119.     int j, k, aces;
  120.     int score;           /* total card value */
  121.     int values [11];     /* card value       */
  122.  
  123.     score = 0;
  124.     aces  = 0;
  125.     for (j = 0; j < cards [no]; j++)
  126.     {
  127.         k = hands [no] [j];
  128.         k %= 13;
  129.         if (k == 0) k = 13;
  130.         values [j] = k;
  131.         if (k == 1) 
  132.         {
  133.             values [j] = 11;
  134.             aces++;
  135.         }
  136.         if (k > 10) values [j] = 10;
  137.         score += values [j];
  138.     }
  139.  
  140.     while ((score > 21) && (aces > 0))
  141.     {
  142.         score -= 10;
  143.         aces--;
  144.     }
  145.  
  146.     k = cards [no];
  147.  
  148.     if (score > 21) score = 26;                /* Bust       */
  149.     if ((k == 2) && (score == 21)) score = 22; /* Blackjack  */
  150.     if ((k == 5) && (score < 22))  score = 23; /* Five Under */
  151.     if ((k == 6) && (score < 22))  score = 24; /* Six  Under */
  152.     if ((k == 3) && (values [0] == 7) && (values [1] == 7) &&
  153.                     (values [2] == 7)) score = 25; 
  154.     return score;
  155.  
  156. }
  157. /*--------------------------------------------------------------------------*/
  158. void delay (delay_time)
  159. int delay_time;
  160. {
  161.     int j, k;
  162.  
  163.     for (j = 0; j <= delay_time; j++)
  164.     {
  165.         for (k = 0; k < 500; k++);
  166.     }
  167. }
  168. /*--------------------------------------------------------------------------*/
  169. void play_game (location, wealth)
  170. char location, wealth;
  171. {
  172.  
  173.     char  command;         /* command from player. */
  174.     int j;
  175.  
  176.     switch (location)
  177.     {
  178.         case '1': bank = 1000000;
  179.                   min_bet = 10;
  180.                   max_bet = 10000;
  181.                   switch (wealth)
  182.                   {
  183.                       case '1': funds = 10000;
  184.                       break;
  185.  
  186.                       case '2': funds = 1000;
  187.                       break;
  188.  
  189.                       case '3': funds = 10;
  190.                       break;
  191.                   } 
  192.                   break;
  193.  
  194.         case '2': bank = 100000;
  195.                   min_bet = 5;
  196.                   max_bet = 1000;
  197.                   switch (wealth)
  198.                   {
  199.                       case '1': funds = 1000;
  200.                       break;
  201.  
  202.                       case '2': funds = 100;
  203.                       break;
  204.  
  205.                       case '3': funds = 10;
  206.                       break;
  207.                   } 
  208.                   break;
  209.  
  210.         case '3': bank = 1000;
  211.                   min_bet = 1;
  212.                   max_bet = 50;
  213.                   switch (wealth)
  214.                   {
  215.                       case '1': funds = 200;
  216.                       break;
  217.  
  218.                       case '2': funds = 100;
  219.                       break;
  220.  
  221.                       case '3': funds = 10;
  222.                       break;
  223.                   } 
  224.                   break;
  225.     }
  226.  
  227.     for (j = 0; j <= 52; j++) deck [j] = AVAIL; /* all cards available. */
  228.     cards [0] = 0;
  229.     cards [1] = 0;
  230.     dealt     = 0;
  231.  
  232.     goto_xy (3, 13);
  233.     draw_border (0,  0, 80, 24); /* draw a border on the screen. */
  234.     draw_border (2,  8, 76,  8);  /* draw a border on the screen. */
  235.  
  236. /* Start of game */
  237.  
  238.     command = '0';
  239.     while (command != 'A')
  240.     {
  241.         command = one_deal ();
  242.  
  243.         if (funds <= 0)
  244.         {
  245.              put_string (3, 14, "Sorry, but you have run out of funds.");
  246.              funds = 0;
  247.              delay (100);
  248.        }
  249.        if (bank <= 0)
  250.        {
  251.             put_string (3, 14, "Congratulations you have broken the bank.");
  252.             bank = 0;
  253.             delay (100);
  254.        }
  255.  
  256.        cards [0] = 0;
  257.        cards [1] = 0;
  258.     }
  259.     return;
  260.  
  261. }
  262.