\ BLACKJACK a small program converted from FigForth 79.
\ What it does is obvious, so I won't bother to explain
\ further here.
\ 4tH conversion - Copyright 2005,2008 J.L. Bezemer
TRUE CONSTANT IGNORENUMBERS
INCLUDE lib/interprt.4th
INCLUDE lib/choose.4th
INCLUDE lib/enter.4th
VARIABLE CARDS VARIABLE HAND ( comp hand, player hand )
VARIABLE CARD VARIABLE TESTV ( last card/exit the loop flag )
VARIABLE BET VARIABLE TOTAL ( bet & win/losses )
VARIABLE HACE VARIABLE CACE ( human/computer ace flags )
: .$ DUP ABS <# #S [CHAR] $ HOLD SIGN #> TYPE ;
: HELLO ." Welcome to Forth Blackjack. " CR ;
: 1$ ." Ace converted to 11." CR ;
: 2$ ." Ace converted to 1." CR ;
: DRAW ." We have both busted!" CR ;
: LOST TYPE CR BET @ NEGATE TOTAL +! ;
: CARDS-HAND CARDS @ HAND @ ;
: CARDS-21? CARDS @ 21 > ;
( the strings obviously! )
( BLACKJACK ) ( win, lose, draw and deal )
: WIN ." Hand won." CR BET @ DUP TOTAL +! 2/ TOTAL +! ;
( deal - randomly generate next card )
: DEAL ( -- n ) 13 CHOOSE 1+ 10 MIN DUP CARD ! ;
( BLACKJACK ) ( shift aces to greatest advantage )
: ACE1 HACE @ 0 > IF -1 HACE +! -10 HAND +! 2$ THEN ;
( change ace back to 1 )
: ACE2 CARD @ 1 = IF 1 HACE +! 10 HAND +! 1$ THEN ;
( change an ace to 11 if dealt )
: ACEH1 HAND @ 21 > IF ACE1 ELSE ACE2 THEN 0 CARD ! ;
( change ace back to 1 if a bust occurs )
: ACEH ACEH1 ACEH1 ;
( do above twice for multiple aces for the human player )
: ACE3 CACE @ 0 > IF -1 CACE +! -10 CARDS +! 2$ THEN ;
: ACE4 CARD @ 1 = IF 1 CACE +! 10 CARDS +! 1$ THEN ;
: ACEC1 CARDS-21? IF ACE3 ELSE ACE4 THEN 0 CARD ! ;
: ACEC ACEC1 ACEC1 ;
( do the same for the computer )
( BLACKJACK ) ( compare the two hands )
: COMP4 CARDS-HAND = IF S" Push!" LOST ELSE WIN THEN ;
( if both equal, push. Else player wins )
: COMP3 CARDS-HAND > IF S" Hand lost." LOST ELSE COMP4 THEN ;
( if computer's hand is greater, player loses)
: COMP2 CARDS-21? IF WIN ELSE COMP3 THEN ;
( if computer busts, human wins )
: COMP1 CARDS-21? IF DRAW ELSE S" Hand lost." LOST THEN ;
( if both human & computer busts, it's a draw )
: COMP HAND @ 21 > IF COMP1 ELSE COMP2 THEN ;
( decide if we need to check computer for busting )
( BLACKJACK ) ( play action words )
: HIT CR DEAL DUP ." Card drawn " . HAND +! ACEH ." Total="
HAND @ . CR ; ( deal a card to the player )
: SHOW CR ." Dealer has " DEAL DUP . CARDS +! ACEC ." Total="
CARDS @ . CR ; ( deal a card to the computer )
: STAND SHOW CARDS @ 16 < IF BEGIN DEAL DUP ." Dealer draws "
. CARDS +! ACEC ." Total=" CARDS @ DUP . CR 16 > UNTIL
THEN 1 TESTV ! ;
( deal cards to computer until 17 or higher is reached )
: STOP 2 TESTV ! ; ( halt by setting flag )
:NONAME ." I don't know what '" TYPE ." ' means" CR ;
IS NOTFOUND
( if you enter an invalid command )
CREATE WORDLIST
," HIT" ' HIT ,
," STAND" ' STAND ,
," STOP" ' STOP ,
," SHOW" ' SHOW ,
NULL ,
WORDLIST TO DICTIONARY
( BLACKJACK ) ( player interface )
: GETB BEGIN CR ." What is your bet ($10 min)" CR ." ? " ENTER
DUP BET ! 9 > UNTIL ;
( get the amount of a bet )
: SETUP 0 TESTV ! 0 CACE ! 0 HACE ! HELLO DEAL DUP CARDS !
." Dealer showing " . ACEC DEAL DUP HAND ! CR ." First card "
. ACEH DEAL DUP HAND +! ." Top card " . ACEH ." Total="
HAND @ . CR ; ( deal out starting cards and show stats )
( BLACKJACK ) ( player interface )
: PLAY1 SETUP BEGIN ." Hit, Stand, Show or Stop?" CR ." ? "
REFILL DROP INTERPRET TESTV @ 0 > UNTIL ;
( perform play for one hand )
: PLAY HELLO GETB BEGIN CR CR PLAY1 TESTV @ 2 < IF
COMP THEN TOTAL @ ." Total of bets: " .$ CR
TESTV @ 2 = UNTIL ; ( perform play until told to quit )
( BLACKJACK ) ( say hello with basic intrustions )
: HI! ." Blackjack Vers. 1.0 is now loaded ." CR
." Program by Mary Bell 09/12/83" CR
." Dealer pays 1 & 1/2 bet for greater hand and takes pushes."
CR ." Dealer must hit on 16 and stand on 17." CR
." Aces are automatically converted to greatest advantage." CR
;
: BLACKJACK HI! PLAY ;
BLACKJACK
|