/* * 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]]; }
int strategy( const int hd[], const int fd[], int cg, int tk, const int ud[], int us) { int myhd[HNUM]; int select = -1; int hdcopy[CNUM]; int udcopy[us]; int currentpoint = 0; int deck[CNUM] = { 0 }; int decknum = CNUM; int k; // 最初から高い点なら手札を変えずに終了 arr_copy( hdcopy, hd, HNUM); currentpoint = poker_point(hdcopy); if ( currentpoint >= P6 ) { return -1; } arr_copy( udcopy, ud, us ); decknum = makedeck( hdcopy, udcopy, us, deck ); select = selectcard(hdcopy, cg, tk, udcopy, us, deck, decknum ); return select; }
/* * game: * Play one game up to glimit points. Actually, we only ASK the * player what card to turn. We do a random one, anyway. */ void game(void) { int i, j; bool flag; bool compcrib; makedeck(deck); shuffle(deck); if (gamecount == 0) { flag = TRUE; do { if (!rflag) { /* player cuts deck */ char *foo; /* This is silly, but we should parse user input * even if we're not actually going to use it. */ do { msg(quiet ? "Cut for crib? " : "Cut to see whose crib it is -- low card wins? "); foo = get_line(); if (*foo != '\0' && ((i = atoi(foo)) < 4 || i > 48)) msg("Invalid cut"); else *foo = '\0'; } while (*foo != '\0'); } i = arc4random_uniform(CARDS); /* random cut */ do { /* comp cuts deck */ j = arc4random_uniform(CARDS); } while (j == i); addmsg(quiet ? "You cut " : "You cut the "); msgcard(deck[i], FALSE); endmsg(); addmsg(quiet ? "I cut " : "I cut the "); msgcard(deck[j], FALSE); endmsg(); flag = (deck[i].rank == deck[j].rank); if (flag) { msg(quiet ? "We tied..." : "We tied and have to try again..."); shuffle(deck); continue; } else compcrib = (deck[i].rank > deck[j].rank); } while (flag); do_wait(); clear(); makeboard(); refresh(); } else { makeboard(); refresh(); werase(Tablewin); wrefresh(Tablewin); werase(Compwin); wrefresh(Compwin); msg("Loser (%s) gets first crib", (iwon ? "you" : "me")); compcrib = !iwon; } pscore = cscore = 0; flag = TRUE; do { shuffle(deck); flag = !playhand(compcrib); compcrib = !compcrib; } while (flag); ++gamecount; if (cscore < pscore) { if (glimit - cscore > 60) { msg("YOU DOUBLE SKUNKED ME!"); pgames += 4; } else if (glimit - cscore > 30) { msg("YOU SKUNKED ME!"); pgames += 2; } else { msg("YOU WON!"); ++pgames; } iwon = FALSE; } else { if (glimit - pscore > 60) { msg("I DOUBLE SKUNKED YOU!"); cgames += 4; } else if (glimit - pscore > 30) { msg("I SKUNKED YOU!"); cgames += 2; } else { msg("I WON!"); ++cgames; } iwon = TRUE; } gamescore(); }