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 "$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 score 2 score 3 score 4 score
5 score 6 score 7 score Dealer score up cnt h-l true";
print " total=cards t=cards 3 t=cards 4 t=cards
5 t=cards 6 t=cards 7 t=cards Dealer t=cards Cards card 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 " "; }
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 "$cgi Counter: $HitCounts \n";
# print "$HcntFile : $HitCounts \n";
}