jug7.com
[ home / cgi / juggler / column / diary / bbs / link / welcome ]
source : ストリートファイター2 シミュレーション
#!/usr/bin/perl
# ストリートファイター2 シミュレーション
$cginame = 'st2.cgi';
$title = 'ストリートファイター2 シミュレーション';
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) = @input;
}
# ヘッダとフォームの表示
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'>
<font size=7><b><font face='Times New Roman,Times'>jug</font><font face='Bookman Old Style,arial black,Helvetica Black'>7</font><font face='Times New Roman,Times'>.com</font></b></font>
<hr color='#00aa00'>
<strong>[ <a href='../index.html'>home</a> / <a href='index.html'>cgi</a> / <a href='../jug/index.html'>juggler</a> / <a href='../column.html'>column</a> / <a href='../diary/index.html'>diary</a> / <a href='bbs.cgi'>bbs</a> / <a href='../link.html'>link</a> / <a href='../intro.html'>welcome</a> ]</strong>
<div align='center'><h2>$title</h2></div>
<hr width='70%'>
<div align='right'>[ <x href='simu_data_st2.html'>data</a> / <x href='st2_memo.html'>memo</a> / <x href='st2.html'>source</a> ]</div>
<br><br><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>
</table><br>
<input type='submit' value="開始">
</form>
<font size=2>設定は 1 〜 6 までの数値を入力。<br>
BIG獲得枚数は 563.182枚 とした。<br>
</font>
</center><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 = '不適切な文字が記入されています。'; };
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'>[ <x href='simu_data_st2.html'>data</a> / <x href='st2_memo.html'>memo</a> / <x href='st2.html'>source</a> ]</div>};
exit;
}
# data
# 通常時小役データ 総数は 65536
$big = 275;
$reg = 137;
$rep_n = 8980;
$rep_rt = 9021;
$bell = 9335;
$hat = 820;
$che = 393;
$bigget = 563.182; # 残り6PからJACIN優先
$regget = 99;
@che_end = (16384, 16895, 17406, 20992, 26619, 32252);
$che_end = $che_end[$s-1];
@hat_end = (1024, 1024, 1024, 1024, 2048, 3072);
$hat_end = $hat_end[$s-1];
@rep3_end = (21845, 21845, 24966, 24966, 28090, 34330);
$rep3_end = $rep3_end[$s-1];
@long = (24576, 21502, 19458, 16384, 13310, 8192);
$long = $long[$s-1];
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>BIG<br>回数</font></td><td><font size=2>REG<br>回数</font></td>";
print "<td><font size=2>投資</font></td><td><font size=2>コイン</font></td><td><font size=2>総ゲーム数</font></td></tr>\n";
#----------------------
# シミュレート開始
#----------------------
$g = $count = $bigcount = $regcount = $coin = 0;
$rt = $rt2 = 0;
$msg=' ';
while (1) {
$g++; $count++;
if ($coin < 3) { $coin += 50; $k++; $totalk++; }
$coin -= 3;
# BIG 時のRT終了
if ($count == $rtb) {
$rtb = 0;
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
}
# REG時のRT終了
if ($count == $rtr) {
$rtr = 0;
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
}
# 前兆終了
if ($count == $rt2) {
$rt2 = 0;
$rt_end = 1;
}
$rep = ($rt_flag) ? $rep_rt : $rep_n;
$r = int(rand(65536)+1);
if ($r <= $bell) { # bell
$coin +=6;
$rep_ren=0; next;
} elsif ($r <= $bell+$rep) { # rep
$coin += 3;
if ($rtb or $rtr) {
$rep_ren++;
if ($rep_ren >= 3) {
# RT強制終了抽選
$r = int(rand(65536)+1);
if ($r <= $rep3_end) {
# RT 強制終了
$msg ='リプ3連 RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtb = $rtr = 0;
}
}
}
} elsif ($r <= $bell+$rep+$hat) { # hat
$coin += 5; $rep_ren=0;
if ($rtb or $rtr) {
# RT強制終了抽選
$r = int(rand(65536)+1);
if ($r <= $hat_end) {
# RT強制終了抽選
$r = int(rand(65536)+1);
if ($r <= $hat_end) {
# RT 強制終了
$msg ='帽子 RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtb = $rtr = 0;
}
}
}
} elsif ($r <= $bell+$rep+$hat+$che) { # che
$rep_ren=0;
$r = int(rand(65536)+1);
if ($rtb) { # BIGによるRT中
if ($r <= 3072) { # 1che
$coin += 1;
# RT 強制終了
$msg = '1che RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtb = 0;
} elsif ($r <= 9216) { # chance目(解除確定) 3072 + 6144
# RT 強制終了
$msg = 'che(0枚役) RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtb = 0;
} else { # 2che
$coin += 2;
$r = int(rand(65536)+1);
if ($r <= $che_end) {
# RT 強制終了
$msg = '2che RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtb = 0;
}
}
} elsif ($rtr) { # REG によるRT中
if ($r <= 6144) { # chance目(解除確定)
# RT 強制終了
$msg = 'che(0枚役) RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtr = 0;
} else { # 2che
$coin += 2;
$r = int(rand(65536)+1);
if ($r <= $che_end) {
# RT 強制終了
$msg = '2che RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtr = 0;
}
}
} else {
$r = int(rand(65536)+1);
if ($r <= 6144) { $coin += 0; } # chance目
else { $coin += 2; }
next;
}
} elsif ($r <= $bell+$rep+$hat+$che+$big) { # BIG
if ($rtb or $rtr or $rt2 or $rt_end) { $rep_ren=0; next; }
$bonus = 'B';
$r = int(rand(65536)+1);
if ($r <= $long) {
$r = int(rand(2)+1);
if ($r==1) { $rtb = 898; $msg = 'RT 898'; } else { $rtb = 899; $msg = 'RT 899'; }
} else {
$r = int(rand(2)+1);
if ($r==1) { $rtb = 1; } else { $rtb = 2; }
}
$rtb += $count;
} elsif ($r <= $bell+$rep+$hat+$che+$big+$reg) { # REG
if ($rtb or $rtr or $rt2 or $rt_end) { $rep_ren=0; next; }
$bonus ='R';
$r = int(rand(2)+1);
if ($r==1) { $rtr = 1; } else { $rtr = 2; }
$rtr += $count;
} elsif ($r == 65534) {
if ($rtb or $rtr) { # 純ハズレによるRT解除
# RT 強制終了
$msg ='純ハズレ RT解除';
$r = int(rand(31)+1);
$rt2 = $r + $count; # 前兆へ突入
$rtb = $rtr = 0;
}
} else { $rep_ren=0; }
# bonus 放出
if ($rt_end) {
$rtb = $rtr = $rt2 = $rt_end = 0;
if ($bonus eq 'B') {
$bigcount++; $coin += $bigget;
$get='<font color=\'blue\' face=\'Arial black\'><b>777</b></font>';
} else {
$regcount++; $coin += $regget; $get='<b>REG</b>';
}
$k = ($k > 0) ? $k.'k' : ' ';
$opt = ($count < 150) ? '<font color=\'blue\'><b>' : ($count >= 500) ? '<font color=\'red\'><b>' : '';
$optc = ($count < 150) ? '</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><font size=2>$msg</font></td>";
print "<td><font color='blue'>$bigcount</font> $b_prob</td><td><font color='blue'>$regcount</font> $r_prob</td>";
print "<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>";
print "<font color='blue'>$bigcount</font> $b_prob</td><td><font color='blue'>$regcount</font> $r_prob</td>";
print "<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)"; }
# 整理したデータと再試行ボタン、フッタの表示
print <<"__ HTML __";
</table><br><br>
<table border=1 align='center' cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=2><b>ストリートファイター2 設定 $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><center>
<form action='$cginame' method='POST'>
<input type='hidden' name='s' value='$s'>
<input type='hidden' name='play' value='$play'>
<input type='submit' value="再試行">
</form></center>
<br><br><br><br>
<div align='right'>[ <x href='simu_data_st2.html'>data</a> / <x href='st2_memo.html'>memo</a> / <x href='st2.html'>source</a> ]</div>
</body></html>
__ HTML __
exit;
# 少数を四捨五入して指定の桁にする
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;
}
[ home / cgi / juggler / column / diary / bbs / link / welcome ]