source : ミリオンゴッド
#!/usr/bin/perl
# ミリオンゴッド シミュレーション
$cginame = 'mg.cgi';
$title = 'ミリオンゴッド シミュレーション';
$linkdata = '<a href=\'../simu_data_mg.html\'>ミリオンゴッド シミュ使用データ</a>';
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read (STDIN, $input, $ENV{'CONTENT_LENGTH'});
}
print "Content-Type: text/html\n\n";
foreach ( split(/&/,$input) ) {
($name,$value) = split("=", $_);
push(@input, $value);
}
($s, $play, $mode, $stock, $mtrans, $stock2) = @input;
$mode = 0 if !$mode;
$stock = 0 if !$stock;
$def_mode = $mode; # 再試行で利用
$def_stock = $stock;
$int = 0 if !$mt;
$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_mg.html'>data</a> / <a href='mg_memo.html'>memo</a> / <a href='mg.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>最初のモード</td><td><input type='text' size=2 name='mode' maxlength=1 value='$mode'> </td></tr>
<tr><td>最初のストック数</td><td><input type='text' size=6 name='stock' maxlength=5 value='$stock'> </td></tr>
<tr><td><font size=2>mode移行の表\示</td><td><input type='radio' name='mtrans' value=0 $mt_chk[0]> 無
<input type='radio' name='mtrans' value=1 $mt_chk[1]> 有</td></tr>
</table><br>
<input type='submit' value="開始">
</form>
<table border=0><tr><td><font size=2>
設定は 1 〜 6 までの数値を入力。<br>
最初のモードには 0 〜 3 までの数値を入力。<br>
( <b>0</b>:地獄 <b>1</b>:ストック <b>2</b>:ノーマル <b>3</b>:天国 のモード)<br></font>
</td></tr></table>
</center>
__ FORM __
# エラーチェックと GET
if ($play > 9999) { $error = 1; $er_msg = 'プレイ数は最大9999Pまでです。'; }
if (!$s or !$play) { $error = 1; $er_msg = '記入漏れがあります。'; }
if ($stock > 32767) { $error = 1; $er_msg = 'ストックは 32767 個までです。'; }
if ($s<=0 or $s>6) { $error = 1; $er_msg = '設定は 1 から 6 までです。'; }
if (grep { /[^\d]/ } @input) { $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_mg.html'>data</a> / <a href='mg_memo.html'>memo</a> / <a href='mg.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
exit;
}
# データ
$pgg = 4; # / 32768
$sgg = 8;
$rep = 4490;
@c15 = (26540, 26544, 26548, 26552, 26556, 26560); $c15 = $c15[$s-1]; # 15枚役
@haz = (1726, 1722, 1718, 1714, 1710, 1706); $haz = $haz[$s-1]; # 純ハズレ
@c15s = (11, 49, 49, 49, 49, 49); # 15枚役の押し順 /256
@hazs = (228, 16, 8, 4); # 純ハズレ時の振り分け /256 GG中$hazs[2] $hazs[3]当選でストック放出
@mt = (36, 54, 81, 324); # 毎ゲームのモード移行の当選割合 / 32768, 左から m0~m3 (設定差なし)
@m0 = (23040, 2560, 768, 6400); # モード移行に当選した場合の移行モード /32768 左から m0~m3(設定差なし)
@m1 = (2560, 23040, 6400, 768);
@m2 = (768, 6400, 23040, 2560);
@m3 = (6400, 768, 2560, 23040);
@sggren = (30486, 256, 1024, 128, 512, 106, 256); # SGG当選時の連荘数 /32768 左から 3〜9連
# 逆押し15枚役成立時のGG個数 ''内は左から 0〜9連 /32768 , 配列の要素は左から設定 1〜6
@m1rev15 = ('32640 50 16 29 5 7 4 7 3 7', '32625 54 18 30 7 9 5 8 4 8',
'32603 61 21 32 10 12 6 9 5 9','32578 68 24 34 13 16 8 11 6 10',
'32534 86 28 36 16 20 11 13 11 13', '32324 172 64 40 24 32 24 32 24 32');
@m3rev15 = ('31488 500 160 290 50 70 40 70 30 70', '31338 540 180 300 70 90 50 80 40 80',
'31118 610 210 320 100 120 60 90 50 90', '30868 680 240 340 130 160 80 110 60 100',
'30428 860 280 360 160 200 110 130 110 130', '28328 1720 640 400 240 320 240 320 240 320');
@m1rev15 = split(/ /, $m1rev15[$s-1]);
@m3rev15 = split(/ /, $m3rev15[$s-1]);
@rep4 = (28160, 512, 4096); # リプレイ4連時の連荘数振り分け /32768 左から1〜3連
@fire = (384, 96, 80, 64, 256, 144); # GG終了後、次のGGの発動ゲーム数 左から 1~5,5 P以降 / 1024
# 順押し15枚役成立時のGG放出個数 ''内は左から 0〜3連 /32768 , 配列の要素は左から設定 1〜6
@m0jun15 = ('32453 280 7 28', '32409 317 10 32', '32367 352 13 36',
'32306 402 18 42', '32235 458 25 50', '32000 512 128 128');
@m3jun15 = ('29618 2800 70 280', '29178 3170 100 320', '28758 3520 130 360',
'28148 4020 180 420', '27438 4580 250 500', '25088 5120 1280 1280');
@m0jun15 = split(/ /, $m0jun15[$s-1]);
@m3jun15 = split(/ /, $m3jun15[$s-1]);
# 天井
@ten_a = (420, 400, 200, 4); # /1024 左から 1〜3,all個 これまでにストックがされた場合
@ten_b = (720, 200, 100, 4); # /1024 左から 0〜2,all個 これまでにストックがされてない。+1個当選
$mt = ($mtrans) ? '有' : '無';
print <<"__ HTML __";
<br><br><center><table border=1 cellspacing=0>
<caption><font size=2>最初のmode <b>$mode</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>GG<br>回数</font></td><td><font size=2>備考</font></td>
<td><font size=2>stock</font></td><td><font size=2>投資</font></td><td><font size=2>コイン</font></td>
<td><font size=2>総プレイ数</font></td></tr>
__ HTML __
#-------------------------
# シミュレート開始
#-------------------------
# あらかじめ計算
$pggr = $rep + $pgg;
$sggr = $pggr + $sgg;
$hazr = $sggr + $haz;
$pggcount = $sggcount = $ggcount = $g = $count = $coin = 0;
$msg=' ';
while (1) {
$g++; $count++;
if ($coin < 3) { $coin += 50; $k++; $totalk++; }
$coin -= 3;
if ($soku && !$gg_on) { # $soku ==1 なら このゲームで GG 発動。
$soku = 0; $gg_on = 1; $ggcount++; $flag = 1;
$get = '<font color=\'red\'><b>god game <font size=2>発動</font></b></font>'; $clr = '#ffffcc';
}
$r = int(rand(32768)+1);
if ($r <= $rep) { # replay
if ($gg_on) { # GG中rep
$coin += 3; $gg_replay = 1; $ggrep_c++;
if ($ggrep_c >= 3) { # GG中のリプレイ3連
$flag = 1; $get = "<font size=2><b>GG中 replay $ggrep_c 連";
if ($stock) {
$gg_hold += 1; $stock -= 1;
$msg='<font size=2 color=\'#00aa00\'><b>GG 1 個放出</b></font>';
}
}
} else { # 通常時rep
$replay = 1;
$rep_c++ if ($count>=50 or !$ggcount); # GG終了後 50P未満はカウントアップしない
if ($rep_c>=4 && ($count>=50 or !$ggcount)) {
$ren = &rand('rep4',32768)+1; $gg_hold += $ren; $soku = 1; $ggplay = 50; $flag = 1;
$msg = "<font color='#00aa00' size=2><b>GG $ren 個成立</b></font>";
$get = "<b>replay <font size=2>$rep_c 連</font></b>";
}
}
} elsif ($r <= $pggr) { # pgg
$flag=1; $pggcount++; $coin += 15;
$get = '<font color=\'gold\' face=\'impact\' size=4><b>GOD GOD GOD</b></font>'; $tbc = 'bgcolor=\'black\'';
if ($gg_on) { $ggplay += 500; } else { $soku = 1; $ggplay = 500; $gg_hold += 1; }
if ($stock) {
$ren = ($gg_on) ? 5 : ($count<=5 && $ggcount) ? 32767 : 3; # ストック放出
$ren = $stock if ($ren > $stock);
$gg_hold += $ren; $stock -= $ren;
$msg="<font size=2 color='#00aa00'><b>GG $ren 個放出</b></font>";
}
} elsif ($r <= $sggr) { # sgg
$sggcount++; $coin += 1;
$ren = &rand('sggren',32768) +3;
if ($mode <= 1) { $stock += $ren - 3; $ren = 3; $ten_st = 1; }
$gg_hold += $ren;
$flag = 1; $tbc = 'bgcolor=\'black\'';
$get = "<b><font size=2 color='#ffffff'>SGG ( $ren連 )</font><font color='red' face='arial black'> 777</font></b>";
if (!$gg_on) { $soku=1; $ggplay=50; }
if ($stock) {
$ren = ($gg_on) ? 3 : ($count<=5 && $ggcount) ? 5 : 0; # ストック放出
$ren = $stock if ($ren > $stock);
if ($ren) {
$gg_hold += $ren; $stock -= $ren;
$msg = "<font size=2 color='#00aa00'><b>GG $ren 個放出</b></font>";
}
}
} elsif ($r <= $hazr) {
if ($gg_on) {
$htype = &rand('hazs',256); # ハズレの種類
if ($htype >= 2) {
$flag = 1; $get = "<font size=2><b>GG中 純ハズレ";
if ($stock) {
$gg_hold += 1; $stock -= 1;
$msg = "<font size=2 color='#00aa00'><b>GG 1 個放出</b></font>";
}
}
}
} else { # 15枚役
if ($gg_on) { $coin+=15; } else {
$r15=int(rand(256)+1);
if ($r15 <= $c15s[0]) { # 順押し
$coin += 15;
$ren = ($mode <= 2) ? &rand('m0jun15',32768) : &rand('m3jun15',32768);
if ($ren && $stock) {
$ren = $stock if ($ren > $stock);
$soku = 1; $ggplay = 50;
$gg_hold += $ren; $stock -= $ren;
$flag = 1; $get = '<font size=2><b>GG 放出(<font color=\'#00aa00\'>順押し</font>15枚役)</b></font>';
$msg = "<font size=2 color='#00aa00'><b>GG $ren 個放出</b></font>";
}
if ($count>=1500 && $ten_st && !$ten) { # 天井:この天井までにストック有り
$ten = 1; $ren = &rand('ten_a',1024)+1;
$ren = 32767 if ($ren == 4);
$ren = $stock if ($ren > $stock);
$soku = 1; $ggplay = 50; $gg_hold += $ren; $stock -= $ren;
$flag = 1; $get = '<b><font size=2>GG 放出(<font color=\'blue\'>天井</font>)</b></font>';
$msg = "<font size=2 color='#00aa00'><b>GG $ren 個放出</b></font>";
} elsif ($count>=1500 && !$ten_st && !$ten) { # 天井:この天井までにストック無し
$ten = 1; $ren = &rand('ten_b',1024);
$ren = 32767 if ($ren == 4);
$ren = $stock if ($ren > $stock);
if ($ren) {
$soku = 1; $ggplay = 50; $gg_hold += $ren; $stock -= $ren;
$flag = 1; $get = '<font size=2><b>GG 放出(<font color=\'blue\'>天井</font>)</b></font>';
$msg = "<font size=2 color='#00aa00'><b>GG $ren 個放出</b></font>";
} else { # 天井でストック放出に当選しなかった場合、GG1個成立
$ren = 1; $soku = 1; $ggplay = 50; $gg_hold += $ren;
$flag = 1; $get = '<font size=2><b>GG 成立(<font color=\'blue\'>天井</font>)</b></font>';
$msg = "<font size=2 color='#00aa00'><b>GG $ren 個成立</b></font>";
}
}
} elsif ($r15 <= ($c15s[0]+$c15s[1])) { # 逆押し
$ren = ($mode==0) ? 0 : ($mode==1) ? &rand('m1rev15',32768)
: ($mode==2) ? &rand('m1rev15',32768) : &rand('m3rev15',32768);
if ($mode && $ren) { # GG放出プレイ数の抽選
if ($mode >= 2) { $gg_hold += $ren; $fire = $count; $st = ''; }
else { $stock += $ren; $st = '<font color=\'red\'>(stock)</font>'; $ten_st = 1; } # ストック
$flag = 1; $get = '<font size=2><b>GG 成立(<font color=\'blue\'>逆押し</font>15枚役)</b></font>';
$msg = "<font size=2 color='blue'><b>GG $ren 個成立 $st</b></font>";
}
}
}
}
if ($fire && !$gg_on) { # 逆押し15枚で成立したGGの発動抽選
$r2 = int(rand(4096)+1);
if (($count==$fire && $r2<=1124) or ($count==($fire+1) && $r2<=744) or ($count==($fire+2) && $r2<=896)
or ($count==($fire+3) && $r2<=1170) or $count==($fire+4)) { $fire = 0; $soku = 1; $ggplay = 50; }
}
# リプレイカウンタ
$rep_c =0 if (!$gg_on && !$replay && ($count>=50 or !$ggcount)); # 通常時
$ggrep_c=0 if (!$gg_replay && $gg_on); # GG 時
$ggplay-- if ($gg_on);
if ($ggplay == '-1' && $gg_on) {
$gg_on = 0; $gg_hold--;
$get = '<font size=2>GG 終了</font>'; $clr = 'white';
$flag = 1; $lot = 0; $fire = 0; $ten = 0; $ten_st = 0;
}
if ($r<=$mt[$mode] && !$gg_on) { # mode 移行
$new_mode = &rand($mode,32768);
if ($mtrans && ($new_mode != $mode)) { $flag = 1; $get = '<font size=2 color=\'blue\'>mode 移行'; }
$mode = $new_mode;
}
if ($flag) {
$k_d = ($k>0 && ($get=~m/god game/)) ? $k.'k' : ' ';
$count_d = ($get =~ /GOD/ or $get =~ /777/ or $get =~ /god/) ? "<b>$count</b>" : "($count)";
$mode_d = ($mode >= 2) ? "<font color='red'>$mode</font>" : $mode;
$count = 0 if ($get =~ /終了/);
if ($ggcount) { $ggp = int($g/$ggcount+0.5); $ggp = "$ggcount (1/$ggp)"; } else { $ggp = 0; }
print "<tr align='center' bgcolor='$clr'><td>$count_d</td><td $tbc>$get</td><td>$mode_d</td>";
print "<td>$ggp</td><td>$msg</td><td>$stock</td><td>$k_d</td><td>$coin</td><td>$g</td></tr>\n";
$k = 0 if ($get =~ /god game/);
$tbc = ''; $flag = 0; $msg = $get = ' ';
}
$replay = $gg_replay = 0;
if ($gg_hold && !$gg_on && !$lot && !$fire) { # GG終了後潜伏していれば発動抽選
$lot = 1; $delay = &rand('fire',1024); # delay=0~5
if ($delay == 5) { $delay = '-1'; } # 毎回 1/15.75 (65/1024 ?) の発動
}
if (($count==$delay) && $lot && !$gg_on) { $soku = 1; $ggplay = 50; }
elsif ($delay=='-1' && $count>=6 && $lot && !$gg_on) {
$r=int(rand(1024)+1);
if ($r<=65 or $count==49) { $soku = 1; $ggplay = 50; } # 抽選にはずれても50P目に発動
}
if($g >= $play) {
$k = ($k > 0) ? $k.'k' : ' ';
$coin_d = int($coin);
if ($ggcount) { $ggp = int($g/$ggcount+0.5); $ggp = "$ggcount (1/$ggp)"; } else { $ggp = 0; }
print "<tr align='center'><td>$count</td><td>ヤメ</td><td>$mode_d</td><td>$ggp</td><td> </td>";
print "<td>$stock</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);
$ggp = ($ggcount) ? &point(($g/$ggcount),3) : '';
$pggp = ($pggcount) ? &point(($g/$pggcount),3) : '';
$sggp = ($sggcount) ? &point(($g/$sggcount),3) : '';
# 整理したデータと再試行ボタン、フッタの表示
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'><b>god game</b></font></td>
<td align='right'><b>$ggcount 回 <font color='red'>1/$ggp</font></b></td></tr>
<tr><td align='center' bgcolor='black'><font color='gold' size=4 face='impact'><b>GOD</b></td>
<td align='right'><b>$pggcount 回 <font color='red'>1/$pggp</font></b></td></tr>
<tr><td align='center' bgcolor='black'><b><font size=2 color='#ffffff'>SGG</font>
<font color='red' face='arial black'>7</td><td align='right'><b>$sggcount 回 <font color='red'>1/$sggp</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='$def_mode'>
<input type='hidden' name='stock' value='$def_stock'>
<input type='hidden' name='mtrans' value='$mtrans'>
<center><input type='submit' value="再試行"></center>
</form>
<div align='right'>[ <a href='../simu_data_mg.html'>data</a> / <a href='mg_memo.html'>memo</a> / <a href='mg.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __
exit;
sub rand {
my($n,$rand,@tbl,$x,$r,$i);
($n,$rand) = @_;
@tbl = ($n eq 'rep4') ? @rep4 : ($n eq 'fire') ? @fire : ($n eq 'hazs') ? @hazs
: ($n eq '0') ? @m0 : ($n eq '1') ? @m1 : ($n eq '2') ? @m2
: ($n eq '3') ? @m3 : ($n eq 'm1rev15') ? @m1rev15 : ($n eq 'ten_a') ? @ten_a
: ($n eq 'ten_b') ? @ten_b : ($n eq 'm3rev15') ? @m3rev15 :($n eq 'm0jun15') ? @m0jun15
: ($n eq 'm3jun15') ? @m3jun15 : ($n eq 'sggren') ? @sggren : 0;
$x = $tbl[0]; $i = 0;
$r = int(rand($rand)+1);
while ($r > $x) { $i++; $x += $tbl[$i]; }
return $i;
}
# 少数を四捨五入して指定の桁にする
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;
}