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 ]