home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume6 / bandit / bandit.c next >
C/C++ Source or Header  |  1989-03-15  |  19KB  |  681 lines

  1. /*
  2.  *   One-Armed Bandit, v 1.01, by Pete Granger   (December 13, 1988)
  3.  *
  4.  * Abstract:
  5.  *
  6.  *   This is a slot machine simulation which uses curses routines. The
  7.  *  setup and payoffs are described in comments below, and the means of
  8.  *  play can be read in the print_instructions() routine.
  9.  *
  10.  * Notes:
  11.  *
  12.  *  This program has been compiled and run on a VAX running Ultrix 3.0,
  13.  *  and on a Sun-3, Sun-4, and Sun-386i. It will compile on an IBM
  14.  *  AT-compatible, but there are problems with the stty and curses
  15.  *  commands. Fixes for the AT are forthcoming at an undetermined date.
  16.  *
  17.  *  If your machine does not have the random() and srandom() functions,
  18.  *  then set the value of RANDOM to 0, prior to compiling, and rand() and
  19.  *  srand() will be used instead.
  20.  *
  21.  *  In order to compile, the -lcurses and -ltermcap options must be
  22.  *  used.
  23.  *
  24.  * Release:
  25.  *
  26.  *  This program is released to the public domain via usenet on February
  27.  *  15th, 1989. You may redistribute freely, on the condition that no
  28.  *  attempt is made to earn a profit for distributing this software. You
  29.  *  may change the code as necessary to fit the system on which you wish
  30.  *  to run it. The author bears no responsibility for the use or misuse
  31.  *  of this game, or any damages caused thereby.
  32.  *
  33.  * Revision History:
  34.  *
  35.  *  1.0   12/09/88   Pete Granger
  36.  *  First release for public use. Incorporates all basic functions.
  37.  *
  38.  *  1.01  12/13/88   Pete Granger
  39.  *  Added the "refresh" option in play_game().
  40.  *
  41.  */
  42.  
  43. /*
  44.    This is the configuration and payoff chart for a fair but profitable
  45.    slot machine. It has a 9.54% chance of paying off on each play, and
  46.    (on one-dollar bets) will pay back an average of 91.47% of all bets.
  47.  
  48.          Wheel 1     Wheel 2     Wheel 3
  49.           -----       -----       -----
  50.     Bars    1           1           1
  51.    Bells    2           1           1
  52.  Oranges    1           5           1
  53.   Lemons    3           1           4
  54.    Plums    3           2           3
  55. Cherries    4           4           4
  56.  
  57.  
  58.    Combination     Pays   Frequency   Total Payoff
  59.       -----        ----     -----         -----
  60.       Bar * 3      1000        1          1000
  61.      Bell * 3       100        2           200
  62.    Orange * 3        50        5           250
  63.     Lemon * 3        20       12           240
  64.      Plum * 3        10       18           180
  65.    Cherry * 3         5       64           320
  66. Cherry * 2 + Any      2      160           320
  67.                             _____         _____
  68.                               262         2510
  69.                                           (234 profit)
  70. */
  71.  
  72. #include <stdio.h>
  73. #include <curses.h>
  74.  
  75. #define RANDOM 1
  76.  
  77. typedef unsigned char   u_8;
  78. typedef char            s_8;
  79. typedef unsigned short u_16;
  80. typedef short          s_16;
  81. typedef unsigned long  u_32;
  82. typedef long           s_32;
  83.  
  84. #define NUMSYMS    6
  85. #define NAMELEN    8
  86. #define ON_WHEEL  14
  87. #define MIN_ROW    0
  88. #define MAX_ROW   23
  89. #define MIN_COL    0
  90. #define MAX_COL   78
  91.    
  92. #define BAR    0
  93. #define BELL   1
  94. #define ORANGE 2
  95. #define LEMON  3
  96. #define PLUM   4
  97. #define CHERRY 5
  98.  
  99. #define BAR3      000
  100. #define BELL3     111
  101. #define ORANGE3   222
  102. #define LEMON3    333
  103. #define PLUM3     444
  104. #define CHERRY3   555
  105. #define W_BAR     550
  106. #define W_BELL    551
  107. #define W_ORANGE  552
  108. #define W_LEMON   553
  109. #define W_PLUM    554
  110.  
  111. #define PAY_BAR     1000
  112. #define PAY_BELL     100
  113. #define PAY_ORANGE    50
  114. #define PAY_LEMON     20
  115. #define PAY_PLUM      10
  116. #define PAY_CHERRY     5
  117. #define PAY_WILD       2
  118. #define BUST           0
  119.  
  120. #define START_MONEY 100
  121.  
  122. typedef int wheel[ON_WHEEL];
  123.  
  124. static wheel w1 = {BAR, PLUM, CHERRY, BELL, LEMON, PLUM, CHERRY,
  125.                    ORANGE, LEMON, PLUM, CHERRY, BELL, LEMON, CHERRY};
  126.  
  127. static wheel w2 = {ORANGE, BAR, CHERRY, ORANGE, PLUM, ORANGE, CHERRY,
  128.                    BELL, ORANGE, CHERRY, PLUM, LEMON, ORANGE, CHERRY};
  129.  
  130. static wheel w3 = {BELL, LEMON, CHERRY, ORANGE, PLUM, LEMON, CHERRY,
  131.                    BAR, PLUM, CHERRY, LEMON, PLUM, LEMON, CHERRY};
  132.  
  133. static char symnames[NUMSYMS][NAMELEN+1] = {" *BAR*  ", "  BELL  ",
  134.                                             " ORANGE ", " LEMON  ",
  135.                                             "  PLUM  ", " CHERRY " };
  136.  
  137. static char winflash[6][35] = { "*    * *** *   * *   * **** **** *",
  138.                                 "*    *  *  **  * **  * *    *  * *",
  139.                                 "* ** *  *  * * * * * * ***  **** *",
  140.                                 "**  **  *  *  ** *  ** *    * *   ",
  141.                                 "*    * *** *   * *   * **** *  * *",
  142.                                 "                                  " };
  143.  
  144. #define W1ROW  10
  145. #define W1COL   5
  146. #define W2ROW  10
  147. #define W2COL  17
  148. #define W3ROW  10
  149. #define W3COL  29
  150.  
  151. #define ODDS_R      6
  152. #define ODDS_C     43
  153. #define QUERY_R    19
  154. #define QUERY_C     6
  155. #define INVALID_R  18
  156. #define INVALID_C   6
  157. #define PAY_R      14
  158. #define PAY_C       6
  159. #define TOTAL_R    15
  160. #define TOTAL_C     6
  161.  
  162.  
  163. #define do_wheel1(W1)  {                            \
  164.                          move(W1ROW,W1COL);         \
  165.                          addstr(symnames[w1[W1]]);  \
  166.                          refresh();                 \
  167.                        }
  168.  
  169. #define do_wheel2(W2)  {                            \
  170.                          move(W2ROW,W2COL);         \
  171.                          addstr(symnames[w2[W2]]);  \
  172.                          refresh();                 \
  173.                        }
  174.  
  175. #define do_wheel3(W3)  {                            \
  176.                          move(W3ROW,W3COL);         \
  177.                          addstr(symnames[w3[W3]]);  \
  178.                          refresh();                 \
  179.                        }
  180.  
  181. #define str_out(R,C)   {                     \
  182.                          move((R),(C));      \
  183.                          addstr(outbuf);     \
  184.                          refresh();          \
  185.                        }
  186.  
  187. #define MIN(A,B) (((A)<(B)) ? (A) : (B))
  188.  
  189. char replybuf[80];
  190. char outbuf[80];
  191.  
  192. /*
  193.  *  Initialize the random number generator.
  194.  */
  195.  
  196. void init_rand()
  197. {
  198.   u_32 z;
  199.  
  200.   z = time();
  201. #if RANDOM
  202.   srandom(z);
  203. #else
  204.   srand(z);
  205. #endif
  206. }
  207.  
  208. /*
  209.  *  Returns an integer in the range from min to max, inclusive.
  210.  */
  211.  
  212. s_16 range(min,max)
  213. u_16 min, max;
  214. {
  215.   u_8 det;
  216.   u_16 dist;
  217.   s_16 return_val, discard;
  218.  
  219. #if RANDOM
  220.   det = random() % 100 + 1;
  221. #else
  222.   det = rand() % 100 + 1;
  223. #endif
  224.   dist = max - min + 1;
  225.   if (det > 50)
  226. #if RANDOM
  227.     discard = random();
  228.   return_val = random() % dist + min;
  229. #else
  230.     discard = rand();
  231.   return_val = rand() % dist + min;
  232. #endif
  233.   return(return_val);
  234. }
  235.  
  236. /*
  237.  * Prompt the user at a break in the instructions.
  238.  */
  239.  
  240. rest()
  241. {
  242.     printf(" -- More --   ");
  243.     while (getchar() != ' ');
  244. }
  245.  
  246. /*
  247.  * Give the user instructions on the game.
  248.  */
  249.  
  250. void print_instructions(in_char)
  251. char in_char;
  252. {
  253. system("clear");
  254. if (in_char != 'y' && in_char != 'Y') return;
  255. system("stty cbreak -echo");
  256. printf("                   Instructions for One-Armed Bandit\n");
  257. printf("                                  by\n");
  258. printf("                             Pete Granger\n\n");
  259. printf("OBJECT:   To amass a fortune, of course. Also to have a good time\n");
  260. printf("        playing the slots.\n\n");
  261. printf(" MEANS:   I have designed a slot machine which I consider to be\n");
  262. printf("        fairly honest. By both statistical and empirical means,\n");
  263. printf("        it is calculated to have a payoff rate of about 91 percent.\n");
  264. printf("        The payoffs are as follows:\n\n");
  265. printf("               Combination     Pays   Frequency   Total Payoff\n");
  266. printf("                  -----        ----     -----         -----\n");
  267. printf("                  Bar * 3      1000         1          1000\n");
  268. printf("                 Bell * 3       100         2           200\n");
  269. printf("               Orange * 3        50         5           250\n");
  270. printf("                Lemon * 3        20        12           240\n");
  271. printf("                 Plum * 3        10        18           180\n");
  272. printf("               Cherry * 3         5        64           320\n");
  273. printf("            Cherry * 2 + Any      2       160           320\n");
  274. printf("                                        -----         -----\n");
  275. printf("                                          262          2510\n");
  276. rest();
  277. printf("\n\n\n\n");
  278. printf("          You will be given an initial bankroll of $%d. Not\n",
  279.         START_MONEY);
  280. printf("        bad for a day at the casino, right? On each play, you can\n");
  281. printf("        bet from $1 to $5, and the payoff will be proportional\n");
  282. printf("        to the bet. You may also place a bet of 0, which means you\n");
  283. printf("        want to sit out this round, and watch the wheels spin. The\n");
  284. printf("        catch, of course, is that you don't win anything this way.\n");
  285. printf("        The only other restriction is that your bet can't exceed\n");
  286. printf("        your current bankroll.\n");
  287. printf("\n");
  288. printf("          If you wish to refresh the screen (e.g. after receiving\n");
  289. printf("        system messages) enter a 'r' at the 'Bet?' prompt.\n");
  290. printf("\n");
  291. printf("          If you decide you want to quit, just enter a 'q' at the\n");
  292. printf("        'Bet?' prompt. You can then cash in your winnings and\n");
  293. printf("        leave the casino.\n");
  294. printf("\n");
  295. printf("          Also, if your bankroll reaches 0, you will be asked to\n");
  296. printf("        leave the casino. But don't worry, you can always come\n");
  297. printf("        back later.\n");
  298. printf("\n");
  299. printf("              Good luck, and enjoy One-Armed Bandit!\n");
  300. printf("\n");
  301. rest();
  302. system("stty -cbreak echo");
  303. system("clear");
  304. }
  305.  
  306. /*
  307.  *  Blank part of a line with curses.
  308.  */
  309.  
  310. void blank_seg(row,col,length)
  311. u_16 row,col,length;
  312. {
  313.   char locbuf[80];
  314.   u_8 i;
  315.  
  316.   if (row >= MIN_ROW && row <= MAX_ROW && col >= MIN_COL && col <= MAX_COL)
  317.   {
  318.     if ((col+length-1) > MAX_COL)
  319.       length = MAX_COL - col + 1;
  320.     for (i = 0; i < length; i++)
  321.       locbuf[i] = ' ';
  322.     locbuf[i] = '\0';
  323.     move(row,col);
  324.     addstr(locbuf);
  325.     refresh();
  326.   }
  327. }
  328.  
  329. /*
  330.  *  Print an odds chart on the screen.
  331.  */
  332.  
  333. void show_odds()
  334. {
  335.   extern char outbuf[];
  336.   extern char symnames[NUMSYMS][NAMELEN+1];
  337.  
  338.   sprintf(outbuf,"          Pete Granger's");
  339.   str_out(ODDS_R-5,ODDS_C);
  340.   sprintf(outbuf,"         ONE-ARMED BANDIT");
  341.   str_out(ODDS_R-4,ODDS_C);
  342.   sprintf(outbuf,"        Combination        | Odds");
  343.   str_out(ODDS_R-2,ODDS_C);
  344.   sprintf(outbuf,"---------------------------+------");
  345.   str_out(ODDS_R-1,ODDS_C);
  346.   sprintf(outbuf,"%s %s %s | %4d",
  347.           symnames[BAR],symnames[BAR],symnames[BAR],PAY_BAR);
  348.   str_out(ODDS_R,ODDS_C);
  349.   sprintf(outbuf,"%s %s %s | %4d",
  350.           symnames[BELL],symnames[BELL],symnames[BELL],PAY_BELL);
  351.   str_out(ODDS_R+BELL,ODDS_C);
  352.   sprintf(outbuf,"%s %s %s | %4d",
  353.           symnames[ORANGE],symnames[ORANGE],symnames[ORANGE],PAY_ORANGE);
  354.   str_out(ODDS_R+ORANGE,ODDS_C);
  355.   sprintf(outbuf,"%s %s %s | %4d",
  356.           symnames[LEMON],symnames[LEMON],symnames[LEMON],PAY_LEMON);
  357.   str_out(ODDS_R+LEMON,ODDS_C);
  358.   sprintf(outbuf,"%s %s %s | %4d",
  359.           symnames[PLUM],symnames[PLUM],symnames[PLUM],PAY_PLUM);
  360.   str_out(ODDS_R+PLUM,ODDS_C);
  361.   sprintf(outbuf,"%s %s %s | %4d",
  362.           symnames[CHERRY],symnames[CHERRY],symnames[CHERRY],PAY_CHERRY);
  363.   str_out(ODDS_R+CHERRY,ODDS_C);
  364.   sprintf(outbuf,"%s %s %s | %4d",
  365.           symnames[CHERRY],symnames[CHERRY]," *wild* ",PAY_WILD);
  366.   str_out(ODDS_R+CHERRY+1,ODDS_C);
  367. }
  368.  
  369.  
  370. /*
  371.  *  Draw a box with curses, given the top left and bottom right corners.
  372.  */
  373.  
  374. void draw_box(tlr,tlc,brr,brc)
  375. s_16 tlr,tlc,brr,brc;
  376. {
  377.   u_8 i, j;
  378.   u_16 tmp;
  379.  
  380.   if (tlc > brc)
  381.   {
  382.     tmp = brc; brc = tlc; tlc = tmp;
  383.   }
  384.   if (tlr > brr)
  385.   {
  386.     tmp = brr; brr = tlr; tlr = tmp;
  387.   }
  388.   if (tlc < 0) tlc = 0;
  389.   else if (tlc > 78) tlc = 78;
  390.   if (brc < 0) brc = 0;
  391.   else if (brc > 78) brc = 78;
  392.   if (tlr < 0) tlr = 0;
  393.   else if (tlr > 23) tlr = 23;
  394.   if (brr < 0) brr = 0;
  395.   else if (brr > 23) brr = 23;
  396.   move(tlr,tlc); addch('+'); refresh();
  397.   move(brr,tlc); addch('+'); refresh();
  398.   for (i = tlc + 1; i < brc; i++)
  399.   {
  400.     move(tlr,i); addch('-'); refresh();
  401.     move(brr,i); addch('-'); refresh();
  402.   }
  403.   move(tlr,brc); addch('+'); refresh();
  404.   move(brr,brc); addch('+'); refresh();
  405.   for (i = tlr + 1; i < brr; i++)
  406.   {
  407.     move(i,tlc); addch('|'); refresh();
  408.     for (j = tlc + 1; j < brr; j++)
  409.     {
  410.       move(i,j); addch(' '); refresh();
  411.     }
  412.     move(i,brc); addch('|'); refresh();
  413.   }
  414. }
  415.  
  416. /*
  417.  *  Draw the three windows where the wheels appear.
  418.  */
  419.  
  420. void draw_windows()
  421. {
  422.   extern void draw_box();
  423.  
  424.   draw_box(W1ROW-2,W1COL-2,W1ROW+2,W1COL+NAMELEN+1);
  425.   draw_box(W2ROW-2,W2COL-2,W2ROW+2,W2COL+NAMELEN+1);
  426.   draw_box(W3ROW-2,W3COL-2,W3ROW+2,W3COL+NAMELEN+1);
  427. }
  428.  
  429. /*
  430.  * Convert the three wheel indices into a simple integer.
  431.  */
  432.  
  433. u_16 wheel_sum(s1,s2,s3)
  434. u_8 s1,s2,s3;
  435. {
  436.   extern wheel w1, w2, w3;
  437.  
  438.   u_16 return_val;
  439.  
  440.   return_val = (100 * w1[s1]) + (10 * w2[s2]) + w3[s3];
  441.   return(return_val);
  442. }
  443.  
  444. /*
  445.  * Determine the payoff odds based on the three wheel indices.
  446.  */
  447.  
  448. u_16 payoff(s1,s2,s3)
  449. u_8 s1,s2,s3;
  450. {
  451.   extern u_16 wheel_sum();
  452.  
  453.   u_16 payoff_index, return_val;
  454.  
  455.   payoff_index = wheel_sum(s1,s2,s3);
  456.   switch (payoff_index)
  457.   {
  458.     case BAR3:     return_val = PAY_BAR;
  459.                    break;
  460.     case BELL3:    return_val = PAY_BELL;
  461.                    break;
  462.     case ORANGE3:  return_val = PAY_ORANGE;
  463.                    break;
  464.     case LEMON3:   return_val = PAY_LEMON;
  465.                    break;
  466.     case PLUM3:    return_val = PAY_PLUM;
  467.                    break;
  468.     case CHERRY3:  return_val = PAY_CHERRY;
  469.                    break;
  470.     case W_BAR:
  471.     case W_BELL:
  472.     case W_ORANGE:
  473.     case W_LEMON:
  474.     case W_PLUM:   return_val = PAY_WILD;
  475.                    break;
  476.     default:       return_val = BUST;
  477.                    break;
  478.   }
  479.   return(return_val);
  480. }
  481.  
  482. /*
  483.  *  Flash the "WINNER!" box on a jackpot.
  484.  */
  485.  
  486. void flash_win(payoff)
  487. u_16 payoff;
  488. {
  489.   extern void draw_box();
  490.   extern void blank_seg();
  491.   extern char winflash[6][35];
  492.   extern char outbuf[];
  493.  
  494.   u_8 i, j, flashes;
  495.  
  496.   draw_box(1,W1COL-2,W1ROW-3,W3COL+NAMELEN+1);
  497.   if (payoff >= PAY_BAR)
  498.     flashes = 10;
  499.   else if (payoff >= PAY_ORANGE)
  500.     flashes = 6;
  501.   else
  502.     flashes = 3;
  503.   for (i = 0; i < flashes; i++)
  504.   {
  505.     for (j = 0; j < 5; j++)
  506.     {
  507.       sprintf(outbuf,winflash[j]);
  508.       str_out(j+2,W1COL-1);
  509.     }
  510.     if (i == flashes - 1)
  511.       sleep(8);
  512.     else
  513.       for (j = 0; j < 5; j++)
  514.       {
  515.         sprintf(outbuf,winflash[5]);
  516.         str_out(j+2,W1COL-1);
  517.       }
  518.   }
  519.   for (i = 0; i < 7; i++)
  520.     blank_seg(i+1,W1COL-2,36);
  521. }
  522.  
  523. /*
  524.  *  Refresh the screen at the user's request. Handy if you get mail in
  525.  *  the middle of a game or something.
  526.  */
  527.  
  528. void refresh_screen(ts,br)
  529. u_32 ts, br;
  530. {
  531.   extern void draw_windows();
  532.   extern void show_odds();
  533.   extern void blank_seg();
  534.   extern char outbuf[];
  535.  
  536.   initscr();
  537.   draw_windows();
  538.   show_odds();
  539.   if (!ts)
  540.   {
  541.     blank_seg(TOTAL_R,TOTAL_C,78);
  542.     sprintf(outbuf,"Starting bankroll: %d",br);
  543.     str_out(TOTAL_R,TOTAL_C);
  544.   }
  545.   else
  546.   {
  547.     blank_seg(TOTAL_R,TOTAL_C,78);
  548.     sprintf(outbuf,"New total (after %d %s) is %d.",
  549.             ts,((ts != 1) ? "plays" : "play"),br);
  550.     str_out(TOTAL_R,TOTAL_C);
  551.   }
  552. }
  553.  
  554. void play_game()
  555. {
  556.   extern s_16 range();
  557.   extern u_16 payoff();
  558.   extern void draw_windows();
  559.   extern void show_odds();
  560.   extern void flash_win();
  561.   extern void refresh_screen();
  562.   extern void blank_seg();
  563.   extern wheel w1, w2, w3;
  564.   extern char symnames[NUMSYMS][NAMELEN+1];
  565.   extern char replybuf[];
  566.   extern char outbuf[];
  567.  
  568.   u_8  r1, s1, r2, s2, r3, s3, offset;
  569.   u_8  this_bet, maxbet;
  570.   u_16 c1, c2, c3, counter;
  571.   u_32 bankroll, times_spun, payoffs;
  572.  
  573.   bankroll = START_MONEY;
  574.   this_bet = 0;
  575.   payoffs = times_spun = 0;
  576.   s1 = s2 = s3 = 0;
  577.   initscr();
  578.   draw_windows();
  579.   show_odds();
  580.   while (bankroll)
  581.   {
  582.     if (!times_spun)
  583.     {
  584.       blank_seg(TOTAL_R,TOTAL_C,78);
  585.       sprintf(outbuf,"Starting bankroll: %d",bankroll);
  586.       str_out(TOTAL_R,TOTAL_C);
  587.     }
  588.     maxbet = MIN(5,bankroll);
  589.     sprintf(outbuf,"How much do you wish to bet (0-%d)? ",maxbet);
  590.     blank_seg(QUERY_R,QUERY_C,78);
  591.     str_out(QUERY_R,QUERY_C);
  592.     if (gets(replybuf) == NULL) continue;
  593.     if (replybuf[0] == 'q' || replybuf[0] == 'Q')
  594.       break;
  595.     else if (replybuf[0] == 'r' || replybuf[0] == 'R')
  596.       refresh_screen(times_spun,bankroll);
  597.     else
  598.     {
  599.       if ((this_bet = atoi(replybuf)) > maxbet)
  600.       {
  601.         sprintf(outbuf,"You can't bet that much!");
  602.         str_out(INVALID_R,INVALID_C);
  603.         continue;
  604.       }
  605.       else
  606.         blank_seg(INVALID_R,INVALID_C,30);
  607.       if (this_bet)
  608.         times_spun++;
  609.       r1 = range(5,8);
  610.       r2 = r1 + range(2,4);
  611.       r3 = r2 + range(2,4);
  612.       s1 = (s1 + range(0,ON_WHEEL-1)) % ON_WHEEL;
  613.       s2 = (s2 + range(0,ON_WHEEL-1)) % ON_WHEEL;
  614.       s3 = (s3 + range(0,ON_WHEEL-1)) % ON_WHEEL;
  615.       c1 = ON_WHEEL * r1 + s1;
  616.       c2 = ON_WHEEL * r2 + s2;
  617.       c3 = ON_WHEEL * r3 + s3;
  618.       bankroll -= this_bet;
  619.       for (counter = 0; counter <= c3; counter++)
  620.       {
  621.         offset = counter % ON_WHEEL;
  622.         if (counter <= c1)
  623.           do_wheel1(offset);
  624.         if (counter <= c2)
  625.           do_wheel2(offset);
  626.         do_wheel3(offset);
  627.       }
  628.       if (payoff(s1,s2,s3))
  629.       {
  630.         flash_win(payoff(s1,s2,s3));
  631.         sprintf(outbuf,"The payoff for %d %s is %d.",this_bet,
  632.                 ((this_bet != 1) ? "dollars" : "dollar"),
  633.                 (this_bet * payoff(s1,s2,s3)));
  634.         bankroll += (this_bet * payoff(s1,s2,s3));
  635.         if (this_bet)
  636.           payoffs++;
  637.       }
  638.       else
  639.         sprintf(outbuf,"No winner.");
  640.       blank_seg(PAY_R,PAY_C,40);
  641.       str_out(PAY_R,PAY_C);
  642.       blank_seg(TOTAL_R,TOTAL_C,78);
  643.       sprintf(outbuf,"New total (after %d %s) is %d.",
  644.               times_spun,((times_spun != 1) ? "plays" : "play"),bankroll);
  645.       str_out(TOTAL_R,TOTAL_C);
  646.     }
  647.   }
  648.   blank_seg(QUERY_R,QUERY_C,78);
  649.   endwin();
  650.   if (!bankroll)
  651.   {
  652.     printf("\nYou are bankrupt after %d %s, %d %s.\n",
  653.             times_spun,((times_spun != 1) ? "plays" : "play"),
  654.             payoffs,((payoffs != 1) ? "payoffs" : "payoff"));
  655.     printf("\nLuck does not seem to be with you. Unfortunately,\n");
  656.     printf("Guido and Vito, the casino's bouncers, are. They grab\n");
  657.     printf("you by the elbows and escort you to the sidewalk.\n\n");
  658.     printf("                      GAME OVER\n\n");
  659.   }
  660.   else
  661.     printf("\nTotal of %d after %d %s, %d %s.\n",bankroll,
  662.             times_spun,((times_spun != 1) ? "plays" : "play"),
  663.             payoffs,((payoffs != 1) ? "payoffs" : "payoff"));
  664. }
  665.  
  666. void main()
  667. {
  668.   extern void init_rand();
  669.   extern void play_game();
  670.   extern char replybuf[];
  671.   extern void print_instructions();
  672.  
  673.   system("clear");
  674.   printf("Would you like instructions, y/n [default is n] -> ");
  675.   fflush(stdout);
  676.   while (gets(replybuf) == NULL);
  677.   print_instructions(replybuf[0]);
  678.   init_rand();
  679.   play_game();
  680. }
  681.