/* * cdiscard -- the computer figures out what is the best discard for * the crib and puts the best two cards at the end */ void cdiscard(bool mycrib) { CARD d[CARDS], h[FULLHAND], cb[2]; int i, j, k; int nc, ns; long sums[15]; static int undo1[15] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4}; static int undo2[15] = {1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5}; makedeck(d); nc = CARDS; for (i = 0; i < knownum; i++) { /* get all other cards */ cremove(known[i], d, nc--); } for (i = 0; i < 15; i++) sums[i] = 0L; ns = 0; for (i = 0; i < (FULLHAND - 1); i++) { cb[0] = chand[i]; for (j = i + 1; j < FULLHAND; j++) { cb[1] = chand[j]; for (k = 0; k < FULLHAND; k++) h[k] = chand[k]; cremove(chand[i], h, FULLHAND); cremove(chand[j], h, FULLHAND - 1); for (k = 0; k < nc; k++) { sums[ns] += scorehand(h, d[k], CINHAND, TRUE, FALSE); if (mycrib) sums[ns] += adjust(cb, d[k]); else sums[ns] -= adjust(cb, d[k]); } ++ns; } } j = 0; for (i = 1; i < 15; i++) if (sums[i] > sums[j]) j = i; for (k = 0; k < FULLHAND; k++) h[k] = chand[k]; cremove(h[undo1[j]], chand, FULLHAND); cremove(h[undo2[j]], chand, FULLHAND - 1); chand[4] = h[undo1[j]]; chand[5] = h[undo2[j]]; }
/* * discard: * Handle players discarding into the crib... * Note: we call cdiscard() after prining first message so player doesn't wait */ void discard(bool mycrib) { char *prompt; CARD crd; prcrib(mycrib, TRUE); prompt = (quiet ? "Discard --> " : "Discard a card --> "); cdiscard(mycrib); /* puts best discard at end */ crd = phand[infrom(phand, FULLHAND, prompt)]; cremove(crd, phand, FULLHAND); prhand(phand, FULLHAND, Playwin, FALSE); crib[0] = crd; /* Next four lines same as last four except for cdiscard(). */ crd = phand[infrom(phand, FULLHAND - 1, prompt)]; cremove(crd, phand, FULLHAND - 1); prhand(phand, FULLHAND, Playwin, FALSE); crib[1] = crd; crib[2] = chand[4]; crib[3] = chand[5]; chand[4].rank = chand[4].suit = chand[5].rank = chand[5].suit = EMPTY; }
int peg(bool mycrib) { static CARD ch[CINHAND], ph[CINHAND]; int i, j, k; int l; int cnum, pnum, sum; bool myturn, mego, ugo, last, played; CARD crd; played = FALSE; cnum = pnum = CINHAND; for (i = 0; i < CINHAND; i++) { /* make copies of hands */ ch[i] = chand[i]; ph[i] = phand[i]; } Tcnt = 0; /* index to table of cards played */ sum = 0; /* sum of cards played */ mego = ugo = FALSE; myturn = !mycrib; for (;;) { last = TRUE; /* enable last flag */ prhand(ph, pnum, Playwin, FALSE); prhand(ch, cnum, Compwin, TRUE); prtable(sum); if (myturn) { if (!anymove(ch, cnum, sum)) { /* if no card to play */ if (!mego && cnum) { /* go for comp? */ msg("GO"); mego = TRUE; } /* can player move? */ if (anymove(ph, pnum, sum)) myturn = !myturn; else { /* give him his point */ msg(quiet ? "You get one" : "You get one point"); do_wait(); if (chkscr(&pscore, 1)) return TRUE; sum = 0; mego = ugo = FALSE; Tcnt = 0; } } else { played = TRUE; j = -1; k = 0; /* maximize score */ for (i = 0; i < cnum; i++) { l = pegscore(ch[i], Table, Tcnt, sum); if (l > k) { k = l; j = i; } } if (j < 0) /* if nothing scores */ j = cchose(ch, cnum, sum); crd = ch[j]; cremove(crd, ch, cnum--); sum += VAL(crd.rank); Table[Tcnt++] = crd; if (k > 0) { addmsg(quiet ? "I get %d playing " : "I get %d points playing ", k); msgcard(crd, FALSE); endmsg(); prhand(ph, pnum, Playwin, FALSE); prhand(ch, cnum, Compwin, TRUE); prtable(sum); if (chkscr(&cscore, k)) return TRUE; } myturn = !myturn; } } else { if (!anymove(ph, pnum, sum)) { /* can player move? */ if (!ugo && pnum) { /* go for player */ msg("You have a GO"); ugo = TRUE; } /* can computer play? */ if (anymove(ch, cnum, sum)) myturn = !myturn; else { msg(quiet ? "I get one" : "I get one point"); do_wait(); prhand(ph, pnum, Playwin, FALSE); prhand(ch, cnum, Compwin, TRUE); prtable(sum); if (chkscr(&cscore, 1)) return TRUE; sum = 0; mego = ugo = FALSE; Tcnt = 0; } } else { /* player plays */ played = FALSE; if (pnum == 1) { crd = ph[0]; msg("You play your last card"); } else for (;;) { prhand(ph, pnum, Playwin, FALSE); crd = ph[infrom(ph, pnum, "Your play: ")]; if (sum + VAL(crd.rank) <= 31) break; else msg("Total > 31 -- try again"); } makeknown(&crd, 1); cremove(crd, ph, pnum--); i = pegscore(crd, Table, Tcnt, sum); sum += VAL(crd.rank); Table[Tcnt++] = crd; if (i > 0) { msg(quiet ? "You got %d" : "You got %d points", i); if (pnum == 0) do_wait(); prhand(ph, pnum, Playwin, FALSE); prhand(ch, cnum, Compwin, TRUE); prtable(sum); if (chkscr(&pscore, i)) return TRUE; } myturn = !myturn; } } if (sum >= 31) { if (!myturn) do_wait(); sum = 0; mego = ugo = FALSE; Tcnt = 0; last = FALSE; /* disable last flag */ } if (!pnum && !cnum) break; /* both done */ } prhand(ph, pnum, Playwin, FALSE); prhand(ch, cnum, Compwin, TRUE); prtable(sum); if (last) { if (played) { msg(quiet ? "I get one for last" : "I get one point for last"); do_wait(); if (chkscr(&cscore, 1)) return TRUE; } else { msg(quiet ? "You get one for last" : "You get one point for last"); do_wait(); if (chkscr(&pscore, 1)) return TRUE; } } return (FALSE); }