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