|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 10827 (0x2a4b) Types: TextFile Names: »bj.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Bj2/bj.c«
/* bj.c */ /* B.J. - Las Vegas Blackjack, Version 1.0 by Nathan Glasser nathan@brokaw.lcs.mit.edu (internet) nathan@mit-eddie.uucp (usenet) April, 1989 ------------------------------------------------------------------------------ Copyright 1989 by Nathan Glasser. You may feel free to distribute this program in its current form. Please do not remove this copyright information. */ #include "bj.h" CARDINFO cardinfo[] = { {1,'A'}, {2,'2'}, {3,'3'}, {4,'4'}, {5,'5'}, {6,'6'}, {7,'7'}, {8,'8'}, {9,'9'}, {10,'T'}, {10,'J'}, {10,'Q'}, {10,'K'}}; #define ACE 0 CARD *deck; CARD *cardptr; double bet; double last_bet; char inpstring[80]; /* Options */ double money = 100.0, table_min = 3.0; int num_decks = 6, reshuffle_percentage = 66, ten_check = 0, hit_soft17 = 0, double_split = 1, resplit_pair = 1, late_surrender = 1, show_burn = 0, show_pct = 1; main(argc,argv) int argc; char **argv; { process_args(argc,argv); init_decks(); last_bet = money / 100.0; if (last_bet < table_min) last_bet = table_min; for (;;) { check_shuffle(); printf("\nMoney = $%.2lf; Enter your bet [%.2lf]: ",money,last_bet); fgets(inpstring,80,stdin); if (sscanf(inpstring,"%lf",&bet) < 1) bet = last_bet; else last_bet = bet; if (bet < table_min) { printf("Illegal bet. Table minimum is $%.2lf.\n",table_min); continue; } money -= bet; play_hand(); } } #define H_BJ_UTIL(c1,c2) (c1 == ACE && cardinfo[c2].bj_val == 10) #define HAS_BJ(c1,c2) (H_BJ_UTIL(c1,c2) || H_BJ_UTIL(c2,c1)) #define MAX_SPLITS 10 /* Note that all bets are subtracted from your money as soon as they are made. */ play_hand() { CARD dealer_up,dealer_down; CARD player_1,player_2; CARD tmp; int dealer_has_bj,player_has_bj; int hand_totals[MAX_SPLITS]; int doubled_down[MAX_SPLITS]; int num_hands = 1; int hand_num; int got_ace,hit_already; char response; int didnt_bust = 0; int dealer_total,dealer_got_ace; int surrendered = 0; player_1 = *cardptr++; dealer_up = *cardptr++; player_2 = *cardptr++; dealer_down = *cardptr++; printf("Dealer shows:\t%c ?\n",cardinfo[dealer_up].display_char); printf("\nYou have:\t%c %c\n", cardinfo[player_1].display_char,cardinfo[player_2].display_char); dealer_has_bj = HAS_BJ(dealer_up,dealer_down); player_has_bj = HAS_BJ(player_1,player_2); if (dealer_up == ACE) { printf("Do you wish to buy insurance? [n]: "); fgets(inpstring,80,stdin); if (sscanf(inpstring,"%1s",&response) < 1) response = 'n'; if (response == 'Y') response = 'y'; if (response == 'y') money -= 0.5 * bet; if (dealer_has_bj) { printf("Dealer's down card was %c -- Blackjack.\n", cardinfo[dealer_down].display_char); if (response == 'y') { printf("Your insurance pays off.\n"); money += 1.5 * bet; } if (player_has_bj) { printf("Since you also have Blackjack, you push.\n"); money += bet; } return; } printf("No Blackjack.\n"); } else if (cardinfo[dealer_up].bj_val == 10 && ten_check) { if (dealer_has_bj) { printf("Dealer's down card was A -- Blackjack.\n"); if (player_has_bj) { printf("Since you also have Blackjack, you push.\n"); money += bet; } return; } printf("No Blackjack.\n"); } if (player_has_bj) { printf("You have Blackjack.\n"); if (dealer_has_bj) /* Up card must be a 10 of some sort */ { printf("Dealer's down card was A."); printf(" Dealer has Blackjack, so you push.\n"); money += bet; return; } printf("Dealer's down card was %c.\n", cardinfo[dealer_down].display_char); money += bet * 2.5; return; } for (hand_num = 0; hand_num < num_hands; hand_num++) { if (num_hands > 1) { player_2 = *cardptr++; printf("Hand %d: You have %c and are dealt %c.\n",hand_num + 1, cardinfo[player_1].display_char, cardinfo[player_2].display_char); } got_ace = player_1 == ACE || player_2 == ACE; hit_already = 0; hand_totals[hand_num] = cardinfo[player_1].bj_val + cardinfo[player_2].bj_val; doubled_down[hand_num] = 0; /* Only one card and no further splitting if you split Aces. */ if (num_hands > 1 && player_1 == ACE) { if (hand_totals[hand_num] < 12) hand_totals[hand_num] += 10; didnt_bust = 1; continue; } for (;;) { printf("Your options are H(Hit), S(Stand)"); if (!hit_already) { if (num_hands == 1 || double_split) printf(", D(Double Down)"); if (player_1 == player_2 && (num_hands == 1 || resplit_pair)) printf(", P(Split)"); if (num_hands == 1 && late_surrender) printf(", L(Late Surrender)"); } printf(": "); do fgets(inpstring,80,stdin); while (sscanf(inpstring,"%1s",&response) < 1); if (isupper(response)) response = tolower(response); switch (response) { case 'h': hit_already = 1; if ((tmp = *cardptr++) == ACE) got_ace = 1; printf("You get:\t%c\n",cardinfo[tmp].display_char); if ((hand_totals[hand_num] += cardinfo[tmp].bj_val) > 21) { printf("Your total is %d -- you busted.\n", hand_totals[hand_num]); break; } continue; case 'd': if (hit_already || num_hands > 1 && !double_split) { printf("Bad option.\n"); continue; } money -= bet; doubled_down[hand_num] = 1; if ((tmp = *cardptr++) == ACE) got_ace = 1; printf("You get:\t%c\n",cardinfo[tmp].display_char); if ((hand_totals[hand_num] += cardinfo[tmp].bj_val) > 21) { printf("Your total is %d -- you busted.\n", hand_totals[hand_num]); break; } /* fall through... */ case 's': if (got_ace && hand_totals[hand_num] < 12) hand_totals[hand_num] += 10; didnt_bust = 1; break; case 'p': if (hit_already || player_1 != player_2 || num_hands > 1 && !resplit_pair) { printf("Bad option.\n"); continue; } num_hands++; hand_num--; money -= bet; break; case 'l': if (hit_already || num_hands > 1 || !late_surrender) { printf("Bad option.\n"); continue; } money += bet / 2.0; surrendered = 1; break; default: printf("Bad option.\n"); continue; } break; } } if (dealer_has_bj) { double tmp = 0; printf("Dealer's down card was A. Dealer had Blackjack all along.\n"); for (hand_num = 0; hand_num < num_hands; hand_num++) { if (hand_num > 1) tmp += bet; if (doubled_down[hand_num]) tmp += bet; } money += tmp; if (tmp > 0.0) printf("$%.2lf has been returned to you.\n",tmp); if (surrendered) money -= bet / 2.0; return; } if (!didnt_bust) { printf("Dealer's down card was %c.\n", cardinfo[dealer_down].display_char); return; } dealer_got_ace = dealer_up == ACE || dealer_down == ACE; dealer_total = cardinfo[dealer_up].bj_val + cardinfo[dealer_down].bj_val; printf("Dealer:\t\t(%c) %c",cardinfo[dealer_up].display_char, cardinfo[dealer_down].display_char); for (;;) { if (dealer_total >= 17 || dealer_got_ace && dealer_total < 12 && (dealer_total >= 8 || !hit_soft17 && dealer_total == 7)) break; tmp = *cardptr++; printf(" %c",cardinfo[tmp].display_char); dealer_total += cardinfo[tmp].bj_val; if (dealer_total > 21) break; } if (dealer_total < 12) dealer_total += 10; printf(" -> %d",dealer_total); if (dealer_total > 21) printf(" -- busted"); printf(".\n"); for (hand_num = 0; hand_num < num_hands; hand_num++) { if (num_hands > 1) printf("Hand %d:\t\t",hand_num + 1); if (hand_totals[hand_num] > 21) printf("busted.\n"); else { printf("Your total:\t%d -- you ",hand_totals[hand_num]); if (hand_totals[hand_num] > dealer_total || dealer_total > 21) { printf("win.\n"); money += 2.0 * bet; if (doubled_down[hand_num]) money += 2.0 * bet; } else if (hand_totals[hand_num] == dealer_total) { printf("push.\n"); money += bet; if (doubled_down[hand_num]) money += bet; } else printf("lose.\n"); } } } process_args(argc,argv) int argc; char **argv; { int tmp; char *rest; #ifndef MSDOS double atof(); #endif while (++argv,--argc) { if (argv[0][0] != '-' && argv[0][0] != '/' || strlen(argv[0]) < 3) show_usage(); if (isupper(tmp = argv[0][1])) tmp = tolower(tmp); rest = &argv[0][2]; switch (tmp) { case 'b': /* money */ money = atof(rest); break; case 'm': /* table minimum */ table_min = atof(rest); break; case 'n': /* number of decks */ num_decks = atoi(rest); break; case 'p': /* pct after which to reshuffle */ reshuffle_percentage = atoi(rest); break; case 't': /* check for bj on tens */ ten_check = atoi(rest); break; case 'h': /* hit on soft 17's */ hit_soft17 = atoi(rest); break; case 'd': /* allow doubling down after splitting */ double_split = atoi(rest); break; case 'r': /* allow resplitting */ resplit_pair = atoi(rest); break; case 'l': /* allow late surrendering */ late_surrender = atoi(rest); break; case 'c': /* show burned card */ show_burn = atoi(rest); break; case 's': /* show remaining deck */ show_pct = atoi(rest); break; default: show_usage(); } } } show_usage() { printf("Usage: bj [-b<num>] [-m<num>] [-n<num>] [-p<num>] [-t<bit>]\n"); printf(" [-h<bit>] [-d<bit>] [-r<bit>] [-l<bit>] [-c<bit>]\n"); printf(" [-s<bit>]\n"); printf("-b: Specify starting bankroll [%.2lf].\n",money); printf("-m: Specify minimum bet allowed [%.2lf].\n",table_min); printf("-n: Specify number of decks [%d].\n",num_decks); printf("-p: Specify percentage of cards after which to reshuffle [%d].\n", reshuffle_percentage); printf("-t: Whether dealer checks for Blackjack on tens [%d].\n", ten_check); printf("-h: Whether dealer hits on soft 17's [%d].\n",hit_soft17); printf("-d: Whether player can double down after splitting [%d].\n", double_split); printf("-r: Whether player can split more than once [%d].\n", resplit_pair); printf("-l: Whether player can late surrender on two cards [%d].\n", late_surrender); printf("-c: Whether to show all burned cards [%d].\n",show_burn); printf("-s: Whether to show the portion of the deck remaining [%d].\n", show_pct); exit(1); }