source : ボンバーパワフル
#!/usr/bin/perl
# ボンバーパワフル シミュレーション
$cginame = 'b_power.cgi';
$title = 'ボンバーパワフル シミュレーション';
print "Content-Type: text/html\n\n";
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read (STDIN, $input, $ENV{'CONTENT_LENGTH'});
foreach (split(/&/,$input)) {
($name,$value) = split(/=/, $_);
push(@input, $value);
}
($s, $play, $mode, $s_big, $s_reg, $int, $start) = @input;
$mode = 1 if !$mode;
$def_sbig = $s_big; # 再試行で使用
$def_sreg = $s_reg;
$def_mode = $mode;
}
$int = 0 if !$int;
$int_chk[$int] = 'checked';
# ヘッダとフォームの表示
print <<"__ FORM __";
<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content="text/html; charset=shift_jis">
<title>jug7.com - cgi $title</title>
<style type="text/css"> <!--
A:hover {color:#ff0000;}
--></style>
</head>
<body text='#000000' bgcolor='#ffffff' link='#0000ff' alink='#ff0000' vlink='#0000cc'>
<div align='right'>[ <a href='../simu_data_b_power.html'>data</a> / <a href='b_power_memo.html'>memo</a> / <a href='b_power.html'>source</a> / <a href='../index.html'>home</a> ]</div>
<br><br>
<div align='center'><h2>$title</h2></div>
<hr width='70%'><center>
<form action='$cginame' method='POST'>
<table border=0>
<tr><td>設定</td><td><input type='text' maxlength=1 name='s' size=14 value='$s'></td></tr>
<tr><td>試行ゲーム数</td><td><input type='text' size=14 name='play' maxlength=4 value='$play'></td></tr>
<tr><td>最初のモード</td><td><input type='text' size=14 name='mode' maxlength=1 value='$mode'></td></tr>
<tr><td>最初のストック数</td><td>B <input type='text' size=2 name='s_big' maxlength=2 value='$s_big'>
R <input type='text' size=2 name='s_reg' maxlength=2 value='$s_reg'></td></tr>
<tr><td><font size=2>内部ボーナス<br>の表\示</font></td>
<td><input type='radio' name='int' value=0 $int_chk[0]> 無 <input type='radio' name='int' value=1 $int_chk[1]> 有</td></tr>
</table><br>
<input type='submit' value="開始">
</form>
設定は 1 〜 6 までの数値を入力。<br>
ストック数は BR 共に 99 個まで。<br>
モードについて: <b>1</b>->通常、 <b>2</b>->ハマリ、 <b>3</b>->連荘、 <b>4</b>->ボンバー<br>
</center><br><br>
__ FORM __
# エラーチェックとGET送信
if ($play > 9999) { $error = 1; $er_msg = 'プレイ数は最大9999Pまでです。'; }
if (!$s or !$play) { $error = 1; $er_msg = '記入漏れがあります。'; }
if ($s<=0 or $s>6) { $error = 1; $er_msg = '設定は 1 から 6 までです。'; }
if (grep { /[^\d]/ } ($play, $s_big, $s_reg)) { $error = 1; $er_msg = '不適切な文字が記入されています。'; };
if ($s_big>99 or $s_reg>99) { $error = 1; $er_msg = 'ストック数はBR 共に 99 個までです。'; }
if ($ENV{'REQUEST_METHOD'} ne 'POST') { $error = 1; $er_msg = 0; }
if ($er_msg) {
print q{<center><b><font color='red' size=4>*** ERROR !! ***</font><br><br>},"\n";
print "$er_msg</b></center>\n";
}
if ($error) {
print '<br><br><br><br><br>';
print q{<div align='right'>[ <a href='../simu_data_b_power.html'>data</a> / <a href='b_power_memo.html'>memo</a> / <a href='b_power.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
exit;
}
# data
# 通常時小役データ 総数は 65536
$big = 272;
$reg = 180;
$che = 656;
$melon = 656;
$grape = 6908;
$rep = 8980; $reprt = 56864;
$b_budo = 25600; $b_jac = 16384; $b_12 = 5600;
$b_melon = ($s==6) ? 4448 : 4444;
$jachaz = 256;
# RT 振り分け /65536
$m1[1]=$m1[3]=$m1[5] = '1024,1024,1024,1024,1024,2560,5120,256,10923,256,20292,256,10923,3277,3277,1638,1638';
$m1[2]=$m1[4]=$m1[6] = '1024,1024,1024,1024,1024,2560,10254,256,18400,256,18400,256,5120,1638,1638,819,819';
$m2[1]=$m2[3]=$m2[5] = '128,128,128,128,128,128,256,6553,256,1638,256,6553,256,9000,7500,7500,6000,6000,4500,4500,4000';
$m2[2]=$m2[4] = '128,128,128,128,128,128,256,6553,256,6553,256,13400,694,7000,5800,5800,4600,4600,3400,3400,2200';
$m2[6] = '256,256,256,256,256,256,512,6553,512,6553,512,13400,31862,1300,900,700,500,300,200,100,96';
$m3 = '4096,10377,10377,10377,4096,22937,1638,819,819';
$m4 = '21845,7282,7282,7282,21845';
@m1rt = split(/,/, $m1[$s]);
@m2rt = split(/,/, $m2[$s]);
@m3rt = split(/,/, $m3);
@m4rt = split(/,/, $m4);
# RTプレイ数
@blk = (0, 10, 20, 30, 40, 50, 100, 150, 200, 250, 300, 400, 500, 600, 700, 800, 900, 1000, 1050, 1100, 1150, 1200);
$s_big = 0 if !$s_big;
$s_reg = 0 if !$s_reg;
$stock = $s_big + $s_reg;
$rt = ($start) ? $start : &rt($mode); # 初期RTの決定
# モード移行 振り分け /241
$m1t[1] = '80,80,76,5';
$m1t[2] = '80,80,80,1';
$m1t[3] = '70,70,76,25';
$m1t[4] = '70,70,88,13';
$m1t[5] = '55,55,76,55';
$m1t[6] = '55,55,122,9';
$m2t[1] = '80,40,96,25';
$m2t[2] = '80,40,115,6';
$m2t[3] = '75,20,96,50';
$m2t[4] = '75,20,115,31';
$m2t[5] = '60,10,96,75';
$m2t[6] = '60,10,162,9';
$m3t = '48,48,144,1';
$m4t = '1,1,119,120';
@m1t = split(/,/, $m1t[$s]);
@m2t = split(/,/, $m2t[$s]);
@m3t = split(/,/, $m3t);
@m4t = split(/,/, $m4t);
# 放出するボーナス
@rel_big = (170, 32, 170, 156); #/256 左から m1~m4
print <<'__ TBL __';
<br><br><table border=1 align='center' cellspacing=0><caption>シミュレーション結果</caption>
<tr align='center' bgcolor='#ffffcc'><td><font size=2>ゲーム数</font></td><td><font size=2>当選</font></td>
<td><font size=2>備考</font></td><td><font size=2>BIG獲得</font></td><td><font size=2>モード移行</font></td>
<td><font size=2>次のRT</font></td><td><font size=2>BIG<br>回数</font></td><td><font size=2>REG<br>回数</font></td>
<td><font size=2>ストック数</font></td><td><font size=2>投資</font></td>
<td><font size=2>コイン</font></td><td><font size=2>総ゲーム数</font></td></tr>
__ TBL __
#--------------------------
# シミュレート開始
#--------------------------
$g = $count = $bigcount = $regcount = $coin = $rencount = $rencount = 0;
$msg=' ';
while (1) {
$g++; $count++;
if ($coin < 3) { $coin += 50; $k++; $totalk++; }
$coin -= 3;
$delay-- if $delay; # 前兆RT $delay==0 でボーナス放出
# 規定RT消化
if ($rt<=$count && $stock && !$rt_cancel) { $rt_cancel = 1; $delay = 1; } # RT消化の次のプレイで放出
$repr = ($stock) ? $reprt : $rep;
$r = int(rand(65536)+1);
if ($r <= $repr) {
if (!$stock) { $coin += 3; next; } else {
$r = int(rand(8192)+1);
if ($r<=1294) { $coin += 3; next; } # RT中の揃うリプレイ
}
} elsif ($r <= ($repr+$grape)) { $coin+=8; next; }
elsif ($r <= ($repr+$grape+$che)) {
$r = int(rand(256)+1); # チェリー解除と 2 or 4枚の振り分け
if($r <= 16 && $stock) { # 解除
$rt_cancel = 1; $delay = 0;
$msg = '<font size=2 color=\'red\'>イチゴ解除</font>';
$r = int(rand(256)+1); $coin += ($r <= 224) ? 2 : 4;
} else { # 非解除
$r = int(rand(256)+1); $coin += ($r <= 64) ? 2 : 4;
}
} elsif ($r <= ($repr+$grape+$che+$melon)) {
$coin += 12; $r = int(rand(256)+1);
if ($r<=8 && $stock && !$rt_cancel) {
$rt_cancel = 1; $delay = 9+1;
$msg = '<font size=2 color=\'blue\'>メロン解除</font>';
}
} elsif ($r<=($repr+$grape+$che+$melon+$big)) { # 内部BIG
if ($s_big>0 or $s_reg>0) { # すでにストックありの場合、内部ボーナス解除抽選
$r=int(rand(256)+1);
if ($r<=2 && $stock && !$rt_cancel) {
$rt_cancel = 1; $delay = 9+1;
$msg = '<font size=2>内部 BIG 解除</font>';
}
}
if ($s_big < 99) { $s_big++; $stock++; } # ストックする
if($s_big==1 && !$s_reg) { # 初ストックなら、RTプレイ数の抽選
$rt = $rt_d = &rt($mode); # $rt_d は表示用
$rt += $count; # 初ストックなので、現在のプレイ数に上乗せ。
} else { $rt_d=' '; }
if($int) { # 内部ボーナス表示有りの場合
print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 777</font></td>";
print "<td> </td><td> </td><td> </font></td><td>$rt_d</td><td><font color='blue'>$bigcount</font> $b_prob</td>";
print "<td><font color='blue'>$regcount</font> $r_prob</td><td>B $s_big R $s_reg</td>";
print "<td> </td><td>$coin</td><td>$g</td></tr>\n";
}
} elsif($r <= ($repr+$grape+$che+$melon+$big+$reg)) { # 内部REG
if ($s_big>0 or $s_reg>0) {
$r = int(rand(256)+1);
if ($r<=2 && $stock && !$rt_cancel) {
$rt_cancel = 1; $delay = 9+1; $msg = '<font size=2>内部 REG 解除</font>';
}
}
if ($s_reg < 99) { $s_reg++; $stock++; }
if (!$s_big && $s_reg==1) {
$rt = $rt_d = &rt($mode);
$rt += $count;
} else { $rt_d=' '; }
if ($int) {
print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 REG</font></td>";
print "<td> </td><td> </td><td> </font></td><td>$rt_d</td><td><font color='blue'>$bigcount</font> $b_prob</td>";
print "<td><font color='blue'>$regcount</font> $r_prob</td><td>B $s_big R $s_reg</td>";
print "<td> </td><td>$coin</td><td>$g</td></tr>\n";
}
}
# RT を解除してボーナス放出
if ($rt_cancel && !$delay) {
$rt_cancel = 0;
$r = int(rand(256)+1);
if( !$s_reg or ($s_big && $s_reg && $r<=$rel_big[$mode-1]) ) { # BIG 放出
$bigcount++; $s_big--; $stock--;
$get='<font color=\'red\' face=\'Arial black\'><b>777</b></font>';
# BIG プレイ開始
$bigget += 15; $jacin = $in = 0;
for ($x=1; $x<=30; $x++) {
$bigget -= 3;
$r = int(rand(65536)+1);
if ($r <= $b_budo){
$bigget += 8;
$r = int(rand(655536)+1);
$ren = 1 if $r<=180; # ブドウによる1P連
} elsif($r <= ($b_budo+$b_jac)) {
if (($jacin<2) or ($jacin==2 && $x>=20)) { # jacin
$bigget += 3; $jacin++;
for ($y=1; $y<=12; $y++) {
$r = int(rand(65536)+1);
if ($r <= $jachaz) {
$r = int(rand(65536)+1);
if ($r <= 65535) { $ren = 1; $bigget -= 1; } # JACハズレによる1P連
} else { $bigget += 14; $in++; }
if ($in == 8) { $in = 0; last; }
}
last if $jacin==3;
}
}
elsif ($r <= ($b_budo+$b_jac+$b_12)) { $bigget += 12; }
elsif($r<=($b_budo+$b_jac+$b_12+$b_melon)) { $bigget+=12; }
else {
$r = int(rand(65536)+1);
$ren = 1 if $r<=327; # ハズレによる1P連
}
} # BIG プレイ終了
$coin += $bigget;
} else { # REG 放出
$regcount++; $s_reg--; $stock--; $get='<b>REG</b>';
$coin += 15; $in = 0; $bigget=' ';
for ($y=1; $y<=12; $y++) {
$r = int(rand(65536)+1);
if ($r <= $jachaz) { $ren = 1; $coin -= 1; } # JACハズレによる1P連
else { $coin += 14; $in++; }
last if ($in==8);
}
}
$mode = &mt($mode); # モード移行
if ($stock && $ren && $ren2<4) { # 1P連の場合 $ren2 は1P連の連続フラグ。4回まで。
$rt_cancel = 1; $delay = 0; $rencount++;
$rt = 0; $ren2++;
$msg2='<b><font size=2 color=\'#00aa00\'>1P連確定</font></b>';
$msg = ($msg ne ' ') ? $msg.'<br>'.$msg2 : $msg2; # すでに $msg があるなら<br>をつけて連結
} elsif ($stock) { # 1P連ではなく、まだストックがある
$rt = &rt($mode); $ren2 = 0; # RTプレイ数の決定。
} else { # 1P連ではなく、ストックもない
$rt=' '; $ren2 = 0;
}
$opt = ($count <=100) ? '<b><font color=\'blue\'>' : ($count >= 600) ? '<b><font color=\'red\'>' : '';
$optc = ($count <=100) ? '</font></b>' : ($count >= 600) ? '</font></b>' : '';
$opt2 = ($mode >= 3) ? 'red' : 'black'; # モード3以上には色をつける
$k = ($k > 0) ? $k.'k' : ' ';
if ($bigcount) { $b_prob = int($g/$bigcount+0.5); $b_prob = "(1/$b_prob)"; }
if ($regcount) { $r_prob = int($g/$regcount+0.5); $r_prob = "(1/$r_prob)"; }
print "<tr align='center'><td>$opt $count $optc</td><td>$get</td><td>$msg</td><td>$bigget</td>";
print "<td>→ <font color='$opt2'>$mode</font></td><td>$rt</td><td><font color='blue'>$bigcount</font> $b_prob</td>";
print "<td><font color='blue'>$regcount</font> $r_prob</td><td>B $s_big R $s_reg</td>";
print "<td>$k</td><td>$coin</td><td>$g</td></tr>\n";
$count = $bigget = $ren = 0; $msg=' '; $k='';
}
if($g >= $play) {
$k = ($k > 0) ? $k.'k' : ' ';
if ($bigcount) { $b_prob = int($g/$bigcount+0.5); $b_prob = "(1/$b_prob)"; }
if ($regcount) { $r_prob = int($g/$regcount+0.5); $r_prob = "(1/$r_prob)"; }
print "<tr align='center'><td>$count</td><td>ヤメ</td><td> </td><td> </td><td>$mode</td><td> </td>";
print "<td><font color='blue'>$bigcount</font> $b_prob</td><td><font color='blue'>$regcount</font> $r_prob</td>";
print "<td>B $s_big R $s_reg</td><td>$k</td><td>$coin</td><td>$g</td></tr>\n";
last;
}
}
# シミュデータの整理
$toushi = $totalk * 1000;
$kankin = $coin * 20;
$shushi = $kankin - $toushi;
$opt3 = ($shushi >= 0) ? 'blue' : 'red'; # 収支の色
$payout = ($coin-($totalk * 50))/($g * 3)*100+100;
$payout = &point($payout,2);
if ($bigcount) { $b_prob = &point(($g/$bigcount),2); $b_prob = "(1/$b_prob)"; }
if ($regcount) { $r_prob = &point(($g/$regcount),2); $r_prob = "(1/$r_prob)"; }
if ($rencount) { $ren_p = &point(($g/$rencount),2); $ren_p = "(1/$ren_p)"; }
$start=$rt-$count;
# 整理したデータ、再試行ボタン、フッタ の表示
print <<"__ RESULT __";
</table><br><br>
<table border=1 align='center' cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=2><b>ボンバーパワフル 設定 $s</b></b></td></tr>
<tr><td>総プレイ数</td><td align='right'>$g P</td></tr>
<tr><td>BIG</td><td align='right'><b>$bigcount <font color='red'>$b_prob</font></b></td></tr>
<tr><td>REG</td><td align='right'><b>$regcount <font color='red'>$r_prob</font></b></td></tr>
<tr><td>1P連荘</td><td align='right'><b>$rencount $ren_p</b></td></tr>
<tr><td>投資</td><td align='right'>$toushi 円</td></tr>
<tr><td>獲得枚数</td><td align='right'><b>$coin 枚</b></td></tr>
<tr><td>換金</td><td align='right'>$kankin 円</td></tr>
<tr><td>収支</td><td align='right'><font color='$opt3'><b>$shushi 円</b></font></td></tr>
<tr><td>PAYOUT</td><td align='right'><b>$payout %</b></td></tr>
</table>
<br><br><table border=0 align='center' cellspacing=5>
<tr valign='bottom'><td>
<form action='$cginame' method='POST'>
<input type='hidden' name='s' value='$s'>
<input type='hidden' name='play' value='$play'>
<input type='hidden' name='mode' value='$def_mode'>
<input type='hidden' name='s_big' value='$def_sbig'>
<input type='hidden' name='s_reg' value='$def_sreg'>
<input type='hidden' name='int' value='$int'>
<input type='submit' value="再試行">
</form></td><td>
<form action='$cginame' method='POST'>
<input type='hidden' name='s' value='$s'>
<input type='hidden' name='play' value='$play'>
<input type='hidden' name='mode' value='$mode'>
<input type='hidden' name='s_big' value='$s_big'>
<input type='hidden' name='s_reg' value='$s_reg'>
<input type='hidden' name='int' value='$int'>
<input type='hidden' name='start' value='$start'>
<input type='submit' value="再試行2(据え置き)">
</form></td></tr></table>
<br><br><br><br>
<div align='right'>[ <a href='../simu_data_b_power.html'>data</a> / <a href='b_power_memo.html'>memo</a> / <a href='b_power.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __
exit;
# モード移行
sub mt {
my($mode,@tbl,$r,$i,$x,$next);
($mode) = @_;
@tbl = ($mode==1) ? @m1t : ($mode==2) ? @m2t : ($mode==3) ? @m3t : @m4t;
$r = int(rand(241)+1);
$i = 0; $x = $tbl[0];
while ($r > $x) { $i++; $x += $tbl[$i]; }
$next = $i + 1;
return $next;
}
# RT プレイ数の決定
sub rt {
my($mode,@tbl,$i,$x,$rt);
($mode) = @_;
@tbl = ($mode==1) ? @m1rt : ($mode==2) ? @m2rt : ($mode==3) ? @m3rt : @m4rt;
$r = int(rand(65536)+1);
$i = 0; $x = $tbl[0];
while ($r > $x) { $i++; $x += $tbl[$i]; }
$rt = &rtset($blk[$i], $blk[$i+1]);
return $rt;
}
# 引数2つの間のランダムな整数を返す
sub rtset {
my($y,$r,$a,$b);
($a, $b) = @_;
$y = $b - $a;
$r = int(rand($y)+1) + $a;
return $r;
}
# 少数を四捨五入して指定の桁にする
sub point {
my($value, $fig, $x);
($value, $fig) = @_;
$value = int($value * (10 ** $fig) + 0.5) / (10 ** $fig);
if ($value =~ /(\d+)\.(\d+)/) { $x = $2; }
elsif ($value !~ /\./) { $x =''; $value .= '.'; }
$value = $value.'0' x ( $fig - length($x) );
return $value;
}