121514Smckusick /* 221514Smckusick * Copyright (c) 1980 Regents of the University of California. 333705Sbostic * All rights reserved. 433705Sbostic * 533705Sbostic * Redistribution and use in source and binary forms are permitted 634779Sbostic * provided that the above copyright notice and this paragraph are 734779Sbostic * duplicated in all such forms and that any documentation, 834779Sbostic * advertising materials, and other materials related to such 934779Sbostic * distribution and use acknowledge that the software was developed 1034779Sbostic * by the University of California, Berkeley. The name of the 1134779Sbostic * University may not be used to endorse or promote products derived 1234779Sbostic * from this software without specific prior written permission. 1334779Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434779Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534779Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1621514Smckusick */ 1712571Sarnold 1821514Smckusick #ifndef lint 1921514Smckusick char copyright[] = 2021514Smckusick "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 2121514Smckusick All rights reserved.\n"; 2233705Sbostic #endif /* not lint */ 2321514Smckusick 2421514Smckusick #ifndef lint 25*41186Sbostic static char sccsid[] = "@(#)crib.c 5.4 (Berkeley) 05/01/90"; 2633705Sbostic #endif /* not lint */ 2721514Smckusick 28*41186Sbostic # include <sys/signal.h> 297871Sarnold # include <curses.h> 307871Sarnold # include "deck.h" 317871Sarnold # include "cribbage.h" 327871Sarnold # include "cribcur.h" 33*41186Sbostic # include "pathnames.h" 347706Sarnold 357871Sarnold main(argc, argv) 367871Sarnold int argc; 377871Sarnold char *argv[]; 387706Sarnold { 39*41186Sbostic extern char *optarg; 40*41186Sbostic extern int optind; 417706Sarnold register char *p; 42*41186Sbostic int ch; 437706Sarnold BOOLEAN playing; 447706Sarnold char *s; /* for reading arguments */ 457871Sarnold FILE *f; 467871Sarnold FILE *fopen(); 47*41186Sbostic char *getline(), *getlogin(); 48*41186Sbostic void rint(); 497706Sarnold 50*41186Sbostic while ((ch = getopt(argc, argv, "eqr")) != EOF) 51*41186Sbostic switch(ch) { 52*41186Sbostic case 'e': 537706Sarnold explain = TRUE; 547706Sarnold break; 55*41186Sbostic case 'q': 567706Sarnold quiet = TRUE; 577706Sarnold break; 58*41186Sbostic case 'r': 597706Sarnold rflag = TRUE; 607706Sarnold break; 61*41186Sbostic case '?': 62*41186Sbostic default: 63*41186Sbostic (void) fprintf(stderr, "usage: cribbage [-eqr]\n"); 64*41186Sbostic exit(1); 657706Sarnold } 667871Sarnold 677871Sarnold initscr(); 68*41186Sbostic signal(SIGINT, rint); 697871Sarnold crmode(); 707871Sarnold noecho(); 7112315Sarnold Playwin = subwin(stdscr, PLAY_Y, PLAY_X, 0, 0); 7212315Sarnold Tablewin = subwin(stdscr, TABLE_Y, TABLE_X, 0, PLAY_X); 7312315Sarnold Compwin = subwin(stdscr, COMP_Y, COMP_X, 0, TABLE_X + PLAY_X); 7412315Sarnold Msgwin = subwin(stdscr, MSG_Y, MSG_X, Y_MSG_START, SCORE_X + 1); 757871Sarnold leaveok(Playwin, TRUE); 767871Sarnold leaveok(Tablewin, TRUE); 777871Sarnold leaveok(Compwin, TRUE); 7812162Sarnold clearok(stdscr, FALSE); 797871Sarnold 807871Sarnold if (!quiet) { 817871Sarnold msg("Do you need instructions for cribbage? "); 827871Sarnold if (getuchar() == 'Y') { 838071Sarnold endwin(); 84*41186Sbostic clear(); 85*41186Sbostic mvcur(0, COLS - 1, LINES - 1, 0); 868071Sarnold fflush(stdout); 87*41186Sbostic instructions(); 888071Sarnold crmode(); 898071Sarnold noecho(); 908071Sarnold clear(); 918071Sarnold refresh(); 927871Sarnold msg("For the rules of this program, do \"man cribbage\""); 937706Sarnold } 947706Sarnold } 957706Sarnold playing = TRUE; 967871Sarnold do { 9712315Sarnold wclrtobot(Msgwin); 987871Sarnold msg(quiet ? "L or S? " : "Long (to 121) or Short (to 61)? "); 997949Sarnold if (glimit == SGAME) 1007949Sarnold glimit = (getuchar() == 'L' ? LGAME : SGAME); 1017949Sarnold else 1027949Sarnold glimit = (getuchar() == 'S' ? SGAME : LGAME); 1037706Sarnold game(); 1047871Sarnold msg("Another game? "); 1057871Sarnold playing = (getuchar() == 'Y'); 1067871Sarnold } while (playing); 1077871Sarnold 108*41186Sbostic if (f = fopen(_PATH_LOG, "a")) { 109*41186Sbostic (void)fprintf(f, "%s: won %5.5d, lost %5.5d\n", 110*41186Sbostic getlogin(), cgames, pgames); 111*41186Sbostic (void)fclose(f); 1127706Sarnold } 1137871Sarnold bye(); 114*41186Sbostic if (!f) { 115*41186Sbostic (void)fprintf(stderr, "\ncribbage: can't open %s.\n", 116*41186Sbostic _PATH_LOG); 117*41186Sbostic exit(1); 118*41186Sbostic } 119*41186Sbostic exit(0); 1207706Sarnold } 1217706Sarnold 1227871Sarnold /* 1237871Sarnold * makeboard: 1247871Sarnold * Print out the initial board on the screen 1257871Sarnold */ 1267871Sarnold makeboard() 1277871Sarnold { 1287871Sarnold mvaddstr(SCORE_Y + 0, SCORE_X, "+---------------------------------------+"); 12911397Sarnold mvaddstr(SCORE_Y + 1, SCORE_X, "| Score: 0 YOU |"); 1307937Sarnold mvaddstr(SCORE_Y + 2, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 1317937Sarnold mvaddstr(SCORE_Y + 3, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 1327871Sarnold mvaddstr(SCORE_Y + 4, SCORE_X, "| |"); 1337937Sarnold mvaddstr(SCORE_Y + 5, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 1347937Sarnold mvaddstr(SCORE_Y + 6, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 13511397Sarnold mvaddstr(SCORE_Y + 7, SCORE_X, "| Score: 0 ME |"); 1367871Sarnold mvaddstr(SCORE_Y + 8, SCORE_X, "+---------------------------------------+"); 1377949Sarnold gamescore(); 1387949Sarnold } 1397949Sarnold 1407949Sarnold /* 1417949Sarnold * gamescore: 1427949Sarnold * Print out the current game score 1437949Sarnold */ 1447949Sarnold gamescore() 1457949Sarnold { 1467949Sarnold extern int Lastscore[]; 1477949Sarnold 1487948Sarnold if (pgames || cgames) { 1497948Sarnold mvprintw(SCORE_Y + 1, SCORE_X + 28, "Games: %3d", pgames); 1507948Sarnold mvprintw(SCORE_Y + 7, SCORE_X + 28, "Games: %3d", cgames); 1517948Sarnold } 1527937Sarnold Lastscore[0] = -1; 1537937Sarnold Lastscore[1] = -1; 1547871Sarnold } 1557871Sarnold 1567706Sarnold /* 1577871Sarnold * game: 1587933Sarnold * Play one game up to glimit points. Actually, we only ASK the 1597933Sarnold * player what card to turn. We do a random one, anyway. 1607706Sarnold */ 1617706Sarnold game() 1627706Sarnold { 1637871Sarnold register int i, j; 1647706Sarnold BOOLEAN flag; 1657706Sarnold BOOLEAN compcrib; 1667706Sarnold 1677949Sarnold makeboard(); 16812162Sarnold refresh(); 1697871Sarnold makedeck(deck); 1707871Sarnold shuffle(deck); 1717871Sarnold if (gamecount == 0) { 1727706Sarnold flag = TRUE; 1737871Sarnold do { 1747933Sarnold if (!rflag) { /* player cuts deck */ 1757871Sarnold msg(quiet ? "Cut for crib? " : 1767871Sarnold "Cut to see whose crib it is -- low card wins? "); 1777933Sarnold getline(); 1787706Sarnold } 1797933Sarnold i = (rand() >> 4) % CARDS; /* random cut */ 1807871Sarnold do { /* comp cuts deck */ 1817871Sarnold j = (rand() >> 4) % CARDS; 1827871Sarnold } while (j == i); 1837871Sarnold addmsg(quiet ? "You cut " : "You cut the "); 1847871Sarnold msgcard(deck[i], FALSE); 1857871Sarnold endmsg(); 1867871Sarnold addmsg(quiet ? "I cut " : "I cut the "); 1877871Sarnold msgcard(deck[j], FALSE); 1887871Sarnold endmsg(); 1897871Sarnold flag = (deck[i].rank == deck[j].rank); 1907871Sarnold if (flag) { 1917871Sarnold msg(quiet ? "We tied..." : 1927871Sarnold "We tied and have to try again..."); 1937871Sarnold shuffle(deck); 1947706Sarnold continue; 1957706Sarnold } 1967871Sarnold else 1977871Sarnold compcrib = (deck[i].rank > deck[j].rank); 1987871Sarnold } while (flag); 1997706Sarnold } 2007871Sarnold else { 2017949Sarnold werase(Tablewin); 2027949Sarnold wrefresh(Tablewin); 2037949Sarnold werase(Compwin); 2047949Sarnold wrefresh(Compwin); 20512315Sarnold msg("Loser (%s) gets first crib", (iwon ? "you" : "me")); 2067706Sarnold compcrib = !iwon; 2077706Sarnold } 2087871Sarnold 2097706Sarnold pscore = cscore = 0; 2107706Sarnold flag = TRUE; 2117871Sarnold do { 2127871Sarnold shuffle(deck); 2137871Sarnold flag = !playhand(compcrib); 2147706Sarnold compcrib = !compcrib; 2157871Sarnold } while (flag); 2167706Sarnold ++gamecount; 2177871Sarnold if (cscore < pscore) { 2187871Sarnold if (glimit - cscore > 60) { 2197871Sarnold msg("YOU DOUBLE SKUNKED ME!"); 2207871Sarnold pgames += 4; 2217706Sarnold } 2227871Sarnold else if (glimit - cscore > 30) { 2237871Sarnold msg("YOU SKUNKED ME!"); 2247871Sarnold pgames += 2; 2257871Sarnold } 2267871Sarnold else { 2277871Sarnold msg("YOU WON!"); 2287706Sarnold ++pgames; 2297706Sarnold } 2307706Sarnold iwon = FALSE; 2317706Sarnold } 2327871Sarnold else { 2337871Sarnold if (glimit - pscore > 60) { 2347871Sarnold msg("I DOUBLE SKUNKED YOU!"); 2357871Sarnold cgames += 4; 2367706Sarnold } 2377871Sarnold else if (glimit - pscore > 30) { 2387871Sarnold msg("I SKUNKED YOU!"); 2397871Sarnold cgames += 2; 2407871Sarnold } 2417871Sarnold else { 2427871Sarnold msg("I WON!"); 2437706Sarnold ++cgames; 2447706Sarnold } 2457706Sarnold iwon = TRUE; 2467706Sarnold } 2477949Sarnold gamescore(); 2487706Sarnold } 2497706Sarnold 2507706Sarnold /* 2517871Sarnold * playhand: 2527871Sarnold * Do up one hand of the game 2537706Sarnold */ 2547871Sarnold playhand(mycrib) 2557871Sarnold BOOLEAN mycrib; 2567871Sarnold { 2577871Sarnold register int deckpos; 2587871Sarnold extern char Msgbuf[]; 2597706Sarnold 2607871Sarnold werase(Compwin); 2617706Sarnold 2627706Sarnold knownum = 0; 2637871Sarnold deckpos = deal(mycrib); 2647871Sarnold sorthand(chand, FULLHAND); 2657871Sarnold sorthand(phand, FULLHAND); 2667871Sarnold makeknown(chand, FULLHAND); 2678073Sarnold prhand(phand, FULLHAND, Playwin, FALSE); 2687871Sarnold discard(mycrib); 2697871Sarnold if (cut(mycrib, deckpos)) 2707871Sarnold return TRUE; 2717871Sarnold if (peg(mycrib)) 2727871Sarnold return TRUE; 2737871Sarnold werase(Tablewin); 2747871Sarnold wrefresh(Tablewin); 2757871Sarnold if (score(mycrib)) 2767871Sarnold return TRUE; 2777871Sarnold return FALSE; 2787706Sarnold } 2797706Sarnold 2807706Sarnold 2817706Sarnold 2827706Sarnold /* 2837706Sarnold * deal cards to both players from deck 2847706Sarnold */ 2857706Sarnold 2867706Sarnold deal( mycrib ) 2877706Sarnold { 2887706Sarnold register int i, j; 2897706Sarnold 2907706Sarnold j = 0; 2917706Sarnold for( i = 0; i < FULLHAND; i++ ) { 2927706Sarnold if( mycrib ) { 2937706Sarnold phand[i] = deck[j++]; 2947706Sarnold chand[i] = deck[j++]; 2957706Sarnold } 2967706Sarnold else { 2977706Sarnold chand[i] = deck[j++]; 2987706Sarnold phand[i] = deck[j++]; 2997706Sarnold } 3007706Sarnold } 3017706Sarnold return( j ); 3027706Sarnold } 3037706Sarnold 3047706Sarnold /* 3057871Sarnold * discard: 3067871Sarnold * Handle players discarding into the crib... 3077871Sarnold * Note: we call cdiscard() after prining first message so player doesn't wait 3087706Sarnold */ 3097871Sarnold discard(mycrib) 3107871Sarnold BOOLEAN mycrib; 3117706Sarnold { 3127871Sarnold register char *prompt; 3137871Sarnold CARD crd; 3147706Sarnold 3157946Sarnold prcrib(mycrib, TRUE); 3167871Sarnold prompt = (quiet ? "Discard --> " : "Discard a card --> "); 3177871Sarnold cdiscard(mycrib); /* puts best discard at end */ 3187871Sarnold crd = phand[infrom(phand, FULLHAND, prompt)]; 3197871Sarnold remove(crd, phand, FULLHAND); 3208073Sarnold prhand(phand, FULLHAND, Playwin, FALSE); 3217706Sarnold crib[0] = crd; 3227871Sarnold /* next four lines same as last four except for cdiscard() */ 3237871Sarnold crd = phand[infrom(phand, FULLHAND - 1, prompt)]; 3247871Sarnold remove(crd, phand, FULLHAND - 1); 3258073Sarnold prhand(phand, FULLHAND, Playwin, FALSE); 3267706Sarnold crib[1] = crd; 3277706Sarnold crib[2] = chand[4]; 3287706Sarnold crib[3] = chand[5]; 3297871Sarnold chand[4].rank = chand[4].suit = chand[5].rank = chand[5].suit = EMPTY; 3307706Sarnold } 3317706Sarnold 3327706Sarnold /* 3337871Sarnold * cut: 3347933Sarnold * Cut the deck and set turnover. Actually, we only ASK the 3357933Sarnold * player what card to turn. We do a random one, anyway. 3367706Sarnold */ 3377871Sarnold cut(mycrib, pos) 3387871Sarnold BOOLEAN mycrib; 3397871Sarnold int pos; 3407706Sarnold { 3417871Sarnold register int i, cardx; 3427706Sarnold BOOLEAN win = FALSE; 3437706Sarnold 3447871Sarnold if (mycrib) { 3457933Sarnold if (!rflag) { /* random cut */ 3467871Sarnold msg(quiet ? "Cut the deck? " : 3477871Sarnold "How many cards down do you wish to cut the deck? "); 3487933Sarnold getline(); 3497706Sarnold } 3507933Sarnold i = (rand() >> 4) % (CARDS - pos); 3517706Sarnold turnover = deck[i + pos]; 3527871Sarnold addmsg(quiet ? "You cut " : "You cut the "); 3537871Sarnold msgcard(turnover, FALSE); 3547871Sarnold endmsg(); 3557871Sarnold if (turnover.rank == JACK) { 35612315Sarnold msg("I get two for his heels"); 3577871Sarnold win = chkscr(&cscore,2 ); 3587706Sarnold } 3597706Sarnold } 3607871Sarnold else { 3617871Sarnold i = (rand() >> 4) % (CARDS - pos) + pos; 3627706Sarnold turnover = deck[i]; 3637871Sarnold addmsg(quiet ? "I cut " : "I cut the "); 3647871Sarnold msgcard(turnover, FALSE); 3657871Sarnold endmsg(); 3667871Sarnold if (turnover.rank == JACK) { 36712315Sarnold msg("You get two for his heels"); 3687871Sarnold win = chkscr(&pscore, 2); 3697706Sarnold } 3707706Sarnold } 3717871Sarnold makeknown(&turnover, 1); 3727946Sarnold prcrib(mycrib, FALSE); 3737871Sarnold return win; 3747706Sarnold } 3757706Sarnold 3767706Sarnold /* 3777946Sarnold * prcrib: 3787946Sarnold * Print out the turnover card with crib indicator 3797946Sarnold */ 3807946Sarnold prcrib(mycrib, blank) 3817946Sarnold BOOLEAN mycrib, blank; 3827946Sarnold { 38312162Sarnold register int y, cardx; 3847946Sarnold 3857946Sarnold if (mycrib) 3867946Sarnold cardx = CRIB_X; 3877946Sarnold else 38812315Sarnold cardx = 0; 3897946Sarnold 3907946Sarnold mvaddstr(CRIB_Y, cardx + 1, "CRIB"); 3917946Sarnold prcard(stdscr, CRIB_Y + 1, cardx, turnover, blank); 39212162Sarnold 39312162Sarnold if (mycrib) 39412315Sarnold cardx = 0; 39512162Sarnold else 39612162Sarnold cardx = CRIB_X; 39712162Sarnold 39812162Sarnold for (y = CRIB_Y; y <= CRIB_Y + 5; y++) 39912162Sarnold mvaddstr(y, cardx, " "); 4007946Sarnold } 4017946Sarnold 4027946Sarnold /* 4037871Sarnold * peg: 4047871Sarnold * Handle all the pegging... 4057706Sarnold */ 4067706Sarnold 4077871Sarnold static CARD Table[14]; 4087706Sarnold 4097871Sarnold static int Tcnt; 4107871Sarnold 4117871Sarnold peg(mycrib) 4127871Sarnold BOOLEAN mycrib; 4137706Sarnold { 4147871Sarnold static CARD ch[CINHAND], ph[CINHAND]; 4157706Sarnold CARD crd; 4167871Sarnold register int i, j, k; 4178072Sarnold register int l; 4188072Sarnold register int cnum, pnum, sum; 4198072Sarnold register BOOLEAN myturn, mego, ugo, last, played; 4207706Sarnold 4217706Sarnold cnum = pnum = CINHAND; 4227871Sarnold for (i = 0; i < CINHAND; i++) { /* make copies of hands */ 4237706Sarnold ch[i] = chand[i]; 4247706Sarnold ph[i] = phand[i]; 4257706Sarnold } 4267871Sarnold Tcnt = 0; /* index to table of cards played */ 4277706Sarnold sum = 0; /* sum of cards played */ 4287706Sarnold mego = ugo = FALSE; 4297706Sarnold myturn = !mycrib; 4307871Sarnold for (;;) { 4317706Sarnold last = TRUE; /* enable last flag */ 4328073Sarnold prhand(ph, pnum, Playwin, FALSE); 4338073Sarnold prhand(ch, cnum, Compwin, TRUE); 4347871Sarnold prtable(sum); 4357871Sarnold if (myturn) { /* my tyrn to play */ 4367871Sarnold if (!anymove(ch, cnum, sum)) { /* if no card to play */ 4377871Sarnold if (!mego && cnum) { /* go for comp? */ 43812315Sarnold msg("GO"); 4397706Sarnold mego = TRUE; 4407706Sarnold } 4417871Sarnold if (anymove(ph, pnum, sum)) /* can player move? */ 4427706Sarnold myturn = !myturn; 4437871Sarnold else { /* give him his point */ 44412315Sarnold msg(quiet ? "You get one" : "You get one point"); 4457871Sarnold if (chkscr(&pscore, 1)) 4467871Sarnold return TRUE; 4477706Sarnold sum = 0; 4487706Sarnold mego = ugo = FALSE; 4497871Sarnold Tcnt = 0; 4507706Sarnold } 4517706Sarnold } 4527871Sarnold else { 4537706Sarnold played = TRUE; 4547706Sarnold j = -1; 4557706Sarnold k = 0; 4567871Sarnold for (i = 0; i < cnum; i++) { /* maximize score */ 4577871Sarnold l = pegscore(ch[i], Table, Tcnt, sum); 4587871Sarnold if (l > k) { 4597706Sarnold k = l; 4607706Sarnold j = i; 4617706Sarnold } 4627706Sarnold } 4637871Sarnold if (j < 0) /* if nothing scores */ 4647871Sarnold j = cchose(ch, cnum, sum); 4657706Sarnold crd = ch[j]; 4667871Sarnold remove(crd, ch, cnum--); 4677871Sarnold sum += VAL(crd.rank); 4687871Sarnold Table[Tcnt++] = crd; 4697871Sarnold if (k > 0) { 4707948Sarnold addmsg(quiet ? "I get %d playing " : 4717948Sarnold "I get %d points playing ", k); 4727871Sarnold msgcard(crd, FALSE); 4737871Sarnold endmsg(); 4747871Sarnold if (chkscr(&cscore, k)) 4757871Sarnold return TRUE; 4767706Sarnold } 4777706Sarnold myturn = !myturn; 4787706Sarnold } 4797706Sarnold } 4807871Sarnold else { 4817871Sarnold if (!anymove(ph, pnum, sum)) { /* can player move? */ 4827871Sarnold if (!ugo && pnum) { /* go for player */ 48312315Sarnold msg("You have a GO"); 4847706Sarnold ugo = TRUE; 4857706Sarnold } 4867871Sarnold if (anymove(ch, cnum, sum)) /* can computer play? */ 4877706Sarnold myturn = !myturn; 4887871Sarnold else { 48912315Sarnold msg(quiet ? "I get one" : "I get one point"); 49012315Sarnold do_wait(); 4917871Sarnold if (chkscr(&cscore, 1)) 4927871Sarnold return TRUE; 4937706Sarnold sum = 0; 4947706Sarnold mego = ugo = FALSE; 4957871Sarnold Tcnt = 0; 4967706Sarnold } 4977706Sarnold } 4987871Sarnold else { /* player plays */ 4997706Sarnold played = FALSE; 5007871Sarnold if (pnum == 1) { 5017706Sarnold crd = ph[0]; 5027871Sarnold msg("You play your last card"); 5037706Sarnold } 5047871Sarnold else 5057871Sarnold for (;;) { 5068073Sarnold prhand(ph, pnum, Playwin, FALSE); 5077871Sarnold crd = ph[infrom(ph, pnum, "Your play: ")]; 5087871Sarnold if (sum + VAL(crd.rank) <= 31) 5097706Sarnold break; 5107871Sarnold else 51112315Sarnold msg("Total > 31 -- try again"); 5127871Sarnold } 5137871Sarnold makeknown(&crd, 1); 5147871Sarnold remove(crd, ph, pnum--); 5157871Sarnold i = pegscore(crd, Table, Tcnt, sum); 5167871Sarnold sum += VAL(crd.rank); 5177871Sarnold Table[Tcnt++] = crd; 5187871Sarnold if (i > 0) { 5197871Sarnold msg(quiet ? "You got %d" : "You got %d points", i); 5207871Sarnold if (chkscr(&pscore, i)) 5217871Sarnold return TRUE; 5227706Sarnold } 5237706Sarnold myturn = !myturn; 5247706Sarnold } 5257706Sarnold } 5267871Sarnold if (sum >= 31) { 52712315Sarnold if (!myturn) 52812315Sarnold do_wait(); 5297706Sarnold sum = 0; 5307706Sarnold mego = ugo = FALSE; 5317871Sarnold Tcnt = 0; 5327706Sarnold last = FALSE; /* disable last flag */ 5337706Sarnold } 5347871Sarnold if (!pnum && !cnum) 5357871Sarnold break; /* both done */ 5367871Sarnold } 5378073Sarnold prhand(ph, pnum, Playwin, FALSE); 5388073Sarnold prhand(ch, cnum, Compwin, TRUE); 5398072Sarnold prtable(sum); 5407871Sarnold if (last) 5417871Sarnold if (played) { 5427871Sarnold msg(quiet ? "I get one for last" : "I get one point for last"); 54312315Sarnold do_wait(); 5447871Sarnold if (chkscr(&cscore, 1)) 5457871Sarnold return TRUE; 5467706Sarnold } 5477871Sarnold else { 5487871Sarnold msg(quiet ? "You get one for last" : 5497871Sarnold "You get one point for last"); 5507871Sarnold if (chkscr(&pscore, 1)) 5517871Sarnold return TRUE; 5527706Sarnold } 5537871Sarnold return FALSE; 5547706Sarnold } 5557706Sarnold 5567871Sarnold /* 5577871Sarnold * prtable: 5587871Sarnold * Print out the table with the current score 5597871Sarnold */ 5607871Sarnold prtable(score) 5617871Sarnold int score; 5627871Sarnold { 5638073Sarnold prhand(Table, Tcnt, Tablewin, FALSE); 5647871Sarnold mvwprintw(Tablewin, (Tcnt + 2) * 2, Tcnt + 1, "%2d", score); 5657871Sarnold wrefresh(Tablewin); 5667871Sarnold } 5677706Sarnold 5687706Sarnold /* 5697871Sarnold * score: 5707871Sarnold * Handle the scoring of the hands 5717706Sarnold */ 5727871Sarnold score(mycrib) 5737871Sarnold BOOLEAN mycrib; 5747706Sarnold { 5757871Sarnold sorthand(crib, CINHAND); 5767871Sarnold if (mycrib) { 5777871Sarnold if (plyrhand(phand, "hand")) 5787871Sarnold return TRUE; 5797871Sarnold if (comphand(chand, "hand")) 5807871Sarnold return TRUE; 58112315Sarnold do_wait(); 5827871Sarnold if (comphand(crib, "crib")) 5837871Sarnold return TRUE; 5847706Sarnold } 5857871Sarnold else { 5867871Sarnold if (comphand(chand, "hand")) 5877871Sarnold return TRUE; 5887871Sarnold if (plyrhand(phand, "hand")) 5897871Sarnold return TRUE; 5907871Sarnold if (plyrhand(crib, "crib")) 5917871Sarnold return TRUE; 5927706Sarnold } 5937871Sarnold return FALSE; 5947706Sarnold } 595