source : キングパルサー
#!/usr/bin/perl
# キングパルサー シミュレーション
$cginame = 'king_p.cgi';
$title = 'キングパルサー シミュレーション';
# データRT振り分け stock なし 総数は 256
$s0[1] = '1,1,1,1,1,1,1,1,1,1,140,10,60,10,13,13';
$s0[2] = '1,1,1,1,1,1,1,1,1,1,153,10,60,10,13,0';
$s0[3] = '1,1,1,1,1,1,1,1,1,1,141,10,59,10,13,13';
$s0[4] = '1,1,1,1,1,1,1,1,1,1,153,10,60,10,13,0';
$s0[5] = '1,1,1,1,1,1,1,1,1,1,191,9,30,8,6,2';
$s0[6] = '183,0,0,0,0,0,0,0,0,0,35,12,20,4,2,0';
# データRT振り分け stock あり 総数は 256
$s1[1] = '11,28,34,30,16,12,20,13,8,13,0,20,14,11,13,13';
$s1[2] = '11,28,34,30,16,12,20,13,8,13,0,30,35,3,2,1';
$s1[3] = '18,28,30,28,16,12,18,14,8,14,0,20,14,11,12,13';
$s1[4] = '16,21,32,45,18,12,14,10,8,9,0,30,35,3,2,1';
$s1[5] = '16,35,34,39,16,12,20,13,8,13,0,15,10,8,8,9';
$s1[6] = '24,41,47,40,24,12,13,9,7,9,1,10,14,3,2,0';
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, $s_big, $s_reg, $int, $start) = @input;
$def_sbig = $s_big; # 再試行で利用
$def_sreg = $s_reg;
@s0tbl = split(/,/, $s0[$s]);
@s1tbl = split(/,/, $s1[$s]);
$block= '0 8 16 24 32 40 48 64 80 96 127 128 256 512 768 1024 1279'; # データ RTプレイ数
@blk=split(/ /,$block);
}
$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_king-p.html'>data</a> / <a href='king_p_memo.html'>memo</a> / <a href='king_p.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=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>内部ボーナス<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>
<font size=2>設定は 1 〜 6 までの数値を入力。<br>
最初のストック数は合計30まで。</font><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 && $s>6) { $error = 1; $er_msg = '設定は 1 から 6 までです。'; }
if (grep { /[^\d]/ } ($play, $s_big, $s_reg)) { $error = 1; $er_msg = '不適切な文字が記入されています。'; };
$total_stock = $s_big + $s_reg;
if ($total_stock > 30) { $error = 1; $er_msg = 'ストック数は合計30個までです。'; }
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_king-p.html'>data</a> / <a href='king_p_memo.html'>memo</a> / <a href='king_p.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
exit;
}
# 最初のストック
$s_big = 0 if !$s_big;
$s_reg = 0 if !$s_reg;
for (1..$s_big) { push(@bonus,"B"); }
for (1..$s_reg) { push(@bonus,"R"); }
while (@bonus) { push( @new_bonus, splice(@bonus,rand(@bonus),1) ); }
@bonus = @new_bonus;
$rt = ($start) ? $start: &rt;
# data
# 通常時小役データ 総数は 16384
@big = (55,55,58,61,64,68); $bigr = $big[$s-1];
@reg = (27,27,32,37,42,45); $regr = $reg[$s-1];
$rep = 2245;
@reprt = (14316, 14316, 14308, 14300, 14292, 14205); $reprt = $reprt[$s-1];
@bell = (1845,1845,1845,1845,1845,1925); $bellr = $bell[$s-1];
$orar = 120;
$cher = 20;
$bigget = ($s <= 4) ? '399.254' : ($s==5) ? '405.182' : '411.183';
$regget = 15+111.999;
print q{<br><br><table border=1 align='center' cellspacing=0><caption>シミュレーション結果</caption>};
print "<tr align='center' bgcolor='#ffffcc'><td><font size=2>ゲーム数</font></td><td><font size=2>当選</font></td>";
print "<td><font size=2>備考</font></td><td><font size=2>次のRT</font></td><td><font size=2>BIG<br>回数</font></td>";
print "<td><font size=2>REG<br>回数</font></td><td><font size=2>ストック数</font></td><td><font size=2>投資</font></td>";
print "<td><font size=2>コイン</font></td><td><font size=2>総ゲーム数</font></td></tr>\n";
#----------------------
# シミュレート開始
#----------------------
$g = $count = $bigcount = $regcount = $coin = 0;
$msg=' ';
while (1) {
$g++; $count++;
if ($coin < 3) { $coin += 50; $k++; $totalk++; }
$coin -= 3;
# 規定RT消化
if ($rt <= $count && $bonus[0]) { $rt_cancel = 1; }
$repr = ($bonus[0]) ? $reprt : $rep;
$r=int(rand(16384)+1);
if ($r <= $bigr && $#bonus < 29) { # BIG
if (!$bonus[0]) { $rt = $rt_d = &rt; $rt += $count; } else { $rt_d=' '; }
push(@bonus, 'B'); $s_big++;
if ($int) {
print "<tr align='right' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 777</font></td><td> </td><td>$rt_d</td>";
print "<td> </td><td> </td><td>B $s_big R $s_reg</td><td> </td><td> </td><td>$g</td></tr>\n";
}
} elsif ($r <= ($bigr+$regr) && $#bonus<29) { # REG
if (!$bonus[0]) { $rt = $rt_d = &rt; $rt += $count; } else { $rt_d=' '; }
push(@bonus, 'R'); $s_reg++;
if ($int) {
print "<tr align='right' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 REG</font></td><td> </td><td>$rt_d</td>";
print "<td> </td><td> </td><td>B $s_big R $s_reg</td><td> </td><td> </td><td>$g</td></tr>\n";
}
} elsif ($r <= ($bigr+$regr+$repr)) { # replay
if (!$bonus[0]) {
$coin += 3; next;
} else {
$r = int(rand(8192)+1);
if ($r <= 1290) { $coin += 3; next; }
elsif ($r<=1302) { # 1302 = 1290+12
$rt_cancel = 1;
$msg = '<font size=2>特殊リプ解除</font>';
}
}
} elsif ($r <= ($bigr+$regr+$repr+$bellr)) { $coin+=8; next; } # bell
elsif ($r <= ($bigr+$regr+$repr+$bellr+$orar)) { $coin+=12; next; } # orange
elsif ($r <= ($bigr+$regr+$repr+$bellr+$orar+$cher)) { $coin+=3; } # cherry
else { # ハズレ
if ($bonus[0]) { $rt_cancel = 1; $msg = '<font size=2>純ハズレ解除</font>'; } # 純ハズレ解除
}
# bonus 放出
if ($rt_cancel) {
$rt_cancel = 0;
if ($bonus[0] eq 'B') {
$bigcount++; $coin += $bigget; $s_big--; shift(@bonus);
$get='<font color=\'red\' face=\'Arial black\'><b>777</b></font>';
} else {
$regcount++; $coin += $regget; $s_reg--; shift(@bonus); $get='<b>REG</b>';
}
$rt = ($bonus[0]) ? &rt : ' '; # 次の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>' : '';
$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='right'><td>$opt $count $optc</font></td><td>$get</td><td>$msg</td><td>$rt</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' : ' ';
$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='right'><td>$count</td><td>ヤメ</td><td> </td><td> </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)"; }
$start = $rt - $count if $rt; # 据え置きの場合の初期 RT (ストック有りの場合)
$r_sbig = ($bonus[0] eq 'B') ? $s_big-1 : ($bonus[0] eq 'R') ? $s_big : 0; # リセット時は次に放出のボーナスを削除
$r_sreg = ($bonus[0] eq 'B') ? $s_reg : ($bonus[0] eq 'R') ? $s_reg-1 : 0;
# 整理したデータと再試行ボタン、フッタの表示
print <<"__ HTML __";
</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>投資</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='submit' value="再試行2(据え置き)">
</form></td><td>
<form action='$cginame' method='POST'>
設定<input type='text' name='s' size=3 value='$s'><br>
<input type='hidden' name='play' value='$play'>
<input type='hidden' name='s_big' value='$r_sbig'>
<input type='hidden' name='s_reg' value='$r_sreg'>
<input type='hidden' name='int' value='$int'>
<input type='submit' value="再試行3(設定変更)">
</form></td></tr></table>
<br><br><br><br>
<div align='right'>[ <a href='../simu_data_king-p.html'>data</a> / <a href='king_p_memo.html'>memo</a> / <a href='king_p.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ HTML __
exit;
# RT プレイ数決定
sub rt {
my($i,$r,$rt,$x,@tbl);
$i=0; $x=0;
@tbl = ($bonus[0]) ? @s1tbl : @s0tbl;
$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;
}
sub rtset { # 引数2つの間のランダムな整数を返す
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;
}