'===========================================================================
' Subject: BLACK JACK                         Date: 06-29-96 (20:16)       
'  Author: Jonathan Leger                     Code: QB, QBasic, PDS        
'  Origin: leger@mail.dtx.net               Packet: GAMES.ABC
'===========================================================================
DECLARE FUNCTION cval! (c$)

DECLARE SUB makedeck (deck$())
DECLARE SUB drawcard (c$, Xc, Yc)
DECLARE SUB center (s$, l)
DECLARE SUB cline (l)

SCREEN 0, 0, 0
COLOR 7, 0, 0
WIDTH 80, 25
VIEW PRINT 1 TO 25
CLS

OPTION BASE 1
DIM d$(52), hh$(10), ch$(10)

games = 0: score = 0

DO

makedeck d$()

COLOR 15, 1: CLS
COLOR 0, 4: cline 1: COLOR 4, 7: center " Jon-Boy's Black Jack ", 1
COLOR 0, 7: cline 13: LOCATE 13, 5: PRINT "[ Computer's Cards ]";
            cline 25: LOCATE 25, 5: PRINT "[ Your Cards ]";
COLOR 5, 7: LOCATE 13, 30: PRINT "[H]it [S]tay [Q]uit"

hh$(1) = d$(1): hh$(2) = d$(3)
ch$(1) = d$(2): ch$(2) = d$(4)
hs = cval(hh$(1)) + cval(hh$(2))
cs = cval(ch$(1)) + cval(ch$(2))
dp = 5: hp = 3: cp = 3

drawcard ch$(1), 1, 4
drawcard "--", 14, 4

drawcard hh$(1), 1, 16
drawcard hh$(2), 14, 16

