source : 獣王
#!/usr/bin/perl
# 獣王 シミュレーション
$cginame = 'juou.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, $mode, $hazd, $mtrans) = @input;
print "Content-Type: text/html\n\n";
$mode_chk[$mode] = 'checked';
$haz_chk[$hazd] = 'checked';
$mt_chk[$mtrans] = '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_juou.html'>data</a> / <a href='juou_memo.html'>memo</a> / <a href='juou.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=13 value='$s'></td></tr>
<tr><td>試行ゲーム数</td><td><input type='text' size=13 name='play' maxlength=4 value='$play'></td></tr>
<tr><td><font size=2>最初の mode</font></td><td><input type='radio' name='mode' value=1 $mode_chk[1]>高確率
<input type='radio' name='mode' value=0 $mode_chk[0]>低確率</td></tr>
<tr><td><font size=2>純ハズレの表\示</font></td><td><input type='radio' name='hazd' value=1 $haz_chk[1]> 有り
<input type='radio' name='hazd' value=0 $haz_chk[0]>無し</td></tr>
<tr><td><font size=2>mode 移行の表\示</font></td><td><input type='radio' name='mtrans' value=1 $mt_chk[1]> 有り
<input type='radio' name='mtrans' value=0 $mt_chk[0]>無し</td></tr>
</table><br>
<input type='submit' value="開始">
</form>
<font size=2>設定は 1 〜 6 までの数値を入力。</font>
</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]/ } ($s, $play)) { $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_juou.html'>data</a> / <a href='juou_memo.html'>memo</a> / <a href='juou.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
exit;
}
# データ
@big = (149,149,149,149,149,188);
@reg = (80,81,82,83,84,91);
@haz = (319,318,317,316,315,269);
$big = $big[$s-1];
$reg = $reg[$s-1];
$haz = $haz[$s-1];
$rep = 8980;
$che = 1024;
$c15 = 54984;
$bigget = 399.681;
$regget = 113.959; # 2+111.959
@sc0 = (11,18,11,25,11,236); # 低確率時 SC 当選 総数は 256
@sc1 = (55,79,105,127,155,236); # 高確率時 SC 当選
$sc0 = $sc0[$s-1]; $sc1 = $sc1[$s-1];
$ren0[1] = '986,3,3,3,3,3,3,3,3,3,3,3,3,2'; # 低確率時 SC 連荘数 [ ] 内は 設定
$ren0[2] = '755,60,118,52,5,5,5,5,5,5,3,3,2,1,';
$ren0[3] = '987,3,3,3,3,3,3,3,3,3,3,3,3,1';
$ren0[4] = '755,60,118,52,5,5,5,5,5,5,3,3,2,1,';
$ren0[5] = '987,3,3,3,3,3,3,3,3,3,3,3,3,1';
$ren0[6] = '680,0,333,1,1,1,1,1,1,1,1,1,1,1';
$ren1[1] = '228,48,136,205,112,112,112,11,11,11,11,11,9,7'; # 低確率時 SC 連荘数
$ren1[2] = '329,20,138,205,100,100,100,5,5,5,5,5,4,3,';
$ren1[3] = '228,48,136,205,112,112,112,11,11,11,11,11,9,7';
$ren1[4] = '329,20,138,205,100,100,100,5,5,5,5,5,4,3,';
$ren1[5] = '228,48,136,205,112,112,112,11,11,11,11,11,9,7';
$ren1[6] = '680,0,333,1,1,1,1,1,1,1,1,1,1,1';
$ren2[1] = '1011,1,1,1,1,1,1,1,1,1,1,1,1,1'; # 天井到達時 SC 連荘数
$ren2[2] = '807,205,1,1,1,1,1,1,1,1,1,1,1,1,';
$ren2[3] = '807,205,1,1,1,1,1,1,1,1,1,1,1,1,';
$ren2[4] = '807,1,205,1,1,1,1,1,1,1,1,1,1,1,';
$ren2[5] = '807,1,205,1,1,1,1,1,1,1,1,1,1,1,';
$ren2[6] = '807,1,205,1,1,1,1,1,1,1,1,1,1,1,';
@ren0 = split(/,/, $ren0[$s]); @ren1 = split(/,/, $ren1[$s]); @ren2 = split(/,/, $ren2[$s]);
@ren_tbl = (1,2,3,5,7,9,11,13,15,17,19,21,25,29); # 連荘回数
$start_m = ($mode) ? '高' : '低';
$hazd2 = ($hazd) ? '有' : '無';
$mt = ($mtrans) ? '有' : '無';
print <<"__ TABLE __";
<br><br><center><table border=1 cellspacing=0>
<caption><font size=2>最初のmode <b>$start_m</b> 純ハズレ表\示 <b>$hazd2</b>
モード移行表\示 <b>$mt</b></font></caption>
<tr align='center' bgcolor='#ffffcc'><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>SC<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>
__ TABLE __
# あらかじめ計算
$regr = $big + $reg;
$hazr = $big + $reg + $haz;
$repr = $big + $reg + $haz + $rep;
$cher = $big + $reg +$ haz + $rep + $che;
#---------------------
# シミュレート開始
#---------------------
$g = $count = $coin = $bigcount = $regcount = $sccount = 0;
$m1sc = $m0sc = $m1hcount = $m0hcount = 0; $msg=' ';
while (1) {
$g++; $count++;
if ($coin < 3) { $coin += 50; $k++; $totalk++; }
$coin -= 3;
if ($soku) {
$soku = 0; $r = int(rand(8)+1); # 初当たり後、1/4 で即放出
if ($r <= 2) {
$sc_on = 1; $sccount++; $flag = 1; $clr = '#ffffbb';
$get = '<font face=\'arial black\' size=2 color=\'red\'>SAVANNA CHANCE</font>';
$scplay0 = ($r == 1) ? 30 : 10; # 表示用
$scplay = ($r == 1) ? 30 : 10;
}
}
if ($sc_hold && !$sc_on) { # SC放出抽選。潜伏していれば 1/25 で放出とする。
$r = int(rand(50)+1);
if ($r <= 2) {
$sc_on = 1; $sccount++; $flag = 1; $clr = '#ffffbb';
$get = '<font face=\'arial black\' size=2 color=\'red\'>SAVANNA CHANCE</font>';
$scplay0 = ($r == 1) ? 30 : 10;
$scplay = ($r == 1) ? 30 : 10;
}
}
$scplay--;
if ($scplay=='-1' && $sc_on) {
$sc_on = 0; $sc_hold--; $flag = 1;
$opt = ($scplay0 == 10) ? 'black' : 'red';
$get = "<font size=2><font color='$opt'><b>SC $scplay0</b></font> 終了</font>"; $clr = 'white';
}
$r = int(rand(65536)+1);
if ($r <= $big) {
$get = '<font color=\'red\' face=\'arial black\'><b>777</b></font>';
$bigcount++; $coin += $bigget; $m_up = 1; $mode = 1; $flag = 1;
} elsif ($r <= $regr) {
$get = '<font color=black><b>REG</b></font>'; $regcount++; $coin += $regget; $flag = 1;
$r = int(rand(256)+1); # mode 移行
if ($mode && $r<=128) { $m_down = 1; $mode = 0; } elsif (!$mode && $r<=11) { $m_up = 1; $mode = 1; }
} elsif ($r <= $hazr) { # 純ハズレ
$r = int(rand(256)+1);
if ($mode) { $scr = $sc1; $m1hcount++; } else { $scr = $sc0; $m0hcount++; }
if ($r <= $scr) { # SC 当選
if ($mode) { $m1sc++; } else { $m0sc++; }
$opt2 = ($hazd) ? '<font size=2>純ハズレ</font><br>' : '';
$flag = 1; $soku = 1;
$sc_hit = &scren($mode); $sc_hold += $sc_hit;
$get = "$opt2<font size=2 color='#00aa00'><b>SC 内部当選</b></font>";
$msg = "<font color='#00aa00' size=2><b>SC $sc_hit 連</b></font>";
} else { # SC 非当選
if ($hazd) { $flag = 1; $get = '<font size=2>純ハズレ</font>'; }
}
} elsif ($r <= $repr) {
$coin += 3; $r=int(rand(256)+1);
if ($mode && $r<=10) { # mode down
$m_down = 1; $mode = 0;
if ($mtrans) { $flag = 1; $get = '<font size=2>mode 移行(rep)</font>'; }
}
} elsif ($r <= $cher) {
$coin += 4; $r = int(rand(256)+1);
$ten_che = 1 if ($count >= 1136); # 天井フラグ
if ($mode && $r <= 64) { # mode down
$m_down = 1; $mode = 0;
if ($mtrans) { $flag = 1; $get = '<font size=2>mode移行(che)</font>'; }
} elsif (!$mode && $r==100) { # mode up
$m_up = 1; $mode = 1;
if ($mtrans) { $flag = 1; $get = '<font size=2>mode移行(che)</font>'; }
}
} else { # 15枚役
if ($sc_on) { $coin+=15; } else {
$r = int(rand(12)+1);
$coin += 15 if ($r==10);
}
}
if ($ten_che && !$ten) { # 天井
$r = int(rand(1024)+1);
if ($r <= 100) {
$ten = 1; $flag = 1;
$get = '<font size=2 color=\'#00aa00\'><b>SC 内部当選<br><font color=\'blue\'>天井</font></font>';
$sc_hit = &scren(2); $sc_hold += $sc_hit;
$msg = "<font color='#00aa00' size=2><b>SC $sc_hit 連</b></font>";
if ($mode) { $m1sc++; } else { $m0sc++; }
}
}
if ($flag) {
$coin_d = int($coin);
$k_d = ($k>0 && ($get =~ /777/ or $get =~ /REG/ or $get =~ /SAVA/)) ? $k.'k' : ' ';
if ($get =~ /777/ or $get =~ /REG/) { # BR の時はカウントやその他フラグを 0 に戻す
$count_d = "<b>$count"; $count = 0; $ten = 0; $ten_che = 0;
} else {
$count_d="($count)"; # サバやモード移行表示の時は ( カウント ) の形で表示
}
$mode_d = ($mode) ? '<font size=2 color=\'blue\'><b>高</b></font>' : '<font size=2>低</font>';
$mode_d = ($m_up) ? '<font size=2 color=\'blue\'><b>→高</b></font>' : ($m_down) ? '<font size=2>→低</font>' : $mode_d;
if ($bigcount) { $bp = int($g/$bigcount+0.5); $bigcp = "$bigcount (1/$bp)"; } else { $bigcp = 0; }
if ($regcount) { $rp = int($g/$regcount+0.5); $regcp = "$regcount (1/$rp)"; } else { $regcp = 0; }
print "<tr align='center' bgcolor='$clr'><td>$count_d</td><td>$get</td><td>$mode_d</td><td>$bigcp</td>";
print "<td>$regcp</td><td>$sccount</td><td>$msg</td><td>$k_d</td><td>$coin_d</td><td>$g</td></tr>\n";
$flag = 0; $msg = ' ';
$k = 0 if (($get =~ /777/ or $get =~ /REG/ or $get =~ /SAVA/));
}
$m_up = $m_down = 0;
if($g >= $play) {
$k = ($k > 0) ? $k.'k' : ' ';
$coin_d = int($coin);
if ($bigcount) { $bp = int($g/$bigcount+0.5); $bigcp = "$bigcount (1/$bp)"; } else { $bigcp = 0; }
if ($regcount) { $rp = int($g/$regcount+0.5); $regcp = "$regcount (1/$rp)"; } else { $regcp = 0; }
$mode_d = ($mode) ? '<font size=2><b>高</b></font>' : '<font size=2>低</font>';
print "<tr align='center'><td>$count</td><td>ヤメ</td><td>$mode_d</td><td>$bigcp</td><td>$regcp</td>";
print "<td>$sccount</td><td> </td><td>$k</td><td>$coin_d</td><td>$g</td></tr>\n";
last;
}
}
# シミュデータの整理
$toushi = $totalk * 1000;
$coin = int($coin);
$kankin = $coin * 20;
$shushi = $kankin - $toushi;
$opt3 = ($shushi>=0) ? 'blue' : 'red';
$payout = ($coin-$totalk*50)/($g*3) *100+100;
$payout = &point($payout,2);
$hazcount = $m1hcount + $m0hcount;
if ($bigcount) { $bigp = &point(($g/$bigcount),3); } else { $bigp = ''; }
if ($regcount) { $regp = &point(($g/$regcount),3); } else { $regp = ''; }
if ($sccount) { $scp = &point(($g/$sccount),3); } else { $scp = ''; }
if ($hazcount) { $hazp = &point(($g/$hazcount),3); } else { $hazp = ''; }
if ($m1sc) { $m1scp = &point(($m1sc/$m1hcount*100),2); } else { $m1scp = 0; }
if ($m0sc) { $m0scp = &point(($m0sc/$m0hcount*100),2); } else { $m0scp = 0; }
$hit = $m1sc + $m0sc;
$ren = ($hit) ? &point(($sccount/($m1sc+$m0sc)),2) : 0;
# 整理したデータ、再試行ボタン、フッタの表示
print <<"__ RESULT __";
</table><br><br>
<table border=0><tr><td colspan=2 align='center' bgcolor='#ffffcc'>
<b><font size=4 color='red'>獣王</font> 設定 $s</font></b></td></tr>
<tr valign='top'><td><table border=1 align='center' cellpadding=3 cellspacing=0>
<tr><td align='center'>プレイ数</td><td align='right'> $g P</td></tr>
<tr><td align='center'><font color='red' face='arial black'><b>777</b></td>
<td align='right'><b>$bigcount 回 <font color='red'>1/$bigp</font></td></tr>
<tr><td align='center'><b>REG</b></td><td align='right'><b>$regcount 回 <font color='red'>1/$regp</font></b></td></tr>
<tr><td align='center'><font color='red' face='arial black' size=2><b>SAVANNA<br>CHANCE</b></font></td>
<td align='right'><b>$sccount 回 <font color='red'>1/$scp</font>
<br><br><font size=2>初当たり <b>$hit 回<br>平均 $ren 連</b></font></td></tr>
<tr><td align='center'><font size=2>純ハズレ</font></td>
<td align='right'><b>$hazcount 回 <font color='red'>1/$hazp</font></b></td></tr>
<tr><td align='center'><font size=2>高確ハズレ<br>からのSC</font></td>
<td align='right'>$m1sc / $m1hcount <b><font color='red'>$m1scp %</font></b></td></tr>
<tr><td align='center'><font size=2>低確ハズレ<br>からのSC</font></td>
<td align='right'>$m0sc / $m0hcount <b><font color='red'>$m0scp %</font></b></td></tr>
</table></td><td>
<table border=1 align='center' cellpadding=3 cellspacing=0>
<tr><td align='center'>投資</td><td align='right'>$toushi 円</td></tr>
<tr><td align='center'>獲得枚数</td><td align='right'><b>$coin 枚</b></td></tr>
<tr><td align='center'>PAYOUT</td><td align='right'><b>$payout %</b></td></tr>
<tr><td align='center'>換金</td><td align='right'>$kankin 円</td></tr>
<tr><td align='center'>収支</td><td align='right'><b><font color='$opt3'>$shushi 円</font></b></td></tr>
</table></td></tr></table></center>
<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='hazd' value='$hazd'>
<input type='hidden' name='mtrans' value='$mtrans'>
<center><input type='submit' value="再試行"></center>
</form>
<br><br>
<div align='right'>[ <a href='../simu_data_juou.html'>data</a> / <a href='juou_memo.html'>memo</a> / <a href='juou.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __
exit;
# SC 連荘数決定
sub scren {
my(@tbl,$x,$i,$r,$ren);
@tbl = ($_[0] == 0) ? @ren0 : ($_[0] == 1) ? @ren1 : @ren2;
$x = $tbl[0]; $i = 0;
$r = int(rand(1024)+1);
while ($r > $x) { $i++; $x += $tbl[$i]; }
$ren = $ren_tbl[$i];
return $ren;
}
# 少数を四捨五入して指定の桁にする
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;
}