#!/usr/bin/env perl # open source code for blacjack simulation by http://blackjackstory.com as you can run this on this web site too # this progran has 670 lines here only display first page, you may go web site copy/paste with .cgi file name and run your web host. use CGI::Carp qw(fatalsToBrowser); push (@INC, "/cgi-bin"); require "cgi-lib.pl"; #require "cgi-handlers.pl"; require "cgi_handlers.pl"; &ReadParse(*rq); print "Content-type: text/html; charset=utf-8 \n\n"; print <<"EOT";

Blackjackstory.com blackjack Simulator position 4 and 7 increase bet by true count

Blackjackstory.com blackjack simulator
Total rounds Set player card1card 2dealer updecks 1 2 4 6 8display every cnt
EOT print ""; # bj stratge test # yd23456789TA first 2 cards hard total 08 as 2+6; $h00_09 = "08HHHHHHHHHH09HDDDDHHHHH10DDDDDDDDHH11DDDDDDDDDH12DDSSSHHHHH13SSSSSHHHHH14SSSSSHHHHH15SSSSSHHHHH16SSSSSHHHHH17SSSSSSSSSS"; # 23456789TA soft 2 cards soft total 13 as A+2; $s10_18 = "13HHHDDHHHHH14HHHDDHHHHH15HHDDDHHHHH16HHDDDHHHHH17HDDDDHHHHH18SDDDDSSHHH19SSSSSSSSSS20SSSSSSSSSS"; # 23456789TA pairs 22 as 2;2 TT as 10;10 $p19_29 = "22PPPPPPHHHH33PPPPPPPHHHH44HHHPPHHHH55DDDDDDDDHH66PPPPPHHHHH77PPPPPPHHHH88PPPPPPPPPP99PPPPPSPPSSTTSSSSSSSSSSAAPPPPPPPPPP"; $dealer = "H17S18;0 0 0 0 0 0 10"; #$dealer = "H17S18;"; # player 0 1 2 3 4 5 6 base dealer user bet add by inter (true_cnt * $value) if true cont is postive #$addbet = "2 4 10 0 0 0 0 10"; #playerbet = base + addbet * true-cnt $std0 = $h00_09.$s10_18.$p19_29; $std1 = $std0; $std2 = $std0; $std3 = $std0; $std4 = $std0; $std5 = $std0; $std6 = $std0; if ( $rq{IN} ) { open (IN, "$rq{IN}")|| die "can't open input $rq{IN} !"; } else { open (IN, "../public_html/bj21.txt")|| die "can't open input ../public_html/bj21.txt !"; } $item=0; #print OUT " \n "; while () { chomp ($_); @i = split /=/, $_; if ( substr($i[0], 0, 1) eq "0" ) { $chg0 .= $i[1]; } elsif ( substr($i[0], 0, 1) eq "1" ) { $chg1 .= $i[1]; } elsif ( substr($i[0], 0, 1) eq "2" ) { $chg2 .= $i[1]; } elsif ( substr($i[0], 0, 1) eq "3" ) { $chg3 .= $i[1]; } elsif ( substr($i[0], 0, 1) eq "4" ) { $chg4 .= $i[1]; } elsif ( substr($i[0], 0, 1) eq "5" ) { $chg5 .= $i[1]; } elsif ( substr($i[0], 0, 1) eq "6" ) { $chg6 .= $i[1]; } elsif ( substr($i[0], 0, 1) eq "7" ) { $dealer = $i[1]; } } ($dealer, $addbet) = split(";", $dealer); @addb = split (" ", $addbet); close IN; if ($chg0) { $std0 = $chg0; } if ($chg1) { $std1 = $chg1; } if ($chg2) { $std2 = $chg2; } if ($chg3) { $std3 = $chg3; } if ($chg4) { $std4 = $chg4; } if ($chg5) { $std5 = $chg5; } if ($chg6) { $std6 = $chg6; } $stratgy = $std0.$std1.$std2.$std3.$std4.$std5.$std6; $deck = "A A A A 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 J J J J Q Q Q Q K K K K"; $deck2 = $deck." ".$deck; $deck8 = $deck2." ".$deck2." ".$deck2." ".$deck2; if ( !$rq{deck} ) { $rq{deck} = 2;} $cards = $rq{deck} * 52; $leng = $rq{deck} * 108; $leng = $leng - 1; $sufat = $rq{deck} * 13; $deck6 = substr($deck8, 0, $leng); @c = split (/ /, $deck6); &suffer; $cnt = 0; $cur_h_l = 0; # deliver first 2 cards to each $a = 0; $b = 1; @player = ""; $rnd=1; if ( $rq{round} > 10001) { $rq{disccnt} = 1000; } elsif ( $rq{round} > 1001) { $rq{disccnt} = 100; } if ( $rq{bet} ) {$bet = $rq{bet};} else { $bet = 10; } if ( $rq{round} ) { $totalh = $rq{round}; } else { $totalh = 5; } while ($rnd <= $totalh) { &round; if ( $rq{discnt} > 0 ) { $last = $rnd % $rq{discnt}; } else { $last = 0; } $rnd++; } print ""; } print "
$ftotal[0] $ftotal[1] $ftotal[2] $ftotal[3] $ftotal[4] $ftotal[5]$ftotal[6] dealer: $ftotal[7] round: $rnd \n"; print "win/lose $ and % \n"; $pct=$ftotal[0] * 10 / $rnd; $ftotal[0] = substr($pct, 0, 6)."%"; $pct=$ftotal[1] * 10 / $rnd; $ftotal[1] = substr($pct, 0, 6)."%"; $pct=$ftotal[2] * 10 / $rnd; $ftotal[2] = substr($pct, 0, 6)."%"; $pct=$ftotal[3] * 10 / $rnd; $ftotal[3] = substr($pct, 0, 6)."%"; $pct=$ftotal[4] * 10 / $rnd; $ftotal[4] = substr($pct, 0, 6)."%"; $pct=$ftotal[5] * 10 / $rnd; $ftotal[5] = substr($pct, 0, 6)."%"; $pct=$ftotal[6] * 10 / $rnd; $ftotal[6] = substr($pct, 0, 6)."%"; $pct=$ftotal[7] * 10 / $rnd; $ftotal[7] = substr($pct, 0, 6)."%"; print "
$ftotal[0] $ftotal[1] $ftotal[2] $ftotal[3] $ftotal[4] $ftotal[5]$ftotal[6] dealer: $ftotal[7] round: $rnd \n"; &pagecnt; print ""; sub suffer { @dk6 = split (/ /, $deck6); $a = 0; @s=""; $cards = $rq{deck} * 52; while ($a < $cards) { $I = int ( rand($cards - $a) ); $s[$a] = $dk6[$I]; $dk6[$I] = " "; while ($I < $cards && $dk6[$I] eq " ") { $dk6[$I] = $dk6[$I+1]; $dk6[$I+1] = " "; $I++; } $a++; } @card = ""; $i=0; if ( $last == 0 && $rnd == 0 ) { $x=0; $y=0; $z = 8; @card=""; while ($y < $z && $y < $cards) { while ($x < $z) {$card[$y] .= $s[$x++];} $y++; $z += 8; } print "
shuffle$rq{deck} decks:"; while ( $card[$i] ) { print " $card[$i++]"; } print "
seat 1 score2 score3 score4 score 5 score6 score7 score Dealer scoreup cnt h-l true"; print "
total=cardst=cards3 t=cards4 t=cards 5 t=cards6 t=cards7 t=cardsDealer t=cards Cardscard index cnt"; } } sub round { @player = ""; $b=1; $a=0; if ( $rq{card2} && $rq{card1} && $rq{dealup} ) { &condition; } else { while ( $a < 8 && $b < 3 ) { if ( $b == 1 ) { $player[$a] = "0 0 "; } if ( !$s[$cnt] ) { &cnt1; } $player[$a] = $player[$a].$s[$cnt]." "; # print "$a : $player[$a] \n"; &cnt1; $a++; if ( $a > 7 ) { $a = 0; $b++; } } } # this is dealer face card @n = split (/ /, $player[7]); if ( $n[3] eq "J" || $n[3] eq "Q" || $n[3] eq "K" ) { $up3=10;} elsif ( $n[3] eq "A" ) { $up3=11; } else { $up3=$n[3]; } $up1 = $n[2]; if ( $n[2] eq "J" or $n[2] eq "Q" or $n[2] eq "K" ) { $up=10;} elsif ( $n[2] eq "A" ) { $up=11; } else { $up=$n[2]; } $up3 += $up; if ( $up3 == 21 ) { $n[0] = "21bj", $n[0] = 1; } # dealer has black jack all user check first 2 card $leftdeck = ($cards - $cnt) / 52; #print "leftdeck = $leftdeck \n"; $true_cnt = int ($cur_h_l / $leftdeck); if ( $true_cnt > 2 ) { $tru = $true_cnt - 1; } else { $tru = 0; } @playerbet = ""; # check decition table for each player each seat table = 28 * 12 = 336 characters #@ftotal=""; $c=0; while ( $c < 7 ) { $A=0; $playerbet[$c] = $addb[7] + $tru * $addb[$c]; @n = split (/ /, $player[$c]); if ( $up3 == 21 ) { $n[1] = 1; &sum2; } elsif ( $n[2] eq $n[3] ) { &pair; } else { &sum2; } $player[$c] = $sum; #print "player $c before $player[$c] \n"; $c++; } # dealer = player[7] $playerbet[$h] &dealcard; $dealwin=0; &score; #if ( $last == 0 ) #{ #print "
#$rnd bet $ftotal[0] $playerbet[0]$ftotal[1] #$playerbet[1] $ftotal[2] $playerbet[2]$ftotal[3] #$playerbet[03] # $ftotal[4] $playerbet[4]$ftotal[5] #$playerbet[5]$ftotal[6] $playerbet[6]$ftotal[7] Total"; #} if ( $cnt > $sufat ) { &suffer; $cnt=0; $cur_h_l=0; } } sub condition { #print "
c1=$rq{card1}c2=$rq{card2}up=$rq{dealup}"; if ( $rq{card1} && $rq{card2} ) { $player[0]="0 0 ".$rq{card1}." ".$rq{card2}; $player[2]=$player[0]; $player[3]=$player[0]; $player[4]=$player[0]; $player[5]=$player[0]; $player[6]=$player[0]; $player[1]=$player[0]; } if ( $rq{dealup}) { $player[7]="0 0 ".$rq{dealup}; &cnt1; $player[7] .= " ".$s[$cnt]; $a = 8; $b = 3; } else { &cnt1; $player[7]="0 0 ".$s[$cnt]; &cnt1; $player[7] .= " ".$s[$cnt]; $a = 8; $b = 3; } } # test pairs first sub pair { $A=0; @sec=""; if ( $n[2] eq "J" || $n[2] eq "Q" || $n[2] eq "K" ) {$val=10;} elsif ($n[2] eq "A" ) {$val=11;} else {$val=$n[2];} $line = $c * 336 + (18 + $val - 2) * 12; $idx = $line + $up; $code = substr($stratgy, $idx, 1); if ( $code eq "P" && $n[2] eq "A" ) { @sec = ""; $sp1 = ""; $sp2= ""; $sp3=""; @n = split / /, "0 1 A"; &sum2; $sec[0] = $sum; @n = split / /, "0 1 A"; &sum2; $sec[1] = $sum; $player[$c] = join ";", @sec; $sum = $player[$c]; } elsif ( $code eq "P" ) { $hands = ""; $e=0; &nextpair; &nextpair; @card2 = split (" ", $hands); $e=0; while ($card2[$e] && $e < 4 ) { @n = split (/ /, "0 0 $n[2] $card2[$e]"); &sum2; $sec[$e] = $sum; $e++; } $sum = join (";", @sec); } elsif ( $code eq "S" ) { @n = split (/ /, $player[$c]); # stand $n[1] = 1; &sum2; } elsif ( $code eq "R" ) { @n = split (/ /, $player[$c]); # surrender $n[1] = "0.5"; &sum2; } else { @n = split (/ /, $player[$c]); # hit $n[0] = 0; &sum2; } } sub nextpair { &cnt1; if ($n[2] ne $s[$cnt]) { $hands .= $s[$cnt]." "; } else { &cnt1; if ($n[2] ne $s[$cnt]) { $hands .= $s[$cnt]." "; &cnt1; $hands .= $s[$cnt]." "; } else { &cnt1; $hands .= $s[$cnt]." "; &cnt1; $hands .= $s[$cnt]." "; &cnt1; $hands .= $s[$cnt]." "; } } } sub addn0 { if ( $n[$ps] eq "J" || $n[$ps] eq "Q" || $n[$ps] eq "K" ) { $n[0] += 10; } elsif ( $n[$ps] eq "A" ) { $n[0] += 1; $A = 10; } else { $n[0] += $n[$ps]; } if ( $n[0] > 17 && $n[1] == 0) { $n[1] = 1; } #print "c = $c n = @n ; "; $ps++; } sub softtest { if ( $n[0] < 12 && $n[0] > 8 && $A == 10 ) { $n[0] += 10; $n[1] = "1"; } else { $line = $c * 336 + ( 10 + $n[0] - 3 ) * 12; # soft test $pos = $line + $up; $code = substr($stratgy, $pos, 1); if ( $code eq "S" ) { $n[0] += 10; $n[1] = "1"; } } } sub dealcard { $A=0; $slimt = substr($dealer, 4, 2); @n = split(" ", $player[7]); $ps = 2; &addn0; # will include ps++ &addn0; # test soft if ( $n[0] == 11 && $A == 10 ) # blackjack { $n[0] = "21bj"; $n[1]="1"; } elsif ( $n[0] > 16 ) { $n[1] = "1"; } else { while ( $n[1] eq "0" ) { if ( $A == 10 && $n[0] < 12 ) { $sft = $n[0] + 10; if ( $sft ge $slimt && $sft < 22 ) { $n[0] += $A; $n[1] = "1"; } } if ( $n[0] > 16 ) { $n[1] = "1"; } else { &cnt1; $n[$ps] = $s[$cnt]; &addn0; } } } $player[7] = join (" ", @n); $dealscore = $n[0]; #print "Dealer cards 1 $player[7] \n"; #print OUT "Dealer cards $player[7] \n"; } sub cnt1 { if ( !$s[$cnt] ) { $cnt++; } if ( $s[$cnt] eq "A" || $s[$cnt] eq "10" || $s[$cnt] eq "J" || $s[$cnt] eq "Q" || $s[$cnt] eq "K" ) { $h_l = -1; } elsif ( $s[$cnt] > 1 && $s[$cnt] < 7 ) { $h_l = +1; } $cur_h_l += $h_l; #print "cnt=$cnt s = $s[$cnt]"; $cnt++; } sub hit { &cnt1; $n[$ps] = $s[$cnt]; while ( $n[$ps] ) { &addn0; } while ($n[1] == 0 ) { if ( $n[0] < 12 && $A == 10 ) { &softtest; } #print "soft test @n \n"; if ( $n[0] > 17 ) # > 17 { $n[1] = "1"; } else { if ( $n[0] < 8 ) # < 8 { # print " < 8 @n \n"; &cnt1; $n[$ps] = $s[$cnt]; &addn0; } else { $line = $c * 336 + ( $n[0] - 8 ) * 12; # hard test $pos = $line + $up; $code = substr($stratgy, $pos, 1); if ( $code eq "S" ) { $n[1] = "1"; } else # hit { # print " code=$code @n \n"; &cnt1; $n[$ps] = $s[$cnt]; &addn0; if ( $n[0] > 17 ) # > 17 { $n[1] = "1"; } # print " add1 @n \n"; } } } if ( $n[0] < 11 && $A == 10 ) { &softtest; } # if ( $n[1] == 0 ) # { &cnt1; # $n[$ps] = $s[$cnt]; # &addn0; # } } if ($A == 10 && $n[0] < 12) { $n[0] += 10; } # print "sum=$sum \n"; $sum = join (" ", @n); } sub sum2 { $A=0; $sum = ""; if ( !$n[3] ) # split A's { &cnt1; $n[3] = $s[$cnt]; } # total first 2 cards : $ps = 2; while ( $n[$ps] && $ps < 4 ) { &addn0; } if ( $n[0] == 11 && $A == 10 ) # blackjack { $n[0] = "21bj"; $n[1]="1.5" } elsif ( $n[1] > 0 ) # stand { $n[4] = " "; } elsif ( $n[0] > 17 ) # > 17 { $n[1] = "1"; } elsif ( $n[0] < 3 && $A == 10 ) { $sp = 4; &hit; } elsif ( $n[0] < 11 && $A == 10 ) { $line = $c * 336 + ( 10 + $n[0] - 3 ) * 12; # soft test $pos = $line + $up; $code = substr($stratgy, $pos, 1); if ( $code eq "S" ) { $n[1] = "1"; } elsif ( $code eq "D" ) # $n[4] must " " { $n[1] = "2"; $sp = 4; &hit; } else # hit { $sp = 4; &hit; } } elsif ( $n[0] < 8 && $A ne "10") # < 8 { $n[1] = "0"; $sp=4; &hit; } else { $line = $c * 336 + ( $n[0] - 8 ) * 12; # hard test $pos = $line + $up; $code = substr($stratgy, $pos, 1); if ( $code eq "S" ) { $n[1] = "1"; } elsif ( $code eq "D" ) # hard double down { $n[1] = "2"; $sp=4; &hit; } elsif ( $code eq "R" ) # surrender { $n[0] = 0; $n[1] = "0.5"; } elsif ( $code eq "H" ) # hit { $ps=4; $n[1] = "0"; &hit; } } if ( $n[0] < 12 ) { $n[0] += $A; } if ( $sum eq "" ) { $sum = join (" ", @n); } #$player[$c] = $sum; #print "player $c : $player[$c] \n"; #print out "player $c : $player[$c] \n"; } sub score { $h=0; while ( $player[$h] && $h < 7 ) { @sec = split (";", $player[$h]); $f=0; $total=0; while ( $sec[$f] ) { @n = split " ", $sec[$f], 3; $n[2] =~ s / /,/g; $sec[$f] = join " ", $n[0], $n[1], $n[2]; if ( $n[1] eq "0.5" ) # surrender { $total = $playerbet[$h] * 0.5 * -1; } elsif ( $n[0] eq "21bj" ) { if ( $dealscore ne "21bj" ) { $total = $playerbet[$h] * 1.5; } } elsif ( $dealscore eq "21bj" ) { if ( $n[0] ne "21bj" ) { $total = $playerbet[$h] * -1; } } elsif ( $n[0] > 21 ) { $total = -1 * $n[1] * $bet; } elsif ( $n[0] < 22 && $dealscore > "21bj" ) { $total = $playerbet[$h] * $n[1]; } elsif ( $n[0] == $dealscore ) { $total = 0; } elsif ( $n[0] > $dealscore ) { $total = $playerbet[$h] * $n[1]; } else { $total = -1 * $playerbet[$h] * $n[1]; } $ftotal[$h] += $total; $dealwin -= $total; $sec[$f] = $total."/".$n[1]."
".$n[0]."=".$n[2]; # $sec[$f] = "$total ".$sec[$f]; # $sec[$f] =~ s/ / /; $f++; } $player[$h] = join "
", @sec; if ( $last == 0 ) { if ($h == 0 ) { print "
$ftotal[$h] $player[$h] "; } $h++; } $ftotal[7] += $dealwin; @n = split " ", $player[7], 3; $n[2] =~ s / /,/g; $player[7] = $dealwin."
".$n[0]."=".$n[2]; if ( $last == 0 ) { print "
$ftotal[7] $player[7]"; } if ( $last == 0 ) { print "#$rnd $up1 $cnt $cur_h_l $true_cnt "; } } sub pagecnt { $_ = substr($ENV{'SCRIPT_NAME'}, 9, 11); $cgi = $_; $_ =~ s /cgi/txt/; # Set the file name up. $HcntFile = $_; # # Open and read the file. # $HitCounts is set to 0 if the file doesn't exist. open (COUNTHAND, "<$HcntFile"); $HitCounts = ; # Close the file input and open it to truncate output # Should we worry about locking the file in case another process # uses it? Probably not since if we take that many hits # missing a few won't matter and we're too busy to be concerned. close (COUNTHAND); open (COUNTHAND, ">$HcntFile"); # Increment $Counter, then write it back out. Put up a message # with the new value. Close the file and exit. $HitCounts += 1; print COUNTHAND $HitCounts; # flock (COUNTHAND, 8); close (COUNTHAND); # print "Content-type: text/plain"; print "
$cgiCounter:$HitCounts \n"; # print "$HcntFile : $HitCounts \n"; }