DO
   DO
      a$ = ""
      a$ = UCASE$(INKEY$)
   LOOP UNTIL a$ <> ""
        SELECT CASE a$
               CASE "H"
                    hh$(hp) = d$(dp)
                    hs = hs + cval(hh$(hp))
                    drawcard hh$(hp), 1 + ((hp - 1) * 13), 16
                    IF hs > 21 THEN
                       FOR X = 1 TO hp
                          IF MID$(hh$(X), 1, 1) = "A" THEN
                             hh$(X) = "1" + MID$(hh$(X), 2, 1)
                             hs = hs - 10
                             IF hs <= 21 THEN EXIT FOR
                          END IF
                       NEXT X
                    END IF
                    IF hs > 21 THEN
                       FOR X = 1 TO cp
                          drawcard ch$(X), 1 + ((X - 1) * 13), 4
                       NEXT X
                       COLOR 11, 1: cline 14: center "YOU BUSTED!!! <PRESS A KEY>", 14
                       games = games + 1
                       WHILE INKEY$ = "": WEND
                       cline 14: center "Play again (Y/N)?", 14
                       DO
                          a$ = ""
                          a$ = UCASE$(INKEY$)
                       LOOP UNTIL a$ = "Y" OR a$ = "N"
                       IF a$ = "N" THEN
                          COLOR 7, 0, 0: CLS
                          PRINT "Ending scores: [ You ]"; score; "[ Me ]"; games - score
                          PRINT "<PRESS A KEY>": WHILE INKEY$ = "": WEND
                          END
                       END IF
                       EXIT DO
                    END IF
                    hp = hp + 1
                    dp = dp + 1
               CASE "S"
                    m = INT(RND * 5) + 1
                    DO WHILE cs < 13 + m
                       ch$(cp) = d$(dp)
                       cs = cs + cval(ch$(cp))
                       IF cs > 21 THEN
                          FOR X = 1 TO cp
                             IF MID$(ch$(X), 1, 1) = "A" THEN
                                ch$(X) = "1" + MID$(ch$(X), 2, 1)
                                cs = cs - 10
                                IF cs <= 21 THEN EXIT FOR
                             END IF
                          NEXT X
                       END IF
                       IF cs > 21 THEN
                          FOR X = 1 TO cp
                              IF MID$(ch$(X), 1, 1) = "1" THEN
                                 drawcard "A" + MID$(ch$(X), 2, 1), 1 + ((X - 1) * 13), 4
                              ELSE
                                 drawcard ch$(X), 1 + ((X - 1) * 13), 4
                              END IF
                          NEXT X
                          COLOR 11, 1: cline 14: center "I BUSTED! ACK!!! <PRESS A KEY>", 14
                          games = games + 1
                          score = score + 1
                          WHILE INKEY$ = "": WEND
                          cline 14: center "Play again (Y/N)?", 14
                          DO
                             a$ = ""
                             a$ = UCASE$(INKEY$)
                          LOOP UNTIL a$ = "Y" OR a$ = "N"
                          IF a$ = "N" THEN
                             COLOR 7, 0, 0: CLS
                             PRINT "Ending scores: [ You ]"; score; "[ Me ]"; games - score
                             PRINT "<PRESS A KEY>": WHILE INKEY$ = "": WEND
                             END
                          END IF
                          done = 1
                          EXIT DO
                       END IF
                       cp = cp + 1
                       dp = dp + 1
                    LOOP
                   
                    IF done = 1 THEN done = 0: EXIT DO

                    FOR X = 1 TO (cp - 1)
                       IF MID$(ch$(X), 1, 1) = "1" THEN
                          drawcard "A" + MID$(ch$(X), 2, 1), 1 + ((X - 1) * 13), 4
                       ELSE
                          drawcard ch$(X), 1 + ((X - 1) * 13), 4
                       END IF
                    NEXT X
                   
                    FOR X = 1 TO (hp - 1)
                       IF MID$(ch$(X), 1, 1) = "1" THEN
                          drawcard "A" + MID$(hh$(X), 2, 1), 1 + ((X - 1) * 13), 16
                       ELSE
                          drawcard hh$(X), 1 + ((X - 1) * 13), 16
                       END IF
                    NEXT X

                    IF hs > cs THEN
                       COLOR 11, 1: cline 14: center "YOU WIN!!! <PRESS A KEY>", 14
                       score = score + 1
                    ELSEIF hs = cs THEN
                       COLOR 11, 1: cline 14: center "TIE GAME. <PRESS A KEY>", 14
                       games = games - 1
                    ELSE
                       COLOR 11, 1: cline 14: center "I WIN!!! <PRESS A KEY>", 14
                    END IF
                    games = games + 1

                    WHILE INKEY$ = "": WEND
                    cline 14: center "Play again (Y/N)?", 14
                    DO
                       a$ = ""
                       a$ = UCASE$(INKEY$)
                    LOOP UNTIL a$ = "Y" OR a$ = "N"
                    IF a$ = "N" THEN
                       COLOR 7, 0, 0: CLS
                       PRINT "Ending scores: [ You ]"; score; "[ Me ]"; games - score
                       PRINT "<PRESS A KEY>": WHILE INKEY$ = "": WEND
                       END
                    END IF
                    EXIT DO
               CASE "Q"
                    COLOR 11, 1
                    cline 14: center "Are you sure you want to quit (Y/N)?", 14
                    DO
                       a$ = ""
                       a$ = UCASE$(INKEY$)
                    LOOP UNTIL a$ = "Y" OR a$ = "N"
                    IF a$ = "Y" THEN
                       COLOR 7, 0, 0: CLS
                       PRINT "Ending scores: [ You ]"; score; "[ Me ]"; games - score
                       PRINT "<PRESS A KEY>": WHILE INKEY$ = "": WEND
                       END
                    END IF
                    cline 14
        END SELECT
LOOP

LOOP

SUB center (s$, l)
   LOCATE l, ((80 - LEN(s$)) / 2): PRINT s$;
END SUB

SUB cline (l)
   LOCATE l, 1: PRINT STRING$(80, " ");
END SUB

FUNCTION cval (c$)

SELECT CASE MID$(c$, 1, 1)
       CASE "A"
            cval = 11
       CASE "K", "Q", "J", "0"
            cval = 10
       CASE ELSE
            cval = VAL(MID$(c$, 1, 1))
END SELECT

END FUNCTION

SUB drawcard (c$, Xc, Yc)

SELECT CASE MID$(c$, 2, 1)
       CASE "S"
            COLOR 0, 7
            s$ = CHR$(6)
       CASE "C"
            COLOR 0, 7
            s$ = CHR$(5)
       CASE "D"
            COLOR 4, 7
            s$ = CHR$(4)
       CASE "H"
            COLOR 4, 7
            s$ = CHR$(3)
       CASE "-"
            COLOR 0, 4
