| While we are on the subject of Blackjack, the following program calculates
the optimal static (non-counting) Blackjack strategy for a game with an
infinite number of decks, as well as the expected value of the game. Its
probably not useful in resolving the "streak" problem (but intuitively, the
betting system in .0 is a lot of hooey) but some of you may find it useful.
Caveats:
1) Its written in FORTRAN - language snobs should hit "n" immediately!
2) Its 7 years old and I can't vouch for all the algorithms used, although
I do remember it came out with the same strategy as the old Rand
Corporation program for an infinite number of decks.
Richie
C
C BLACKJACK DECISION TABLE GENERATOR R. LARY 7/17/79
C
C Modified from PDP-11 FORTRAN to VAX FORTRAN 8/14/86
C
IMPLICIT INTEGER*2(A-Z)
REAL*8 P(10,27), PA(27), XU, EV, X, Y, W(11)
REAL*8 STAND(10,21), HIT(10,21), AHIT(10,21), HIT5(10,21)
REAL*8 DBLDN(10,21), DBLDNS(10,21), SPLIT(10,21)
LOGICAL SPDD, SP3ACE, SPHACE, DBDALL, DLHS17, SRENDR
LOGICAL SIXCC, BJ2TO1, DLRPSH
C
C HOUSE RULES SETUP
C
C SPDD = double down allowed after split
C SP3ACE = re-splitting allowed after splitting aces
C SPHACE = hitting allowed after splitting aces
C DBDALL = double down on all values allowed (only 10 and 11 if false)
C DLHS17 = dealer must hit soft 17
C SRENDR = surrender allowed
C SIXCC = "six card charlie" beats all dealer hands
C BJ2TO1 = Blackjack pays 2:1
C DLRPSH = dealer pushes (wins on ties when total less than 21)
C
C The following rules are pretty much what is played in Las Vegas
C
SPDD = .TRUE.
SP3ACE = .TRUE.
SPHACE = .FALSE.
DBDALL = .TRUE.
DLHS17 = .FALSE.
SRENDR = .FALSE.
SIXCC = .FALSE.
BJ2TO1 = .FALSE.
DLRPSH = .FALSE.
C
C W(I) = PROBABILITY OF CARD VALUE I TURNING UP.
C
CALL DEAL(W)
C
C COMPUTE DEALER'S FINAL POINT DISTRIBUTION AS A FUNCTION
C OF HIS INITIAL FACE-UP CARD IN BLACKJACK
C
C NOTE: SINCE THIS COMPUTATION IS TO DETERMINE PLAYING STRATEGY,
C DEALER BLACKJACKS HAVE BEEN EXCLUDED FROM THIS DISTRIBUTION.
C
C DURING THIS PHASE, P(UP,N) = PROB OF DEALER HOLDING EXACTLY
C N POINTS WITH NO ACES OR HARD ACES AND UP-CARD "UP"
C PA(N)= PROB OF DEALER HOLDING N POINTS WITH SOFT ACES
C (SOFT ACES HAVE VALUE 1 BUT CAN GO TO 10)
TYPE 80
80 FORMAT(' PRINT LEVEL?'$)
ACCEPT 90, PLVL
90 FORMAT(I3)
IF(PLVL .LE. 0) TYPE 100
100 FORMAT(' DEALER''S PROBABILITY OF BEATING A GIVEN SCORE'//
1 ' UP CARD P(>16) P(>17) P(>18) P(>19) P(>20) P(BUST)'/)
C
C DECIDE WHETHER DEALER MUST HIT ON SOFT 17'S OR NOT
C
IHLIMT = 7
IF(DLHS17) IHLIMT = 8
C
C START DEALER DISTRIBUTION LOOP HERE
C
DO 200 UP=1,10
XU = 1.
C
C IF FACE CARD = 10, ONLY 12 UNDERCARDS (ACE WOULD BE BLACKJACK)
C
IF(UP .EQ. 10) XU = 1. - W(1)
DO 110 I=1,27
P(UP,I) = 0.
110 PA(I) = 0.
C
C COMPUTE BASIC (2-CARD) POINT DISTRIBUTION FOR FACE-UP CARD "UP"
C
IF(UP .EQ. 1) GO TO 130
DO 120 I=2,10
120 P(UP,UP+I) = W(I) / XU
IF(UP .EQ. 10) GO TO 160
IF(UP+1 .GE. IHLIMT) P(UP,UP+11) = W(1)
IF(UP+1 .LT. IHLIMT) PA(UP+1) = W(1)
GO TO 160
C
C WITH ACE SHOWING, ONLY 9 UNDERCARDS ( 10/PICTURE IS BLACKJACK)
C
130 XU = 1. - W(10)
DO 140 I=1,9
IF(I+1 .GE. IHLIMT) P(UP,I+11) = W(I) / XU
140 IF(I+1 .LT. IHLIMT) PA(I+1) = W(I) / XU
C
C SIMULATE DEALER HITS BY ADVANCING ALL POINT VALUES UNDER 16
C
160 DO 180 IP=UP+1,16
DO 170 NC=2,10
C
C AUGMENT ACELESS (OR HARD-ACED) DISTRIBUTION
C
P(UP,IP+NC) = P(UP,IP+NC) + P(UP,IP)*W(NC)
C
C SOFT HANDS MAY HARDEN AT 1, HARDEN AT 10 OR REMAIN SOFT
C DEPENDING ON THE POINT RANGE THEY FALL INTO,
C SINCE DEALER MUST STAND ON ALL 17'S OR ABOVE
C
IF(IP+NC .GT. 11)P(UP,IP+NC) = P(UP,IP+NC) + PA(IP)*W(NC)
IF(IP+NC .LE. 11 .AND. IP+NC .GE. IHLIMT)
1 P(UP,IP+NC+10) = P(UP,IP+NC+10) + PA(IP)*W(NC)
170 IF(IP+NC .LT. IHLIMT)PA(IP+NC) = PA(IP+NC) + PA(IP)*W(NC)
C
C HANDLE ACE HITS - MAIN DIFFERENCE HERE IS THAT AN ACE HIT
C CAN "SOFTEN" AN ACELESS HAND OF LESS THAN (OR EQ IF DLHS17) 6 POINTS
C
X = (P(UP,IP)+PA(IP)) * W(1)
IF(IP .GT. 10) P(UP,IP+1) = P(UP,IP+1) + X
IF(IP+1 .GE. IHLIMT .AND. IP .LE. 10)
1 P(UP,IP+11) = P(UP,IP+11) + X
IF(IP+1 .LT. IHLIMT) PA(IP+1) = PA(IP+1) + X
C
C KEEP THE TOTAL PROBABILITY SUM AT 1.0 BY CLEARING OLD POINTPROB
C
P(UP,IP) = 0.
180 PA(IP) = 0.
C
C ADD UP THE BUST VALUES FOR A SUMMARY BUST SCORE
C AND TURN POINT PROBABILITIES INTO CUMULATIVE ONES
C
X = P(UP,22) + P(UP,23) + P(UP,24) + P(UP,25) + P(UP,26)
DO 190 I=21,2,-1
190 P(UP,I-1) = P(UP,I-1) + P(UP,I)
P(UP,22) = 0.
C
C P(UP,N) IS NOW THE PROBABILITY THAT THE DEALER WILL EQUAL OR BEAT
C THE VALUE N WITHOUT BUSTING IF HIS UP-CARD IS "UP"
C
200 IF(PLVL .LE. 0) TYPE 205,UP,(P(UP,I),I=17,21),X
205 FORMAT(I4,5X5(2PF6.1,'%'),2X2PF6.1,'%')
C
C NOW COMPUTE STAND(UP,N) = THE EFFECTIVE VALUE OF A $1 BET
C IF WE STAND WITH "N" POINTS AGAINST A DEALER WITH "UP" SHOWING
C
DO 210 I=2,21
DO 210 UP=1,10
C
C EV = 2 * (1 - P(UP,N)) + 1 * (P(UP,N) - P(UP,N+1))
C
STAND(UP,I) = 2.0 - P(UP,I) - P(UP,I+1)
210 IF(DLRPSH .AND. I .NE. 21) STAND(UP,I) = 2.0 - 2.0 * P(UP,I)
C
C NOW ITERATIVELY COMPUTE EFFECTIVE VALUE OF TAKING HIT(S)
C HIT(UP,N) = EV OF HITTING A HARD "N" WHEN THE DEALER SHOWS "UP"
C AHIT(UP,N)= EV OF HITTING A SOFT "N" WHEN THE DEALER SHOWS "UP"
C HIT5(UP,N)= EV OF HITTING 5-CARD "N" WHEN THE DEALER SHOWS "UP"
C (ONLY USEFUL IN GAMES WITH THE "SIX-CARD-CHARLEY" RULE)
C
C HIT EV'S ARE BASED ON THE FACT THAT YOU WILL KEEP HITTING UNTIL
C YOU REACH A POINT WHERE THE EV OF STANDING IS HIGHER AND THEN STAND;
C THUS HIT(UP,N) = F( HIT(UP,N+J) , AHIT(UP,N+11) , STAND(UP,N+J) ).
C THE ITERATION IS NEEDED BECAUSE SOFT HANDS SOMETIMES DECREASE IN
C VALUE AFTER A HIT, MAKING AHIT(UP,N) ALSO A FUNCTION OF HIT(UP,N-I).
C
DO 260 UP=1,10
DO 220 I=1,21
AHIT(UP,I) = 0.
HIT5(UP,I) = 0.
220 HIT(UP,I) = 0.
DO 260 ITER=1,2
DO 260 I=20,1,-1
X = 0.
HIT5(UP,I) = 2.0 * W(1)
IF(I .EQ. 20) GO TO 245
DO 240 J=I+2,MIN0(I+10,21)
HIT5(UP,I) = HIT5(UP,I) + 2.0 * W(J-I)
240 X = X + DMAX1(STAND(UP,J),HIT(UP,J)) * W(J-I)
245 IF(I .GT. 10) X = X + DMAX1(STAND(UP,I+1),HIT(UP,I+1)) * W(1)
IF(I .LE. 10)X = X + DMAX1(STAND(UP,I+11),AHIT(UP,I+11)) * W(1)
HIT(UP,I) = X
IF(I .LT. 11) GO TO 260
IF(I .GT. 11)AHIT(UP,I) = DMAX1(STAND(UP,I),HIT(UP,I)) * W(10)
IF(I .EQ. 11) AHIT(UP,I) = STAND(UP,21) * W(10)
DO 250 J=I+1,I+9
X = 0.
IF(J .LE. 21) X = DMAX1(STAND(UP,J),AHIT(UP,J))
250 AHIT(UP,I) = AHIT(UP,I) +
1 DMAX1(X,STAND(UP,J-10),HIT(UP,J-10)) * W(J-I)
260 CONTINUE
IF(PLVL .LE. 1) TYPE 270,(I,I=1,10)
270 FORMAT(//' PROBABILITY OF WINNING IF YOU STAND'
1/25X'Dealer shows'/' ON',10I6/)
IF(PLVL .LE. 1) TYPE 280,(I,(STAND(UP,I)/2.,UP=1,10),I=16,21)
280 FORMAT((I5,2X10(2PF5.1,'%')))
IF(PLVL .LE. 1) TYPE 285,(I,I=1,10)
285 FORMAT(//' PROBABILITY OF WINNING IF YOU HAVE NO ACE AND HIT'/
1 25X'Dealer shows'/' TO',10I6/)
IF(PLVL .LE. 1) TYPE 280,(I,(HIT(UP,I)/2.,UP=1,10),I=4,20)
IF(PLVL .LE. 1) TYPE 290,(I,I=1,10)
290 FORMAT(//' PROBABILITY OF WINNING IF YOU HAVE AN ACE AND HIT'/
1 25X'Dealer shows'/' TO',10I6/)
IF(PLVL .LE. 1) TYPE 280,(I,(AHIT(UP,I)/2.,UP=1,10),I=11,20)
IF(PLVL .LE. 2) TYPE 295,(I,I=1,10)
295 FORMAT(//' WHAT SHOULD YOU DO HOLDING NO ACE?'
1/25X'Dealer shows'/' ON',10I4/)
IF(PLVL .LE. 2) CALL PDTBL(STAND,HIT,HIT,1.D0,0.D0,12,20,-1)
IF(PLVL .LE. 2) TYPE 305,(I,I=1,10)
305 FORMAT(//' WHAT SHOULD YOU DO HOLDING AN ACE?'
1/25X'Dealer shows'/' ON',10I4/)
IF(PLVL .LE. 2) CALL PDTBL(STAND,AHIT,AHIT,1.D0,0.D0,12,20,-1)
IF(SIXCC .AND. PLVL .LE. 2) TYPE 310,(I,I=1,10)
310 FORMAT(//' WHAT SHOULD YOU DO HOLDING 5 CARDS?'
1/25X'Dealer shows'/' WITH',10I4/)
IF(SIXCC .AND. PLVL .LE. 2)
1 CALL PDTBL(STAND,HIT5,HIT5,1.D0,0.D0,10,20,-1)
C
C COMPUTE EXPECTED VALUES FOR DOUBLE-DOWN
C
DO 330 UP=1,10
C
C START OFF WITH ACE COMPONENT WHICH IS VERY DIFFERENT FOR 10 AND 11
C
DO 330 I=2,20
IF(I .LE. 10) DBLDN(UP,I) = STAND(UP,I+11) * W(1)
IF(I .GT. 10) DBLDN(UP,I) = STAND(UP,I+1) * W(1)
IF(I .GE. 20) GO TO 330
DO 320 FACEDN=2,MIN0(10,21-I)
320 DBLDN(UP,I) = DBLDN(UP,I) + STAND(UP,I+FACEDN)*W(FACEDN)
330 CONTINUE
IF(PLVL .LE. 3) TYPE 340,(I,I=1,10)
340 FORMAT(//' PROBABILITY OF WINNING ON DOUBLE-DOWN'
1/25X'Dealer shows'/' WITH',10I6/)
IF(PLVL .LE. 3) TYPE 280,(I,(DBLDN(UP,I)/2.,UP=1,10),I=7,12)
IF(PLVL .LE. 4) TYPE 350,(I,I=1,10)
350 FORMAT(//' SHOULD YOU DOUBLE-DOWN?'/25X'Dealer shows'/' WITH',10I4/)
IF(PLVL .LE. 4) CALL PDTBL(DBLDN,HIT,STAND,2.D0,1.D0,7,12,1)
C
C NOW CALCULATE EXPECTED VALUES FOR "SOFT" DOUBLE-DOWNS
C
DO 353 UP=1,10
DO 353 I=12,20
DBLDNS(UP,I) = 0.
DO 353 FACEDN=1,10
X = STAND(UP,I+FACEDN-10)
IF(I+FACEDN .LE. 21) X = DMAX1(X,STAND(UP,I+FACEDN))
353 DBLDNS(UP,I) = DBLDNS(UP,I) + X*W(FACEDN)
IF(PLVL .LE. 3) TYPE 355,(I,I=1,10)
355 FORMAT(//' PROBABILITY OF WINNING ON DOUBLE-DOWN SOFT',
1 ' (WITH ACE)'/25X'Dealer shows'/' WITH',10I6/)
IF(PLVL .LE. 3)TYPE 280,(I,(DBLDNS(UP,I)/2.,UP=1,10),I=12,20)
IF(PLVL .LE. 4) TYPE 358,(I,I=1,10)
358 FORMAT(//' SHOULD YOU DOUBLE-DOWN SOFT?'
1/25X'Dealer shows'/' WITH',10I4/)
IF(PLVL .LE. 4) CALL PDTBL(DBLDNS,AHIT,STAND,2.D0,1.D0,12,20,1)
C
C CALCULATE EXPECTED VALUE OF SPLITS TO ONE LEVEL,
C
DO 360 UP=1,10
SPLIT(UP,1) = DBLDN(UP,11)
IF(SPHACE) SPLIT(UP,1) = AHIT(UP,11)
DO 360 I=2,10
X = HIT(UP,I)
C
C TAKE INTO ACCOUNT SPLIT-INITIATED DOUBLE-DOWNS ON 10 AND 11
C
IF(SPDD .AND. I .LT. 10) X = X +
1 (DMAX1(2.*DBLDN(UP,11)-1.,HIT(UP,11))-HIT(UP,11)) * W(11-I)
IF(SPDD .AND. I .LT. 9 .AND. I .NE. 5) X = X +
1 (DMAX1(2.*DBLDN(UP,10)-1.,HIT(UP,10))-HIT(UP,10)) * W(10-I)
360 SPLIT(UP,I) = X
C
C SINCE ANYTHING WORTH DOING IS WORTH DOING AGAIN,
C TAKE NESTED SPLITS INTO ACCOUNT -
C
DO 370 UP=1,10
DO 370 I=1,10
IF(I .EQ. 1 .AND. .NOT. SP3ACE) GO TO 370
C
C COMPUTE Y = VALUE OF KEEPING PAIR (NOT SPLITTING FURTHER)
C
IF(I .EQ. 1) Y = DMAX1(STAND(UP,12),AHIT(UP,12))
IF(I .NE. 1) Y = DMAX1(STAND(UP,2*I),HIT(UP,2*I))
C
C THE FORMULA USED HERE IS THE CLOSED FORM FINAL TERM OF THE SEQUENCE
C X(N+1) = X(0) + W(I) * (2*X(N) - Y - 1)
C
SPLIT(UP,I) = (SPLIT(UP,I) - W(I)*(Y+1.)) / (1. - 2.*W(I))
370 CONTINUE
IF(PLVL .LE. 5) TYPE 380,(I,I=1,10)
380 FORMAT(//' SHOULD YOU SPLIT A PAIR?'
1/25X'Dealer shows'/' OF',10I4/)
IF(PLVL .LE. 5)
1 CALL PDTBL(SPLIT,AHIT(1,12),STAND(1,12),2.D0,1.D0,1,1,1)
IF(PLVL .LE. 5)
1 CALL PDTBL(SPLIT,HIT,STAND,2.D0,1.D0,2,10,2)
C
C TAKE SURRENDER INTO ACCOUNT
C
IF(SRENDR .AND. PLVL .LE. 5) TYPE 390,(I,I=1,10)
390 FORMAT(//' SHOULD YOU SURRENDER?'/25X'Dealer shows'/' WITH',10I4/)
IF(SRENDR .AND. PLVL .LE. 5)
1 CALL PDTBL(HIT,HIT,STAND,0.D0,-.5D0,14,17,1)
C
C CALCULATE EXPECTED VALUE OF GAME USING BEST STRATEGIES
C
EV = 0.
DO 500 UP=1,10
DO 500 M1=1,10
DO 500 M2=1,10
X = DMAX1(STAND(UP,M1+M2),HIT(UP,M1+M2))
IF(SRENDR) X = DMAX1(X,.5D0)
IF(M1 .EQ. M2) X = DMAX1(X, 2.*SPLIT(UP,M1)-1.)
IF(M1 .EQ. 1 .OR. M2 .EQ. 1) GO TO 470
C
C DOUBLE DOWN ON 10 OR 11 ONLY IF SO RESTRICTED
C
IF(M1+M2 .EQ. 10 .OR. M1+M2 .EQ. 11 .OR. DBDALL)
1 X = DMAX1(X, 2.*DBLDN(UP,M1+M2)-1.)
GO TO 480
470 X = DMAX1(X, AHIT(UP,M1+M2+10))
IF(DBDALL) X = DMAX1(X, 2.*DBLDNS(UP,M1+M2+10)-1.)
IF(M1+M2 .NE. 11) GO TO 480
C
C BLACKJACK!
C
X = 2.5
IF(BJ2TO1) X = 2.0
IF(UP .EQ. 1) X = X * (1.-W(10)) + W(10)
IF(UP .EQ. 10) X = X * (1.-W(1)) + W(1)
GO TO 500
480 IF(UP .EQ. 1) X = X * (1. - W(10))
IF(UP .EQ. 10) X = X * (1. - W(1))
500 EV = EV + X*W(UP)*W(M1)*W(M2)
IF(PLVL .LE. 6) TYPE 510,EV
510 FORMAT('0EXPECTED VALUE OF GAME IS ',F7.4)
CALL EXIT
END
SUBROUTINE DEAL(W)
IMPLICIT INTEGER*2(A-Z)
REAL*8 W(11),X
C
C W(I) = PROBABILITY OF CARD VALUE I TURNING UP.
C
DO 40 I=1,10
40 W(I) = 1.0D0 / 13.0D0
W(10) = 4.0D0 / 13.0D0
C
C ALLOW CARD PROBABILITIES TO BE PERTURBED TO SIMULATE
C COUNTING-DETECTED SITUATIONS
C
50 TYPE 55
55 FORMAT(' PERTURB?'$)
ACCEPT 90, I
90 FORMAT(I3)
IF(I .EQ. 0) GO TO 60
IF(I .GT. 0) W(I) = W(I) * 1.05
IF(I .LT. 0) W(-I) = W(-I) / 1.05
GO TO 50
C
C RE-NORMALIZE CARD PROBABILITIES SO THEY SUM TO 1.0
C
60 X = 0.
DO 65 I=1,10
65 X = X + W(I)
DO 70 I=1,13
70 W(I) = W(I) / X
W(11) = W(1)
RETURN
END
SUBROUTINE PDTBL(A,B,C,D,E,LOW,HI,M)
REAL*8 A(10,21),B(10,21),C(10,21)
REAL*8 D,E,X,Y
INTEGER*2 LOW,HI,UP,I,M,CH,MM
LOGICAL*1 DTABLE(10,21),YES(2),NO(2)
DATA YES/'S','Y'/ , NO/'H','N'/
C
CH = 1
MM = M
IF(M .GT. 0) CH = 2
IF(M .LT. 0) MM = - M
DO 100 I=LOW,HI
DO 100 UP=1,10
X = A(UP,I) * D - E
Y = DMAX1(B(UP,I*MM),C(UP,I*MM))
DTABLE(UP,I) = NO(CH)
IF(X .GT. Y) DTABLE(UP,I) = YES(CH)
100 IF(50.*ABS(X-Y) .LT. DMAX1(X,Y)) DTABLE(UP,I) = DTABLE(UP,I)+32
TYPE 110,(I,(DTABLE(UP,I),UP=1,10),I=LOW,HI)
110 FORMAT((I5,10(3XA1)))
RETURN
END
|