10 REM *** BLACKJACK BY C.D. VAN DER KAAY V1.2 *** 20 RANDOMIZE ' SEED THE RANDOM NUMBER GENERATOR 30 PLAYERSURRD = 0 ' INITIALIZE PLAYER SURRENDERED FLAG 40 DIM CARD(312), VALUE(312), PLAYERCARD(20), DEALERCARD(10) ' DECLARE ARRAYS FOR CARDS AND THEIR VALUES 50 DIM A$(1), UPPERA$(1) ' DECLARE VARIABLES FOR USER INPUT 60 FIRSTMOVE = 1 ' FLAG TO TRACK IF IT IS THE PLAYER'S FIRST MOVE 70 DEALERPLAYD = 0 ' INITIALIZE DEALER PLAYED FLAG 80 PLAYERBUSTD = 0 ' INITIALIZE PLAYER BUSTED FLAG 90 HAND = 0 ' INITIALIZE HAND TRACKING VARIABLE 100 PLAYERSURRS = 0 ' INITIALIZE PLAYER SURRENDER COUNTER 110 GOSUB 1880 ' INITIALIZE STATISTICS 120 GOSUB 2110 ' DISPLAY TITLE SCREEN 130 GOSUB 2340 ' DISPLAY INSTRUCTIONS 140 GOSUB 4580 ' DEALER OPENING MESSAGE SUBROUTINE 150 BANKROLL = 1000 ' INITIALIZE PLAYER'S BANKROLL 160 REM START OF GAME LOOP 170 IF BANKROLL <= 0 THEN GOSUB 3530: GOTO 200 ' END GAME IF BANKROLL IS ZERO OR LESS 180 FIRSTMOVE = 1 ' ENSURE FIRSTMOVE IS SET TO 1 AT THE START OF EACH GAME 190 GOSUB 260 ' MAIN GAME SUBROUTINE 200 INPUT "DO YOU WANT TO PLAY AGAIN? (Y/N) "; A$ 210 GOSUB 3230 ' CONVERT INPUT TO UPPERCASE 220 IF UPPERA$ = "Y" THEN GOTO 170 ' RESTART GAME 230 IF UPPERA$ = "N" THEN GOSUB 3360: GOSUB 3700: GOTO 4740 240 PRINT "INVALID INPUT. PLEASE ENTER Y OR N." 250 GOTO 200 ' ASK AGAIN 260 REM MAIN GAME SUBROUTINE 270 REM INITIALIZE CARDS AND VALUES 280 FOR I = 1 TO 312 '6 DECKS (312 CARDS) 290 CARD(I) = I ' ASSIGN CARD NUMBER TO ARRAY 300 VALUE(I) = (I - 1) MOD 13 + 1 ' ASSIGN CARD VALUE (1 TO 13) 310 IF VALUE(I) > 10 THEN VALUE(I) = 10 ' FACE CARDS ARE WORTH 10 320 IF VALUE(I) = 1 THEN VALUE(I) = 11 ' ACES INITIALLY WORTH 11 330 NEXT I ' MOVE TO THE NEXT CARD 340 REM SHUFFLE CARDS USING FISHER-YATES ALGORITHM 350 FOR I = 312 TO 2 STEP -1 360 J = INT(RND * I) + 1 ' SELECT RANDOM POSITION 370 IF I = J THEN GOTO 410 ' SKIP SWAP IF I AND J ARE THE SAME 380 T = CARD(I) ' SWAP CARDS 390 CARD(I) = CARD(J) 400 CARD(J) = T 410 NEXT I ' MOVE TO THE NEXT CARD 420 REM INITIALIZE GAME STATE 430 DEALERPLAYD = 0 ' RESET DEALER PLAYED FLAG 440 PLAYERBUSTD = 0 ' RESET PLAYER BUSTED FLAG 450 PLAYERTOTAL = 0 460 DEALERTOTAL = 0 470 PLAYERCOUNT = 0 480 DEALERCOUNT = 0 490 NEXTCARD = 1 ' START DEALING FROM THE FIRST CARD 500 PRINT "**************************************" 510 PRINT "CURRENT BANKROLL: $"; BANKROLL 520 INPUT "ENTER YOUR BET: $"; BET$ 530 GOSUB 4040 ' VALIDATE BET INPUT 540 IF VALIDBET = 0 THEN PRINT "INVALID BET! PLEASE ENTER A NUMBER.": GOTO 520 550 BET = VAL(BET$) ' CONVERT VALID STRING INPUT TO A NUMERIC VALUE 560 IF BET < 1 OR BET > BANKROLL THEN PRINT "INVALID BET AMOUNT!": GOTO 520 570 TOTALMONEYBET = TOTALMONEYBET + BET ' UPDATE TOTAL MONEY BET 580 PRINT "**************************************" 590 REM INITIAL DEAL 600 FOR I = 1 TO 2 610 PLAYERCOUNT = PLAYERCOUNT + 1 ' DEAL TO PLAYER 620 PLAYERCARD(PLAYERCOUNT) = CARD(NEXTCARD) 630 PLAYERTOTAL = PLAYERTOTAL + VALUE(PLAYERCARD(PLAYERCOUNT)) 640 NEXTCARD = NEXTCARD + 1 650 IF I = 1 THEN GOTO 660 ELSE GOTO 710 660 DEALERCOUNT = DEALERCOUNT + 1 ' DEAL ONE CARD TO DEALER (VISIBLE CARD) 670 DEALERCARD(DEALERCOUNT) = CARD(NEXTCARD) 680 DEALERTOTAL = DEALERTOTAL + VALUE(DEALERCARD(DEALERCOUNT)) 690 NEXTCARD = NEXTCARD + 1 700 GOTO 710 710 NEXT I ' REPEAT FOR THE SECOND CARD 720 DEALERCOUNT = DEALERCOUNT + 1 ' DEAL SECOND CARD TO DEALER (HIDDEN CARD) 730 DEALERCARD(DEALERCOUNT) = CARD(NEXTCARD) 740 REM DO NOT ADD HIDDEN CARD TO DEALERTOTAL YET 750 NEXTCARD = NEXTCARD + 1 760 REM CHECK IF DEALER AND PLAYER BOTH HAVE 21 AFTER THE INITIAL DEAL 770 DEALERTOTAL = DEALERTOTAL + VALUE(DEALERCARD(2)) ' ADD HIDDEN CARD VALUE TO TOTAL 780 IF DEALERTOTAL = 21 AND PLAYERTOTAL = 21 THEN PRINT "PUSH! BOTH YOU AND THE DEALER HAVE 21.": GOSUB 2070: GOTO 170 790 IF DEALERTOTAL = 21 THEN PRINT "DEALER HAS BLACKJACK! YOU LOSE!": PRINT CHR$(7): BANKROLL = BANKROLL - BET: GOSUB 2270: GOTO 170 800 DEALERTOTAL = DEALERTOTAL - VALUE(DEALERCARD(2)) ' REMOVE HIDDEN CARD VALUE TO RESTORE INITIAL STATE 810 REM PLAYER'S TURN - INITIAL DECISION 820 GOSUB 4110 ' DISPLAY AND DESCRIBE PLAYER'S CARDS 830 IF PLAYERTOTAL = 21 AND PLAYERCOUNT = 2 THEN PRINT "BLACKJACK! YOU WIN!": PRINT CHR$(7): PRINT "==> DEALER: BEGINNER'S LUCK!": BANKROLL = BANKROLL + BET * 2.5: GOSUB 2000: RETURN 840 IF PLAYERTOTAL = 21 THEN PRINT "YOU WIN!": PRINT CHR$(7): BANKROLL = BANKROLL + (BET * 2): GOSUB 2000: RETURN 850 IF PLAYERTOTAL > 21 THEN GOSUB 1090: IF PLAYERTOTAL > 21 THEN RETURN ' ADJUST ACES AND RETURN IF BUST 860 PRINT "DEALER'S VISIBLE CARD: "; VALUE(DEALERCARD(1)) 870 GOSUB 4310 ' CALL THE PLAYER DECISION SUBROUTINE 880 GOTO 1420 ' EXIT PLAYER'S TURN CLEANLY 890 REM PLAYER DOUBLES DOWN 900 IF BET * 2 > BANKROLL THEN PRINT CHR$(7):PRINT "INSUFFICIENT FUNDS TO DOUBLE DOWN!": GOTO 870 910 BET = BET * 2 ' DOUBLE THE BET 920 GOSUB 1220 ' DEAL ONE MORE CARD TO PLAYER AND HANDLE BUST 930 IF PLAYERTOTAL > 21 THEN GOTO 980 ' IF BUSTED, SKIP FINAL CARD MESSAGE 940 PRINT "**************************************" 950 PRINT "YOUR FINAL CARD: "; VALUE(PLAYERCARD(PLAYERCOUNT)) 960 GOSUB 4110 ' DISPLAY AND DESCRIBE PLAYER'S CARDS 970 IF PLAYERTOTAL = 21 THEN PRINT CHR$(7): PRINT "YOU REACHED 21!": GOSUB 1420: RETURN ' CORRECTED MESSAGE FOR NON-BLACKJACK 21 980 RETURN 990 REM PLAYER SURRENDERS 1000 PRINT "YOU CHOSE TO SURRENDER. YOU FORFEIT HALF OF YOUR BET." 1010 PRINT CHR$(7): PRINT "==> DEALER: SOMETIMES IT'S WISE TO CUT YOUR LOSSES." 1020 BANKROLL = BANKROLL - INT(BET / 2) 1030 TOTALMONEYLOST = TOTALMONEYLOST + BET / 2 ' CORRECTLY UPDATE MONEY LOST 1040 PLAYERSURRD = 1 ' SET PLAYER SURRENDERED FLAG 1050 PLAYERSURRS = PLAYERSURRS + 1 ' INCREMENT PLAYER SURRENDER COUNTER 1060 DEALERPLAYD = 1 ' INDICATE THAT DEALER'S TURN SHOULD BE SKIPPED 1070 PRINT "CURRENT BANKROLL: $"; BANKROLL 1080 RETURN 1090 REM ADJUST TOTAL FOR ACES (FOR BOTH PLAYER AND DEALER) 1100 REM ADJUST ACES FOR PLAYER 1110 FOR I = 1 TO PLAYERCOUNT 1120 IF VALUE(PLAYERCARD(I)) = 11 AND PLAYERTOTAL > 21 THEN PLAYERTOTAL = PLAYERTOTAL - 10: VALUE(PLAYERCARD(I)) = 1 1130 NEXT I 1140 REM ADJUST ACES FOR DEALER 1150 FOR I = 1 TO DEALERCOUNT 1160 IF VALUE(DEALERCARD(I)) = 11 AND DEALERTOTAL > 21 THEN GOTO 1180 1170 GOTO 1200 1180 DEALERTOTAL = DEALERTOTAL - 10 1190 VALUE(DEALERCARD(I)) = 1 1200 NEXT I 1210 RETURN 1220 REM DEAL ANOTHER CARD TO PLAYER 1230 PLAYERCOUNT = PLAYERCOUNT + 1 1240 PLAYERCARD(PLAYERCOUNT) = CARD(NEXTCARD) 1250 NEXTCARD = NEXTCARD + 1 1260 PLAYERTOTAL = PLAYERTOTAL + VALUE(PLAYERCARD(PLAYERCOUNT)) 1270 GOSUB 1090 ' ADJUST ACES AFTER ADDING CARD 1280 PRINT "**************************************" 1290 PRINT "NEW CARD: "; VALUE(PLAYERCARD(PLAYERCOUNT)) 1300 GOSUB 4110 ' DISPLAY AND DESCRIBE PLAYER'S CARDS 1310 IF PLAYERTOTAL > 21 THEN GOTO 1330: RETURN ' BUST AND EXIT TO GAME LOOP 1320 RETURN 1330 REM BUST MESSAGE SUBROUTINE 1340 PRINT CHR$(7): PRINT "BUSTED! YOU LOSE!" 1350 GOSUB 4420 1360 BANKROLL = BANKROLL - BET ' DEDUCT THE BET AMOUNT 1370 IF BANKROLL < 0 THEN BANKROLL = 0 1380 GOSUB 2270 ' UPDATE LOSS STATISTICS 1390 PLAYERBUSTD = 1 ' SET PLAYER BUSTED FLAG 1400 FIRSTMOVE = 1 ' RESET FIRST MOVE FLAG 1410 RETURN 1420 REM DEALER'S TURN 1430 IF PLAYERBUSTD = 1 THEN RETURN ' SKIP DEALER'S TURN IF PLAYER BUSTED 1440 IF DEALERPLAYD = 1 THEN RETURN ' SKIP DEALER'S TURN IF ALREADY PLAYED 1450 DEALERPLAYD = 1 ' SET FLAG INDICATING DEALER HAS PLAYED 1460 GOSUB 4660 ' DEALER MY TURN MESSAGE ROUTINE 1470 REM REVEAL THE DEALER'S HIDDEN CARD AND ADD TO TOTAL 1480 DEALERTOTAL = DEALERTOTAL + VALUE(DEALERCARD(2)) ' ADD HIDDEN CARD VALUE 1490 GOSUB 1090 ' ADJUST DEALER'S ACES IF NEEDED 1500 GOSUB 4210 ' DISPLAY DEALER'S CARDS 1510 REM DEALER HITS IF TOTAL IS LESS THAN 17 1520 IF DEALERTOTAL >= 17 THEN GOTO 1630 ' EXIT LOOP IF DEALER'S TOTAL IS 17 OR MORE 1530 DEALERCOUNT = DEALERCOUNT + 1 1540 DEALERCARD(DEALERCOUNT) = CARD(NEXTCARD) 1550 NEXTCARD = NEXTCARD + 1 1560 DEALERTOTAL = DEALERTOTAL + VALUE(DEALERCARD(DEALERCOUNT)) 1570 GOSUB 1090 ' ADJUST ACES AFTER ADDING CARD 1580 PRINT "**************************************" 1590 PRINT "DEALER HITS: "; VALUE(DEALERCARD(DEALERCOUNT)) 1600 GOSUB 4210 ' DISPLAY DEALER'S CARDS 1610 GOTO 1520 ' REPEAT THE LOOP 1620 REM DEALER STANDS, CONTINUE THE GAME 1630 REM CHECK IF DEALER BUSTED 1640 IF DEALERTOTAL > 21 THEN PRINT "DEALER BUSTED! YOU WIN!": PRINT CHR$(7): BANKROLL = BANKROLL + BET: GOSUB 2000: GOTO 200 1650 REM DETERMINE WINNER 1660 PRINT "**************************************" 1670 PRINT "DEALER STANDS WITH TOTAL: "; DEALERTOTAL 1680 PRINT "YOUR TOTAL: "; PLAYERTOTAL 1690 PRINT "**************************************" 1700 IF PLAYERTOTAL > DEALERTOTAL THEN PRINT "YOU WIN!": PRINT CHR$(7): BANKROLL = BANKROLL + BET: PRINT "CURRENT BANKROLL: $"; BANKROLL: GOSUB 2000: GOTO 200 1710 IF DEALERTOTAL > PLAYERTOTAL THEN PRINT "DEALER WINS!": GOSUB 4420: BANKROLL = BANKROLL - BET: PRINT "CURRENT BANKROLL: $"; BANKROLL: GOSUB 2270: GOTO 200 1720 PRINT "IT'S A TIE!": GOSUB 4500: GOSUB 2070: PRINT "CURRENT BANKROLL: $"; BANKROLL: GOTO 200 1730 BANKROLL = BANKROLL + BET ' ADD DOUBLE THE BET SINCE IT WAS ALREADY DEDUCTED ONCE 1740 PRINT "CURRENT BANKROLL: $"; BANKROLL 1750 GOSUB 2000 1760 GOTO 200 1770 IF DEALERTOTAL > PLAYERTOTAL THEN GOTO 1790 1780 GOTO 1840 1790 PRINT "DEALER WINS!": GOSUB 4420 1800 BANKROLL = BANKROLL - BET 1810 PRINT "CURRENT BANKROLL: $"; BANKROLL 1820 GOSUB 2270 1830 GOTO 200 1840 PRINT "IT'S A TIE!": GOSUB 4500 1850 GOSUB 2070 ' UPDATE STATISTICS FOR A TIE 1860 PRINT "CURRENT BANKROLL: $"; BANKROLL 1870 GOTO 200 1880 REM INITIALIZE STATISTICS 1890 TOTALGAMEPLAY = 0 1900 TOTALWINS = 0 1910 TOTALLOSSES = 0 1920 TOTALBLACKJACKS = 0 1930 TOTALBUSTS = 0 1940 HIGHBANKROLL = 1000 1950 TOTALMONEYBET = 0 1960 TOTALMONEYWON = 0 1970 TOTALMONEYLOST = 0 1980 TOTALTIES = 0 1990 RETURN 2000 REM UPDATE WIN STATISTICS 2010 TOTALGAMEPLAY = TOTALGAMEPLAY + 1 ' INCREMENT TOTAL GAMES PLAYED 2020 TOTALWINS = TOTALWINS + 1 ' INCREMENT TOTAL WINS 2030 IF PLAYERTOTAL = 21 AND PLAYERCOUNT = 2 THEN TOTALBLACKJACKS = TOTALBLACKJACKS + 1 ' CHECK FOR BLACKJACK 2040 TOTALMONEYWON = TOTALMONEYWON + BET ' UPDATE TOTAL MONEY WON 2050 IF BANKROLL > HIGHBANKROLL THEN HIGHBANKROLL = BANKROLL ' UPDATE HIGHEST BANKROLL 2060 RETURN 2070 REM UPDATE TIE STATISTICS 2080 TOTALGAMEPLAY = TOTALGAMEPLAY + 1 2090 TOTALTIES = TOTALTIES + 1 ' INCREMENT TOTAL TIES 2100 RETURN 2110 REM TITLE SCREEN SUBROUTINE 2120 PRINT CHR$(12) ' CLEAR SCREEN 2130 PRINT "****************************************" 2140 PRINT "* WELCOME TO BLACKJACK *" 2150 PRINT "* *" 2160 PRINT "* CREATED BY CHRISTOPHER *" 2170 PRINT "* D. VAN DER KAAY *" 2180 PRINT "****************************************" 2190 PRINT "* +----+ +----+ +----+ +----+ *" 2200 PRINT "* | K | | Q | | J | | A | *" 2210 PRINT "* | * | | # | | @ | | % | *" 2220 PRINT "* +----+ +----+ +----+ +----+ *" 2230 PRINT "* *" 2240 PRINT "****************************************" 2250 PRINT "PRESS ENTER TO START THE GAME": INPUT A$ 2260 RETURN 2270 REM UPDATE LOSS STATISTICS 2280 TOTALGAMEPLAY = TOTALGAMEPLAY + 1 ' INCREMENT TOTAL GAMES PLAYED 2290 IF PLAYERSURRD = 0 THEN TOTALLOSSES = TOTALLOSSES + 1 ' INCREMENT TOTAL LOSSES ONLY IF NOT SURRENDERED 2300 IF PLAYERTOTAL > 21 THEN TOTALBUSTS = TOTALBUSTS + 1 ' CHECK FOR BUST 2310 IF PLAYERSURRD = 0 THEN TOTALMONEYLOST = TOTALMONEYLOST + BET ' UPDATE TOTAL MONEY LOST ONLY IF NOT SURRENDERED 2320 PLAYERSURRD = 0 ' RESET PLAYER SURRENDERED FLAG FOR NEXT GAME 2330 RETURN 2340 REM INSTRUCTIONS SUBROUTINE 2350 PRINT CHR$(12) ' CLEAR SCREEN 2360 PRINT "DO YOU WANT TO READ THE INSTRUCTIONS? (Y/N) "; 2370 INPUT A$ 2380 GOSUB 3230 ' CONVERT INPUT TO UPPERCASE 2390 IF UPPERA$ = "Y" THEN GOTO 2430 2400 IF UPPERA$ = "N" THEN RETURN 2410 PRINT "INVALID INPUT. PLEASE ENTER Y OR N." 2420 GOTO 2370 ' ASK AGAIN 2430 PRINT CHR$(12) 2440 PRINT "====================" 2450 PRINT " INSTRUCTIONS " 2460 PRINT "====================" 2470 PRINT 2480 PRINT "1. OBJECTIVE:" 2490 PRINT "GET AS CLOSE TO 21 AS POSSIBLE WITHOUT EXCEEDING IT." 2500 PRINT 2510 PRINT "2. CARD VALUES:" 2520 PRINT "- NUMBER CARDS (2-10) ARE FACE VALUE." 2530 PRINT "- FACE CARDS (J, Q, K) ARE WORTH 10." 2540 PRINT "- ACES CAN BE 1 OR 11." 2550 PRINT 2560 PRINT "PRESS ENTER TO CONTINUE..." 2570 INPUT ""; A$ 2580 PRINT "3. GAMEPLAY:" 2590 PRINT "- BOTH YOU AND THE DEALER START WITH TWO CARDS." 2600 PRINT "- ONE OF THE DEALER'S CARDS IS FACE UP." 2610 PRINT "- YOUR CARDS ARE FACE UP." 2620 PRINT "- THE GAME USES 6 DECKS OF CARDS." 2630 PRINT 2640 PRINT "4. YOUR TURN:" 2650 PRINT "- [H]IT: TAKE ANOTHER CARD." 2660 PRINT "- [S]TAND: END YOUR TURN." 2670 PRINT "- [D]OUBLE DOWN: DOUBLE YOUR BET, TAKE ONE FINAL CARD, AND END YOUR TURN." 2680 PRINT "- [R] SURRENDER: FORFEIT HALF YOUR BET AND END YOUR TURN." 2690 PRINT 2700 PRINT "PRESS ENTER TO CONTINUE..." 2710 INPUT ""; A$ 2720 PRINT CHR$(12) 2730 PRINT "5. DEALER'S TURN:" 2740 PRINT "- DEALER HITS UNTIL THE TOTAL IS 17 OR MORE." 2750 PRINT "- DEALER MUST STAND ON 17 OR HIGHER." 2760 PRINT "- DEALER'S ACES ADJUST FROM 11 TO 1 IF NECESSARY TO AVOID BUSTING." 2770 PRINT 2780 PRINT "6. WINNING:" 2790 PRINT "- IF YOUR TOTAL IS CLOSER TO 21 THAN THE DEALER'S, YOU WIN." 2800 PRINT "- IF THE DEALER'S TOTAL IS CLOSER TO 21, THE DEALER WINS." 2810 PRINT "- A TIE RESULTS IN NO CHANGE TO THE BANKROLL." 2820 PRINT 2830 PRINT "PRESS ENTER TO CONTINUE..." 2840 INPUT ""; A$ 2850 PRINT CHR$(12) 2860 PRINT "7. SPECIAL RULES:" 2870 PRINT "- THE GAME USES 6 DECKS OF CARDS." 2880 PRINT "- NATURAL BLACKJACK (21 WITH THE FIRST TWO CARDS) PAYS 3:2." 2890 PRINT " EXAMPLE: IF YOU BET $100 AND GET A NATURAL BLACKJACK, YOU WIN $150 PLUS YOUR ORIGINAL BET, 2900 PRINT " FOR A TOTAL PAYOUT OF $250." 2910 PRINT "- REGULAR 21 (WITH MORE THAN TWO CARDS) PAYS EVEN MONEY." 2920 PRINT " EXAMPLE: IF YOU BET $100 AND REACH A TOTAL OF 21 WITH MORE THAN TWO CARDS, YOU WIN $100." 2930 PRINT "- IF YOU BUST (EXCEED 21), YOU AUTOMATICALLY LOSE." 2940 PRINT " EXAMPLE: IF YOU BET $200 AND YOUR HAND TOTAL EXCEEDS 21, YOU LOSE $200." 2950 PRINT "- DEALER BUSTS IF THE TOTAL EXCEEDS 21." 2960 PRINT " EXAMPLE: IF YOU BET $150 AND THE DEALER BUSTS, YOU WIN $150." 2970 PRINT 2980 PRINT "PRESS ENTER TO CONTINUE..." 2990 INPUT ""; A$ ' WAIT FOR PLAYER TO PRESS ENTER 3000 PRINT " EXAMPLE: IF YOU BET $150 AND THE DEALER BUSTS, YOU WIN $150." 3010 PRINT "- DOUBLE DOWN: YOU CAN DOUBLE YOUR BET, TAKE ONE FINAL CARD, AND END YOUR TURN." 3020 PRINT " EXAMPLE: IF YOU BET $50 AND DOUBLE DOWN, YOU BET AN ADDITIONAL $50." 3030 PRINT " IF YOU WIN WITH THIS HAND, YOUR TOTAL BET ($100) IS PAID OUT." 3040 PRINT "- SURRENDER: FORFEIT HALF YOUR BET AND END YOUR TURN." 3050 PRINT " EXAMPLE: IF YOU BET $80 AND SURRENDER, YOU LOSE $40 AND RETAIN $40." 3060 PRINT "- IF THE DEALER HAS A NATURAL 21 (BLACKJACK) AND YOU DO NOT, YOU LOSE YOUR BET." 3070 PRINT " EXAMPLE: IF YOU BET $100 AND THE DEALER HAS A NATURAL 21 WHIILE YOU DO NOT," 3080 PRINT " YOU LOSE $100." 3090 PRINT "- IF BOTH YOU AND THE DEALER HAVE A NATURAL 21, IT IS A PUSH (TIE)." 3100 PRINT 3110 PRINT "PRESS ENTER TO CONTINUE..." 3120 INPUT ""; A$ ' WAIT FOR PLAYER TO PRESS ENTER 3130 PRINT "8. TIPS:" 3140 PRINT "- STAND IF YOUR TOTAL IS 12-16 AND DEALER SHOWS 2-6." 3150 PRINT "- HIT IF YOUR TOTAL IS 12-16 AND DEALER SHOWS 7 OR MORE." 3160 PRINT "- ALWAYS HIT IF YOUR TOTAL IS 11 OR LESS." 3170 PRINT "- DOUBLE DOWN WITH A TOTAL OF 10 OR 11 WHEN DEALER SHOWS LOWER THAN 10." 3180 PRINT "- SURRENDER IF THE SITUATION LOOKS UNFAVORABLE AND SAVE HALF YOUR BET." 3190 PRINT 3200 PRINT "PRESS ENTER TO CONTINUE..." 3210 INPUT ""; A$ ' WAIT FOR PLAYER TO PRESS ENTER 3220 RETURN 3230 REM CONVERT INPUT TO UPPERCASE 3240 UPPERA$ = "" 3250 FOR I = 1 TO LEN(A$) 3260 A = ASC(MID$(A$, I, 1)) ' GET ASCII CODE OF CHARACTER 3270 IF A >= 97 THEN GOTO 3290 3280 GOTO 3310 3290 IF A <= 122 THEN A = A - 32 3300 GOTO 3330 3310 UPPERA$ = UPPERA$ + CHR$(A) 3320 GOTO 3340 3330 UPPERA$ = UPPERA$ + CHR$(A) 3340 NEXT I 3350 RETURN 3360 REM EXIT SCREEN SUBROUTINE 3370 PRINT CHR$(12) ' CLEAR SCREEN 3380 PRINT "CURRENT BANKROLL: $"; BANKROLL 3390 PRINT 3400 PRINT "*********************************" 3410 PRINT "* *" 3420 PRINT "* THINK YOU'VE HAD *" 3430 PRINT "* ENOUGH FOR TODAY? *" 3440 PRINT "* *" 3450 PRINT "* THANKS FOR PLAYING *" 3460 PRINT "* BLACKJACK WITH ME! *" 3470 PRINT "* *" 3480 PRINT "*********************************" 3490 PRINT "CREATED BY CHRISTOPHER D. VAN DER KAAY" 3500 PRINT 3510 PRINT "SEE YOU NEXT TIME—IF YOU DARE!" 3520 RETURN 3530 REM BANKRUPT SCREEN SUBROUTINE 3540 PRINT CHR$(12) ' CLEAR SCREEN 3550 PRINT "CURRENT BANKROLL: $"; BANKROLL 3560 PRINT 3570 PRINT "*********************************" 3580 PRINT "* *" 3590 PRINT "* BANKRUPT! *" 3600 PRINT "* GAME OVER! *" 3610 PRINT "* *" 3620 PRINT "*********************************" 3630 PRINT "LOOKS LIKE YOU'RE OUT OF FUNDS. TOUGH LUCK!" 3640 PRINT "DON'T LET IT GET TO YOU. EVEN THE BEST HAVE BAD DAYS." 3650 PRINT "REMEMBER, BLACKJACK IS ALL ABOUT STRATEGY AND KEEPING YOUR COOL." 3660 PRINT "COME BACK AND TRY AGAIN. MAYBE NEXT TIME YOU'LL HAVE WHAT IT TAKES TO BEAT ME!" 3670 PRINT CHR$(7) 3680 GOSUB 3700 ' ASK TO VIEW STATISTICS 3690 END 3700 REM ASK TO VIEW STATISTICS 3710 INPUT "DO YOU WANT TO VIEW GAME STATISTICS? (Y/N) "; A$ 3720 GOSUB 3230 ' CONVERT INPUT TO UPPERCASE 3730 IF UPPERA$ = "Y" THEN GOSUB 3770: RETURN 3740 IF UPPERA$ = "N" THEN RETURN 3750 PRINT "INVALID INPUT. PLEASE ENTER Y OR N." 3760 GOTO 3710 ' ASK AGAIN 3770 REM DISPLAY GAME STATISTICS 3780 PRINT CHR$(12) ' CLEAR SCREEN 3790 PRINT "*********************************" 3800 PRINT " PLAYER GAME STATISTICS" 3810 PRINT "* TOTAL GAMES PLAYED: "; TOTALGAMEPLAY 3820 PRINT "* TOTAL WINS: "; TOTALWINS 3830 PRINT "* TOTAL LOSSES: "; TOTALLOSSES 3840 PRINT "* TOTAL TIES: "; TOTALTIES 3850 PRINT "* TOTAL BLACKJACKS: "; TOTALBLACKJACKS 3860 PRINT "* TOTAL BUSTS: "; TOTALBUSTS 3870 PRINT "* TOTAL SURRENDERS: "; PLAYERSURRS 3880 PRINT "*********************************" 3890 PRINT " FINANCIAL STATS" 3900 PRINT "* HIGHEST BANKROLL: $"; HIGHBANKROLL 3910 PRINT "* TOTAL MONEY BET: $"; TOTALMONEYBET 3920 PRINT "* TOTAL MONEY WON: $"; TOTALMONEYWON 3930 PRINT "* TOTAL MONEY LOST: $"; TOTALMONEYLOST 3940 PRINT "*********************************" 3950 PRINT "PRESS ENTER TO CONTINUE..." 3960 INPUT ""; A$ ' WAIT FOR PLAYER TO PRESS ENTER 3970 RETURN 3980 REM ADJUST DEALER'S TOTAL FOR ACES 3990 FOR I = 1 TO DEALERCOUNT 4000 IF VALUE(DEALERCARD(I)) = 11 THEN GOTO 4010 4010 IF DEALERTOTAL > 21 THEN DEALERTOTAL = DEALERTOTAL - 10: VALUE(DEALERCARD(I)) = 1 4020 NEXT I 4030 RETURN 4040 REM VALIDATE BET INPUT 4050 VALIDBET = 1 ' ASSUME INPUT IS VALID INITIALLY 4060 FOR I = 1 TO LEN(BET$) 4070 CHAR$ = MID$(BET$, I, 1) 4080 IF CHAR$ < "0" OR CHAR$ > "9" THEN VALIDBET = 0: GOTO 4100 4090 NEXT I 4100 RETURN 4110 REM DISPLAY AND DESCRIBE PLAYER'S CARDS 4120 PRINT "**************************************" 4130 PRINT "YOUR CARDS: "; 4140 FOR I = 1 TO PLAYERCOUNT 4150 PRINT VALUE(PLAYERCARD(I)); 4160 PRINT " "; 4170 NEXT I 4180 PRINT " TOTAL: "; PLAYERTOTAL 4190 PRINT "**************************************" 4200 RETURN 4210 REM DISPLAY DEALER'S CARDS 4220 PRINT "**************************************" 4230 PRINT "DEALER'S CARDS: "; 4240 FOR I = 1 TO DEALERCOUNT 4250 PRINT VALUE(DEALERCARD(I)); 4260 PRINT " "; 4270 NEXT I 4280 PRINT " TOTAL: "; DEALERTOTAL 4290 PRINT "**************************************" 4300 RETURN 4310 REM PLAYER'S DECISION SUBROUTINE 4320 PRINT "DO YOU WANT TO [H]IT, [S]TAND, [D]OUBLE DOWN, [R] SURRENDER? "; 4330 INPUT A$ 4340 GOSUB 3230 ' CONVERT INPUT TO UPPERCASE 4350 IF FIRSTMOVE = 0 AND (UPPERA$ = "D" OR UPPERA$ = "R") THEN PRINT CHR$(7): PRINT "==> DEALER: YOU CAN ONLY PERFORM THIS ACTION ON YOUR FIRST MOVE!": GOTO 4320 4360 IF UPPERA$ <> "H" AND UPPERA$ <> "S" AND UPPERA$ <> "D" AND UPPERA$ <> "R" THEN PRINT CHR$(7): PRINT "==> DEALER: INVALID INPUT. PLEASE ENTER H, S, D, OR R.": GOTO 4320 4370 IF UPPERA$ = "H" THEN GOSUB 1220: FIRSTMOVE = 0: IF PLAYERTOTAL > 21 THEN RETURN ELSE GOTO 4310 4380 IF UPPERA$ = "S" THEN PRINT CHR$(7): PRINT "==> DEALER: PLAYING IT SAFE, HUH?": FIRSTMOVE = 0: GOSUB 1420: RETURN 4390 IF UPPERA$ = "D" THEN GOSUB 890: FIRSTMOVE = 0: RETURN 4400 IF UPPERA$ = "R" THEN GOSUB 990: FIRSTMOVE = 0: RETURN 4410 RETURN 4420 REM DEALER WIN MESSAGES SUBROUTINE 4430 MESSAGENUMB = INT(RND * 5) + 1 4440 ON MESSAGENUMB GOTO 4450, 4460, 4470, 4480, 4490 4450 PRINT CHR$(7): PRINT "==> DEALER: BETTER LUCK NEXT TIME!": RETURN 4460 PRINT CHR$(7): PRINT "==> DEALER: YOU CAN'T WIN THEM ALL!": RETURN 4470 PRINT CHR$(7): PRINT "==> DEALER: CLOSE, BUT NO CIGAR!": RETURN 4480 PRINT CHR$(7): PRINT "==> DEALER: MAYBE NEXT TIME!": RETURN 4490 PRINT CHR$(7): PRINT "==> DEALER: THE HOUSE ALWAYS WINS!": RETURN 4500 REM DEALER TIE MESSAGES SUBROUTINE 4510 MESSAGENUMB = INT(RND * 5) + 1 4520 ON MESSAGENUMB GOTO 4530, 4540, 4550, 4560, 4570 4530 PRINT CHR$(7): PRINT "==> DEALER: A TIE? HOW BORING!": RETURN 4540 PRINT CHR$(7): PRINT "==> DEALER: NO WINNER THIS TIME!": RETURN 4550 PRINT CHR$(7): PRINT "==> DEALER: WELL, THAT WAS UNEXPECTED!": RETURN 4560 PRINT CHR$(7): PRINT "==> DEALER: A DRAW? THAT'S RARE!": RETURN 4570 PRINT CHR$(7): PRINT "==> DEALER: A STALEMATE! INTERESTING!": RETURN 4580 REM DEALER OPENING MESSAGE SUBROUTINE 4590 MESSAGENUMB = INT(RND * 5) + 1 4600 ON MESSAGENUMB GOTO 4610, 4620, 4630, 4640, 4650 4610 PRINT CHR$(7): PRINT "==> DEALER: LET'S SEE IF YOU CAN BEAT ME TODAY!": RETURN 4620 PRINT CHR$(7): PRINT "==> DEALER: LET'S PLAY. BUT DON'T GET YOUR HOPES UP TOO HIGH!": RETURN 4630 PRINT CHR$(7): PRINT "==> DEALER: THINK YOU CAN OUTSMART ME? LET'S SEE WHAT YOU'VE GOT!": RETURN 4640 PRINT CHR$(7): PRINT "==> DEALER: I'VE SEEN BETTER PLAYERS. PROVE ME WRONG!": RETURN 4650 PRINT CHR$(7): PRINT "==> DEALER: READY TO LOSE AGAIN? BRING IT ON!": RETURN 4660 REM DEALER MY TURN MESSAGE ROUTINE 4670 MESSAGENUMB = INT(RND * 5) + 1 4680 ON MESSAGENUMB GOTO 4690, 4700, 4710, 4720, 4730 4690 PRINT CHR$(7): PRINT "==> DEALER: ALRIGHT, MY TURN!": RETURN 4700 PRINT CHR$(7): PRINT "==> DEALER: LET ME TAKE OVER FROM HERE!": RETURN 4710 PRINT CHR$(7): PRINT "==> DEALER: NOW WATCH A PRO IN ACTION!": RETURN 4720 PRINT CHR$(7): PRINT "==> DEALER: STEP ASIDE, IT'S MY TURN!": RETURN 4730 PRINT CHR$(7): PRINT "==> DEALER: TIME FOR ME TO TAKE THE SPOTLIGHT!": RETURN 4740 REM END OF GAME AND CREDITS 4750 PRINT CHR$(12) ' CLEAR SCREEN 4760 PRINT "*************************************" 4770 PRINT "* *" 4780 PRINT "* THANK YOU FOR PLAYING *" 4790 PRINT "* *" 4800 PRINT "* BLACKJACK! *" 4810 PRINT "* *" 4820 PRINT "* CREATED BY CHRISTOPHER *" 4830 PRINT "* D. VAN DER KAAY *" 4840 PRINT "* *" 4850 PRINT "*************************************" 4860 END