1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-09-04 11:10:15 +00:00
qb64/programs/samples/pete/bj.bas
SMcNeill 6e01fc8dce Altered string compare routines (<,<=,>,>=) so they don't give false results with CHR$(0).
Added new _STRCMP and _STRICMP commands for quick string comparisons.
Cleaned up QB64 to finish removing the QUI (quick user insert) code and folders.
Altered UCASE and LCASE routines to be faster in some situations for us.
2014-09-22 08:19:03 -04:00

350 lines
No EOL
8.4 KiB
QBasic

REM M-AZN BLACKJACK
REM May 27, 2005
REM by M-AZN
REM
REM dealer hits on 16, stands on 17.
REM bet*0.5 bonus for blackjack (Ace and value-10 card)
REM when betting, you can press ENTER to bid last bet--
REM unless you cant afford it. double-down doubles your bet for that play.
REM to quit, enter -1 when betting, or enter q or Q at hit/stand/double.
REM ENTER is same as stand. S to stand. H to hit. D to double down.
REM can't split (yet).
startgame:
'INITIALIZE
RANDOMIZE TIMER
heart$ = CHR$(3): diamond$ = CHR$(4): club$ = CHR$(5): spade$ = CHR$(6)
playerquit = 0
oldbet = 10
maxhand = 13
DIM playercards(maxhand), dealercards(maxhand), deck(52)
'MAIN LOOP
DO
CLS
playermoney = 500
GOSUB splashscreen
GOSUB shuffledeck
'deckindex = 1
GOSUB rungame
LOOP
END
rungame:
'GAME LOOP
DO
COLOR 4: PRINT " "; heart$;
COLOR 2: PRINT " "; club$;
COLOR 5: PRINT " "; diamond$;
COLOR 3: PRINT " "; spade$
COLOR 7
playercardindex = 0
dealercardindex = 0
done = 0
BLACKJACK = 0
GOSUB getbet
GOSUB getnewhand
GOSUB printhand
GOSUB printdealerhand
GOSUB checkplayerhand
GOSUB getcommand
GOSUB comparehands
IF playermoney = 0 THEN
GOSUB playerlost
EXIT DO
END IF
LOOP
RETURN
getbet:
IF oldbet > playermoney THEN oldbet = playermoney
IF oldbet = 0 THEN oldbet = -1
DO
COLOR 10
PRINT "You have $"; playermoney
COLOR 7
PRINT "Your bet (-1 to quit) (ENTER = $"; oldbet; ")";
INPUT playerbet
IF playerbet = 0 THEN playerbet = oldbet
LOOP UNTIL playerbet <= playermoney
IF playerbet = -1 THEN END
oldbet = playerbet
playermoney = playermoney - playerbet
RETURN
getcommand:
WHILE done = 0
PRINT "Your hand value: "; playerhandvalue
PRINT "[H]it [S]tand ";
IF playercardindex = 2 THEN PRINT "[D]ouble";
INPUT nkey$
SELECT CASE nkey$
CASE "quit", "q", "Q"
END
CASE "h"
GOSUB getnewplayercard
CASE "s", ""
done = 1
CASE "d"
IF playercardindex = 2 THEN
IF playermoney >= playerbet THEN
playermoney = playermoney - playerbet
playerbet = playerbet * 2
done = 1
GOSUB getnewplayercard
ELSE
PRINT "Not enough money to double down."
END IF
END IF
END SELECT
GOSUB printhand
GOSUB checkplayerhand
WEND
RETURN
shuffledeck:
'first card
deck(1) = INT(RND * 52)
deckindex = 2
DO
DO
cardok = 1
newcard = INT(RND * 52)
FOR j = 1 TO (deckindex - 1) STEP 1
IF newcard = deck(j) THEN
cardok = 0
EXIT FOR
END IF
NEXT j
LOOP UNTIL cardok = 1
deck(deckindex) = newcard
deckindex = deckindex + 1
LOOP UNTIL deckindex > 52
deckindex = 1
PRINT "* * * DECK SHUFFLED * * *"
RETURN
getnewcard:
IF deckindex > 52 THEN
GOSUB shuffledeck
deckindex = 1
END IF
newcard = deck(deckindex)
deckindex = deckindex + 1
RETURN
getnewplayercard:
GOSUB getnewcard
playercardindex = playercardindex + 1
playercards(playercardindex) = newcard
RETURN
getnewdealercard:
GOSUB getnewcard
dealercardindex = dealercardindex + 1
dealercards(dealercardindex) = newcard
RETURN
getnewhand:
IF (deckindex > 42) THEN GOSUB shuffledeck
GOSUB getnewplayercard
GOSUB getnewdealercard
GOSUB getnewplayercard
GOSUB getnewdealercard
RETURN
printhand:
PRINT "Your cards:"
FOR i = 1 TO playercardindex
d = playercards(i) MOD 13 + 1
s% = playercards(i) \ 13
GOSUB printcard
NEXT i
RETURN
printdealerhand:
PRINT "Dealer cards:"
FOR i = 1 TO dealercardindex
d = dealercards(i) MOD 13 + 1
s% = dealercards(i) \ 13
IF done = 0 AND i > 1 THEN
ELSE GOSUB printcard
END IF
NEXT i
RETURN
printcard:
SELECT CASE d
CASE 1: PRINT " A ";
CASE 2 TO 9: PRINT " "; d;
CASE 10: PRINT d;
CASE 11: PRINT " J ";
CASE 12: PRINT " Q ";
CASE 13: PRINT " K ";
END SELECT
REM PRINT "s"; s%
SELECT CASE s%
CASE 0
COLOR 4
PRINT heart$;
COLOR 7
CASE 1
COLOR 5
PRINT diamond$;
COLOR 7
CASE 2
COLOR 2
PRINT club$;
COLOR 7
CASE 3
COLOR 3
PRINT spade$;
COLOR 7
END SELECT
PRINT
RETURN
checkplayerhand:
rerun = 0
acefound = 0
playerdone = 0
WHILE playerdone = 0
playerhandvalue = 0
FOR i = 1 TO playercardindex
cardvalue = playercards(i) MOD 13 + 1
IF cardvalue > 10 THEN cardvalue = 10
IF cardvalue = 1 AND acefound = 0 THEN
cardvalue = 11
acefound = 1
END IF
playerhandvalue = playerhandvalue + cardvalue
NEXT i
playerdone = 1
IF playerhandvalue > 21 AND acefound = 0 THEN done = 1
IF playerhandvalue = 21 THEN
done = 1
IF playercardindex = 2 THEN
COLOR 15: PRINT "BLACKJACK ";
COLOR 13: PRINT "BLACKJACK ";
COLOR 11: PRINT "BLACKJACK ";
COLOR 9: PRINT "BLACKJACK "
COLOR 7
BLACKJACK = 1
END IF
END IF
IF playerhandvalue > 21 AND acefound = 1 THEN playerdone = 0
IF rerun = 1 THEN
IF playerhandvalue > 21 THEN done = 1
playerdone = 1
END IF
rerun = 1
WEND
RETURN
checkdealerhand:
rerun = 0
acefound = 0
donehere = 0
WHILE donehere = 0
dealerhandvalue = 0
FOR i = 1 TO dealercardindex
cardvalue = dealercards(i) MOD 13 + 1
IF cardvalue > 10 THEN cardvalue = 10
IF cardvalue = 1 AND acefound = 0 THEN
cardvalue = 11
acefound = 1
END IF
dealerhandvalue = dealerhandvalue + cardvalue
NEXT i
donehere = 1
IF acefound = 1 AND dealerhandvalue > 21 THEN donehere = 0
IF rerun = 1 THEN donehere = 1
rerun = 1
WEND
RETURN
comparehands:
GOSUB checkdealerhand
WHILE dealerhandvalue < 17 AND playerhandvalue <= 21 AND BLACKJACK = 0
GOSUB getnewdealercard
GOSUB checkdealerhand
WEND
GOSUB printdealerhand
PRINT "Your hand value "; playerhandvalue
PRINT "Dealer hand value "; dealerhandvalue
IF playerhandvalue > 21 THEN
COLOR 6
PRINT "You busted"
COLOR 7
ELSEIF dealerhandvalue > 21 THEN
PRINT "Dealer busted"
GOSUB playerwins
ELSEIF BLACKJACK = 1 THEN
COLOR 15
PRINT "You have Blackjack!"
COLOR 7
IF dealerhandvalue = 21 AND dealercardindex = 2 THEN
COLOR 15
PRINT "Dealer has Blackjack!"
COLOR 14
PRINT "Push"
COLOR 7
ELSE
GOSUB playerwins
END IF
ELSEIF dealerhandvalue > playerhandvalue THEN
COLOR 6
PRINT "You lost"
COLOR 7
ELSEIF dealerhandvalue < playerhandvalue THEN
PRINT "You won"
GOSUB playerwins
ELSEIF dealerhandvalue = playerhandvalue THEN
COLOR 14
PRINT "Push"
COLOR 7
playermoney = playermoney + playerbet
END IF
RETURN
playerwins:
bonus = 0
IF BLACKJACK = 1 THEN bonus = playerbet / 2
COLOR 13
PRINT "You win $"; playerbet + bonus
IF bonus THEN PRINT " ($"; bonus; "bonus)"
COLOR 7
playermoney = playermoney + 2 * playerbet + bonus
RETURN
playerlost:
PRINT : PRINT "ALL YOUR MONEY ARE BELONG TO US"
DO
INPUT "Do you want to play again"; nkey$
SELECT CASE nkey$
CASE "n", "N", "no"
END
CASE "y", "Y", "yes"
playerquit = 1
EXIT DO
END SELECT
LOOP
RETURN
splashscreen:
LOCATE 3, 38
COLOR 13: PRINT "M-AZN"
LOCATE 5, 36
COLOR 1: PRINT "B";
COLOR 2: PRINT "L";
COLOR 3: PRINT "A";
COLOR 4: PRINT "C";
COLOR 5: PRINT "K";
COLOR 6: PRINT "J";
COLOR 7: PRINT "A";
COLOR 8: PRINT "C";
COLOR 9: PRINT "K";
COLOR 7
PRINT : PRINT
RETURN