source : バベル
#!/usr/bin/perl
# バベルシミュレーション
$cginame = 'babel.cgi';
$title = 'バベル シミュレーション';
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read (STDIN, $input, $ENV{'CONTENT_LENGTH'});
}
foreach (split(/&/,$input)) {
($name,$value) = split(/=/, $_);
push(@input, $value);
}
($s, $play, $s_big, $s_reg, $int, $start, $mode) = @input;
$int = 0 if !$int;
$int_chk[$int] = 'checked';
$s_big = 0 if !$s_big;
$s_reg = 0 if !$s_reg;
$def_sbig = $s_big; # 再試行で使用
$def_sreg = $s_reg;
print "Content-Type: text/html\n\n";
# ヘッダとフォームの表示
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_babel.html'>data</a> / <a href='babel_memo.html'>memo</a> / <a href='babel.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>B <input type='text' size=3 name='s_big' maxlength=3 value='$s_big'>
R <input type='text' size=3 name='s_reg' maxlength=3 value='$s_reg'> </td></tr>
<tr><td>内部ボーナス<br>の表\示</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>
最初のストック数は合計 255 まで。<br>
</center><br><br>
__ FORM __
# エラーチェックとGET
if (!$s or !$play) { $error = 1; $er_msg = '記入漏れがあります。'; }
if ($s<=0 or $s>6) { $error = 1; $er_msg = '設定は1〜6までです。'; }
$stock = $s_big + $s_reg;
if ($stock > 255) { $error=1; $er_msg = 'ストックは合計255個までです。'; }
if ($s =~ /[^\d]/ or $play =~ /[^\d\.]/) { $error = 1; $er_msg = '不適切な文字が入力されています。'; }
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_babel.html'>data</a> / <a href='babel_memo.html'>memo</a> / <a href='babel.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
exit;
}
# data
$big = 68; # /16384
$reg = 68;
$bell = 1560;
$scorp = 128;
$che2 = 180;
@che3 = (56,59,62,65,68,71); $che3 = $che3[$s-1];
@che4 = (28,30,32,34,36,38); $che4 = $che4[$s-1];
$rep = 2245; @reprt=(14295,14290,14285,14280,14275,14270); $reprt = $reprt[$s-1];
@bigget = (429.872, 432.146, 434.473, 436.827, 439.180, 441.533); $bigget = $bigget[$s-1];
$regget = 111.999+15;
# RTプレイ数振り分け /256
@b_low = (0,1,1,2,2,4,8,48,48,16,52,52,22);
@b_high = (16,32,64,64,64,8,8);
@r_low = (0,48,48,80,80);
@r_high = (8,32,48,72,64,32);
@blk = (0,1,8,16,32,48,80,144,400,656,720,976,1232,1296); # RTプレイ数
@can_che2 = (4,17); # チェリーによる強制解除確率 /256 低,高 の順
@can_che3 = (21,73);
@can_che4 = (102,171);
@low_bonus = (192,64); # 放出ボーナス /256 左からBIG, REG
$high_bonus[1] = '120 136';
$high_bonus[2] = '110 146';
$high_bonus[3] = '100 156';
$high_bonus[4] = '90 166';
$high_bonus[5] = '80 176';
$high_bonus[6] = '100 156';
@high_bonus = split(/ /, $high_bonus[$s]);
$mtb[1] = '50 180'; # mode移行 低→高 , 高→低 /256
$mtb[2] = '55 175';
$mtb[3] = '61 170';
$mtb[4] = '68 165';
$mtb[5] = '76 160';
$mtb[6] = '128 128';
$mtr[1] = '1 1';
$mtr[2] = '2 1';
$mtr[3] = '3 1';
$mtr[4] = '4 1';
$mtr[5] = '5 1';
$mtr[6] = '6 1';
@mtb = split(/ /, $mtb[$s]); @mtr = split(/ /, $mtr[$s]);
@mtscorp = (16,17,17,18,18,19); # サソリ当選時のモード移行 低→高 /256 左からs1~s6
$mtscorp = $mtscorp[$s-1];
print <<"__ HTML __";
<br><br><table border=1 cellspacing=0 align='center'>
<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>mode</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>
__ HTML __
$mode=0 if !$mode; # 据え置きでなければ 低 からスタート
# 最初のRTプレイ
if ($start) { $rt = $start; }
elsif ($stock) {
$next = &bonus($mode); # 次に放出するボーナスを抽選
$rt = &rt($mode,$next);
}
#--------------------
# シミュレート開始
#--------------------
$g = $count = $bigcount = $regcount = $checount = 0; $msg=' ';
while (1) {
$g++; $count++;
if ($coin < 3) { $coin += 50; $k++; $totalk++; }
$coin -= 3;
$fire-- if $fire;
# 規定RT消化
if ($rt<=$count && $stock) { $rt_cancel = 1; $fire = 0; }
$repr = ($stock) ? $reprt : $rep;
$r = int(rand(16384)+1);
if ($r<=$big && $stock<255) { # BIG
if (!$stock) { $next = 'b'; $rt = &rt($mode,$next); $rt += $count; } # 初ストック時
$stock++; $s_big++;
if ($int) {
print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 777</font></td>";
print "<td> </td><td> </td><td> </td><td> </td><td>B $s_big R $s_reg</td><td> </td>";
print "<td> </td><td>$g</td></tr>\n";
}
} elsif ($r<=($big+$reg) && $stock<255) { # REG
if (!$stock) { $next = 'r'; $rt = &rt($mode,$next); $rt += $count; } # 初ストック時
$stock++; $s_reg++;
if ($int) {
print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 REG</font></td>";
print "<td> </td><td> </td><td> </td><td> </td><td>B $s_big R $s_reg</td><td> </td>";
print "<td> </td><td>$g</td></tr>\n";
}
} elsif ($r <= ($big+$reg+$repr)) { # replay
if (!$stock) { $coin += 3; next; }
else {
$r = int(rand(8192)+1);
if ($r <= 1280) { $coin += 3; next; }
}
} elsif ($r <= ($big+$reg+$repr+$bell)) { $coin += 9; next; } # bell
elsif ($r <= ($big+$reg+$repr+$bell+$scorp)) { # scorpio
$coin += 3;
if(!$mode) { # mode 0 なら mode up 抽選
$r = int(rand(256)+1);
if($r <= $mtscorp) {
$mode = 1; $coin_d = int($coin);
print "<tr align='center'><td>( $count )</td>",'<td><font size=2>サソリ</font></td>';
print "<td><font color='blue' size=2>モード移行</font></td><td>→<font color='blue' size=2>高</font></td>";
print "<td>-</td><td>-</td><td>B $s_big R $s_reg</td><td> </td><td>$coin_d</td><td>$g</td></tr>\n";
}
}
}
elsif ($r <= ($big+$reg+$repr+$bell+$scorp+$che2)) {
$coin += 2; $r = int(rand(256)+1);
if ($r<=$can_che2[$mode] && $stock) {
$rt_cancel = 1; $fire = 1; $checount++;
$msg = '<font size=2>単チェリー解除</font>';
}
} elsif ($r <= ($big+$reg+$repr+$bell+$scorp+$che2+$che3)) {
$coin += 3; $r = int(rand(256)+1);
if ($r<=$can_che3[$mode] && $stock) {
$rt_cancel = 1; $fire = 1; $checount++;
$msg = '<font size=2 color=\'blue\'>2連チェリー解除</font>';
}
} elsif ($r <= ($big+$reg+$repr+$bell+$scorp+$che2+$che3+$che4)) {
$coin += 4; $r = int(rand(256)+1);
if ($r<=$can_che4[$mode] && $stock) {
$rt_cancel = 1; $fire = 1; $checount++;
$msg = '<font size=2 color=\'red\'>3連チェリー解除</font>';
}
} else {
if ($stock) { $rt_cancel = 1; $fire = 0; $msg = '<font size=2 color=\'009900\'>純ハズレ解除</font>'; }
}
# bonus 放出
if ($rt_cancel && !$fire) {
$rt_cancel = 0;
if ($next eq 'b') {
$bigcount++; $coin += $bigget; $s_big--; $stock--;
$get = '<font color=\'red\' face=\'Arial black\'><b>777</b></font>';
} else {
$regcount++; $coin += $regget; $s_reg--; $stock--; $get = '<b>REG</b>';
}
# mode 移行
$mode = &mt($mode,$next);
$next = &bonus($mode); # 次に放出するボーナスを決定
$rt = ($stock) ? &rt($mode,$next) : ' '; # 次のRTを決定
$k = ($k > 0) ? $k.'k' : ' ';
$opt = ($count < 128) ? '<font color=\'blue\'><b>' : ($count >= 500) ? '<font color=\'red\'><b>' : '';
$optc = ($count < 128) ? '</b></font>' : ($count >= 500) ? '</b></font>' : '';
$m_d = ($mode) ? '<font size=2 color=\'blue\'>高</font>' : '<font size=2>低</font>';
$coin_d = int($coin);
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</font></td><td>$get</td><td>$msg</td><td>→ $m_d</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_d</td><td>$g</td></tr>\n";
$k = ''; $count = 0; $msg = ' ';
}
if($g >= $play) {
$k = ($k > 0) ? $k.'k' : ' ';
$m_d = ($mode) ? '<font size=2 color=\'blue\'>高</font>' : '<font size=2>低</font>';
$coin_d = int($coin);
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>$m_d</td><td>";
print "<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_d</td><td>$g</td></tr>\n";
last;
}
}
# シミュデータの整理
$coin = int($coin);
$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 ($checount) { $che_p = &point(($g/$checount),2); $che_p = "(1/$che_p)"; }
$start = ($stock) ? $rt-$count : 0;
# 整理したデータ、再試行ボタン、フッタの表示
print <<"__ RESULT __";
</table><br><br>
<table border=1 align='center' cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=2><b>バベル 設定 $s</b></td></tr>
<tr><td>総プレイ数</td><td align='right'>$g P</td></tr>
<tr><td>BIG</td><td align='right'><b>$bigcount $b_prob</b></td></tr>
<tr><td>REG</td><td align='right'><b>$regcount $r_prob</b></td></tr>
<tr><td><font size=2>チェリー解除</font></td><td align='right'><b>$checount $che_p</b></td></tr>
<tr><td>投資</td><td align='right'>$toushi 円</td></tr>
<tr><td>獲得枚数</td align='right'><td align=right><b>$coin_d 枚</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='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='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='hidden' name='start' value='$mode'>
<input type='submit' value="再試行2(据え置き)">
</form></td></tr></table>
<br><br><br><br>
<div align='right'>[ <a href='../simu_data_babel.html'>data</a> / <a href='babel_memo.html'>memo</a> / <a href='babel.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __
exit;
# 放出ボーナスの決定
sub bonus {
my($mode,$i,$x,@tbl,$return,$next);
($mode) = @_;
if (!$s_big && !$s_reg) { return; }
elsif (!$s_big) { return 'r'; }
elsif (!$s_reg) { return 'b'; }
else { $x = ($mode) ? $high_bonus[0] : $low_bonus[0]; }
$r = int(rand(256)+1); $i = 0;
$next = ($r <= $x) ? 'b' : 'r';
return $next;
}
# モード移行
sub mt {
my($mode,$next,$trans);
($mode,$next) = @_;
$trans = ($mode && $next eq 'b') ? $mtb[1] : ($mode && $next eq 'r') ? $mtr[1]
: (!$mode && $next eq'b') ? $mtb[0] : $mtr[0];
$r = int(rand(256)+1);
if ($r <= $trans) { $mode = ($mode) ? 0 : 1; }
return $mode;
}
# RT 決定
sub rt {
my($mode,$next,@tbl,$i,$x);
($mode,$next) = @_;
@tbl = ($mode && $next eq'b') ? @b_high : ($mode && $next eq'r') ? @r_high : (!$mode && $next eq'b') ? @b_low : @r_low;
$r = int(rand(256)+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 {
local($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;
}