END SELECT

SELECT CASE MID$(c$, 1, 1)
       CASE "-"
            LOCATE Yc, Xc: PRINT "³         ³"
            LOCATE Yc + 1, Xc: PRINT "³         ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³         ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³         ³"
            LOCATE Yc + 6, Xc: PRINT "³         ³"
       CASE "2"
            LOCATE Yc, Xc: PRINT "³2        ³"
            LOCATE Yc + 1, Xc: PRINT "³   " + s$ + "     ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³         ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³   " + s$ + "     ³"
            LOCATE Yc + 6, Xc: PRINT "³        2³"
       CASE "3"
            LOCATE Yc, Xc: PRINT "³3        ³"
            LOCATE Yc + 1, Xc: PRINT "³   " + s$ + "     ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³   " + s$ + "     ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³   " + s$ + "     ³"
            LOCATE Yc + 6, Xc: PRINT "³        3³"
       CASE "4"
            LOCATE Yc, Xc: PRINT "³4        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³         ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        4³"
       CASE "5"
            LOCATE Yc, Xc: PRINT "³5        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³    " + s$ + "    ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        5³"
       CASE "6"
            LOCATE Yc, Xc: PRINT "³6        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        6³"
       CASE "7"
            LOCATE Yc, Xc: PRINT "³7        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 2, Xc: PRINT "³    " + s$ + "    ³"
            LOCATE Yc + 3, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        7³"
       CASE "8"
            LOCATE Yc, Xc: PRINT "³8        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 2, Xc: PRINT "³    " + s$ + "    ³"
            LOCATE Yc + 3, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 4, Xc: PRINT "³    " + s$ + "    ³"
            LOCATE Yc + 5, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        8³"
       CASE "9"
            LOCATE Yc, Xc: PRINT "³9        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 2, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 3, Xc: PRINT "³ " + s$ + "  " + s$ + "  " + s$ + " ³"
            LOCATE Yc + 4, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 5, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        9³"
       CASE "0"
            LOCATE Yc, Xc: PRINT "³10       ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 2, Xc: PRINT "³ " + s$ + "  " + s$ + "  " + s$ + " ³"
            LOCATE Yc + 3, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 4, Xc: PRINT "³ " + s$ + "  " + s$ + "  " + s$ + " ³"
            LOCATE Yc + 5, Xc: PRINT "³ " + s$ + "     " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³       10³"
       CASE "J"
            LOCATE Yc, Xc: PRINT "³J        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "       ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³         ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³       " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        J³"
       CASE "Q"
            LOCATE Yc, Xc: PRINT "³Q        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "       ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³         ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³       " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        Q³"
       CASE "K"
            LOCATE Yc, Xc: PRINT "³K        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "       ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³         ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³       " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        K³"
       CASE "A"
            LOCATE Yc, Xc: PRINT "³A        ³"
            LOCATE Yc + 1, Xc: PRINT "³ " + s$ + "       ³"
            LOCATE Yc + 2, Xc: PRINT "³         ³"
            LOCATE Yc + 3, Xc: PRINT "³         ³"
            LOCATE Yc + 4, Xc: PRINT "³         ³"
            LOCATE Yc + 5, Xc: PRINT "³       " + s$ + " ³"
            LOCATE Yc + 6, Xc: PRINT "³        A³"
END SELECT


END SUB

SUB makedeck (deck$())

temp$ = " 2S 2C 2D 2H 3S 3C 3D 3H 4S 4C 4D 4H 5S 5C 5D 5H 6S 6C 6D 6H"
temp$ = temp$ + " 7S 7C 7D 7H 8S 8C 8D 8H 9S 9C 9D 9H 0S 0C 0D 0H JS JC JD JH"
temp$ = temp$ + " QS QC QD QH KS KC KD KH AS AC AD AH"

RANDOMIZE TIMER

FOR X = 1 TO 52
   n = INT(RND * (52 - X)) + 1
   deck$(X) = MID$(temp$, ((n - 1) * 3) + 2, 2)
   IF X < 52 THEN
      temp$ = LEFT$(temp$, ((n - 1) * 3) + 1) + RIGHT$(temp$, (LEN(temp$) - (((n - 1) * 3) + 4)))
   END IF
NEXT X


END SUB

