[ source / home ]


source : 海一番


#!/usr/bin/perl
# 海一番シミュレーション

$cginame  = 'umi.cgi';
$title    = '海一番 シミュレーション';

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, $mode, $s_big, $s_reg, $int, $start) = @input;
    $def_sbig = $s_big;
    $def_sreg = $s_reg;
    $def_mode = $md=$mode;
    $s_big    = 0 if !$s_big;
    $s_reg    = 0 if !$s_reg;
}


$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_umi.html'>data</a> / <a href='umi_memo.html'>memo</a> / <a href='umi.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><input type='text' size=14 name='mode' maxlength=1 value='$mode'></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><font size=2>内部ボーナス<br>の表\示</font></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>
モードは 1〜7 までを入力。<br><br>
<b>1</b> 通常 <b>2</b> ハマリ <b>3</b> 引き戻し <b>4</b> 保留連<br>
<b>5</b> 確変 <b>6</b> 天国 <b>7</b> 超天国<br><br>
モードを指定しない場合、63.28% で mode1, 3.13% で mode2, 33.59% で mode3 となります。<br>
最初のストック数は合計 255 まで。</font><br>
</center><br><br>
__ FORM __


# 最初のモード
if(!$mode) {
    $r=int(rand(128)+1);
    $mode = ($r <= 81) ? 1 : ($r <= 81+4) ? 2 : 3;
}

# エラーチェックと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 ($mode<0 or $mode>6) { $error = 1; $er_msg = 'モードは 1 から 7 までです。'; }
if (grep { /[^\d]/ } ($play, $s_big, $s_reg)) { $error = 1; $er_msg = '不適切な文字が記入されています。'; };
$total_stock = $s_big + $s_reg;
if ($total_stock > 255) {  $error = 1; $er_msg = 'ストック数は合計255個までです。'; }

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_umi.html'>data</a> / <a href='umi_memo.html'>memo</a> / <a href='umi.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
    exit;
}

# データ RT振り分け
$m0[1] = '1,0,1,3,6,3,4,7,12,0,10,10,20,12,28,13,20,0,24,22,36,24,0';  #/256   [ ] 内は設定
$m0[2] = '1,0,1,4,10,3,4,9,14,0,12,10,22,12,28,13,18,0,22,20,30,23,0';
$m0[3] = '1,0,1,4,12,4,5,10,16,0,14,12,24,12,28,13,16,0,19,18,27,20,0';
$m0[4] = '1,0,1,4,13,5,6,11,20,0,15,12,26,13,27,12,15,0,17,16,26,16,0';
$m0[5] = '1,0,1,4,15,8,8,14,21,0,15,12,28,14,26,12,14,0,15,12,22,14,0';
$m0[6] = '1,0,1,4,16,8,8,14,23,0,16,13,30,15,26,12,12,0,13,12,20,12,0';
@m0b = split(/,/, $m0[$s]);
@m1b = (1,0,0,0,0,0,0,0,0,86,0,0,0,0,0,0,0,60,0,0,0,0,109);
@m2b = (2,26,26,86,116);
@m3b = (256,0);
@m4b = (16,16,224);
@m5b = (16,16,224);
@m6b = (16,16,224);
@m0r = (1,0,8,32,32,183);
@m1r = (1,0,8,32,32,183);
@m2r = (2,26,26,86,116);
@m3r = (256,0);
@m4r = (16,16,224);
@m5r = (16,16,224);
@m6r = (16,16,224);

# RTプレイ数
$block = '0 4 20 36 100 164 228 292 324 452 468 532 564 692 724 852 884 948 964 1028 1060 1188 1252 1316';
@blk = split(/ /,$block);


# 最初のストック
$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: ($bonus[0]) ? &rt("$mode-1", $bonus[0]) : 0;



# 通常時小役データ 総数は 16384
@big    = (93,94,95,96,96,96); $bigr = $big[$s-1];
$regr   = 9;
$rep    = 2245; @reprt=(14368,14352,14331,14305,14275,14240); $reprt = $reprt[$s-1];
@suika  = (1881,1896,1916,1941,1971,2006); $suikar = $suika[$s-1];
$cher   = 32;
@bigget = ('379.260','380.160','381.295','382.997','385.266','388.648');
$bigget = $bigget[$s-1];  $regget = 83.999+3;

$bm0[1] = '56,3,3,2,63,0,1'; # 通常モード(m0)からのモード移行 /128
$bm0[2] = '53,4,4,3,63,0,1';
$bm0[3] = '53,4,4,3,63,0,1';
$bm0[4] = '52,4,5,3,63,0,1';
$bm0[5] = '52,4,5,3,63,0,1';
$bm0[6] = '52,4,5,3,63,0,1';

$bm[0] = $bm0[$s];
$bm[1] = '1,0,0,0,125,0,2'; # 非通常モードからのモード移行
$bm[2] = '54,4,3,3,63,0,1';
$bm[3] = '54,4,3,3,63,0,1';
$bm[4] = '54,4,3,3,64,0,0';
$bm[5] = '1,0,0,0,34,93,0';
$bm[6] = '1,0,0,0,0,34,93';

$rm[0] = '116,2,6,4,0,0,0';
$rm[1] = '116,2,6,4,0,0,0';
$rm[2] = '116,2,6,4,0,0,0';
$rm[3] = '116,2,6,4,0,0,0';
$rm[4] = '0,0,0,0,127,1,0';
$rm[5] = '0,0,0,0,0,127,1';
$rm[6] = '0,0,0,0,0,1,127';


print <<"__ HTML __";
<br><br><table border=1 align='center' cellspacing=0><caption>シミュレーション結果</caption>
<tr align='center' bgcolor='#ffffcc'><td><font size=2>ゲーム数</font></td><td><font size=2>当選</font></td>
<td><font size=2>備考</font></td><td><font size=2>次のRT</font></td><td><font size=2>モード</font></td>
<td><font size=2>待機<br>モード</font><td><font size=2>BIG<br>回数</font></td><td><font size=2>REG<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>
__ HTML __

#----------------------
#  シミュレート開始
#----------------------
$g = $count = $bigcount = $regcount = $coin = $ren = $delay = 0;
$msg=' '; $mode--;

while (1) {
    $g++; $count++;
    if ($coin < 3) { $coin += 50; $k++; $totalk++; }
    $coin -= 3;

    if ($delay) { $delay--;  $rt_cancel = 1; }           # リプ解除の際の潜伏
    if ($rt<=$count && $bonus[0]) { $rt_cancel = 1; }      # 規定RT消化

    $repr = ($bonus[0] && !$rt_cancel) ? $reprt : $rep;
    $r    = int(rand(16384)+1);

    if ($r <= $repr) { # リプレイ
        if (!$bonus[0]) { $coin += 3; next; }
        else {
            $r = int(rand(8192)+1);
            if (($r>=6901 && $mode<=3) or ($r>=4621 && $mode>=4)) { $coin += 3; next; } # 揃うリプレイ 1292,5572/8192
            elsif (!$delay &&(($r<=10 && $mode<=1) or ($r<=90 && $mode==2) or ($r<=10 && $mode==3)
               or ($r<=360 && $mode==4) or ($r<=280 && $mode>=5))) {
                 $msg = '<font size=2>リプ解除</font>';
                 $r = int(rand(16)+1);
                 $delay = ($r==1) ? 1 : ($r==2) ? 2 : ($r<=4) ? 3 : ($r<=8) ? 4 : 5;
                 $delay++;
            }
        }
    } elsif ($r <= ($repr+$suikar)) { $coin += 8; } # スイカ
    elsif ($r <= ($repr+$suikar+$cher)) { $coin += 2; } # che
    elsif ($r <= ($repr+$suikar+$cher+$bigr) && $#bonus<254) { # BIG
        if (!$bonus[0]) { $rt = $rt_d = &rt('0','B'); $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>";
            print "<td> </td><td>$rt_d</td><td> </td><td> </td><td> </td><td> </td>";
            print "<td>B $s_big R $s_reg</td><td> </td><td> </td><td>$g</td></tr>\n";
        }
    } elsif ($r <= ($repr+$suikar+$cher+$bigr+$regr) && $#bonus<254) { # REG
        if (!$bonus[0]) { $rt = $rt_d = &rt('0','R'); $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>";
            print "<td> </td><td>$rt_d</td><td> </td><td> </td><td> </td><td> </td>";
            print "<td>B $s_big R $s_reg</td><td> </td><td> </td><td>$g</td></tr>\n";
        }
    } else { # haz
        if ($bonus[0] && !$rt_cancel) { $rt_cancel = 1; $msg = '<font size=2>純ハズレ解除</font>'; }
    }

    # RT 解除
   if ($rt_cancel && !$delay) {
        $rt_cancel = 0;
        if ($bonus[0] eq 'B') {
            $bigcount++; $coin += $bigget; $s_big--; shift(@bonus);
            if ($nextmode>=4 && $bonus[0]) {
                $get = '<font color=red face=\'Arial black\'><b><font size=2>確変</font> 777</b></font>';
                $ren++;
            } else {
                $get = '<font face=\'Arial black\' color=\'blue\'><b><font size=2>通常</font> 777</b></font>';
            }
        } else {
            $regcount++; $coin += $regget; $s_reg--; shift(@bonus); $get = '<b>REG</b>';
        }

        # ストックありならモード移行
        if ($bonus[0]) {
            $past = $mode;  $mode = $nextmode;
            @mt = ($bonus[0] eq 'B') ? @bm : @rm;
            @mt = split(/,/, $mt[$mode]); # 次回ボーナス放出後の mode を決定
            $r = int(rand(128)+1); $i = 0; $x = $mt[0];
            while ($r > $x) { $i++; $x += $mt[$i]; }
            $nextmode = $i;
        } else { $mode = 0; } # ストック無しなら次のモードは 0

        if ($bonus[0]) { $rt = $rt_d = &rt($mode,$bonus[0]); } else { $rt_d = ' ';}  # ストック有りならRTプレイ数決定

        $opt  = ($count < 50) ? '<b><font color=\'blue\'>' : ($count >=700) ? '<b><font color=\'red\'>' : '';
        $optc = ($count < 50) ? '</font></b>'              : ($count >=700) ? '</font></b>'             : '';

        $k = ($k > 0) ? $k.'k' : ' ';
        $md  = $past + 1;      # 今のモード(表示用)
        $md2 = $mode + 1;      # 次のモード(表示用)
        $md3 = $nextmode + 1;  # 次回ボーナス放出後のモード(表示用)

        $opt2  = ($md2==5) ? '<font color=\'red\'>' : ($md2>=6) ? '<font color=\'red\'><b>' : '';
        $opt2c = ($md2==5) ? '</font>'              : ($md2>=6) ? '</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='center'><td>$opt $count $optc</td><td>$get</td><td>$msg</td><td>$rt_d</td>";
        print "<td>$md →$opt2 $md2 $opt2c</td><td>$md3</td><td><font color='blue'>$bigcount</font> $b_prob</td>";
        print "<td><font color='blue'>$regcount</font> $r_prob</td><td>B $s_big R $s_reg</td>";
        print "<td>$k</td><td>$coin_d</td><td>$g</td></tr>\n";
        $k = ''; $count = $delay = 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='center'><td>$count</td><td>ヤメ</td><td> </td><td> </td><td> </td><td>$md3</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";
        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)"; }

$renbig = &point(($ren/$bigcount*100),2) if $bigcount;
$start  = $rt - $count;

# 整理したデータ、再試行ボタン、フッタの表示
print <<"__ RESULT __";
</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</td></tr>
<tr><td>REG</td><td align='right'><b>$regcount $r_prob</td></tr>
<tr><td>投資</td><td align='right'>$toushi 円</td></tr>
<tr><td>確変BIG 率</td><td align='right'>$ren / $bigcount <font color='red'><b>( $renbig % )</b></font></td></tr>
<tr><td>獲得枚数</td><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='mode' value='$mode'>
<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='mode' value='$mode'>
<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='mode' value='$mode'>
<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='submit' value="再試行3(設定変更)">
</form></td></tr></table>

<br><br><br><br>
<div align='right'>[ <a href='../simu_data_umi.html'>data</a> / <a href='umi_memo.html'>memo</a> / <a href='umi.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __


exit;

# RT 決定
sub rt {
    my($mode,$bonus,@tbl,$i,$r,$x,$rt);
    ($mode,$bonus) = @_;

    @tbl = ($mode==0 && $bonus eq 'B') ? @m0b : ($mode==0 && $bonus eq 'R') ? @m0r
        :  ($mode==1 && $bonus eq 'B') ? @m1b : ($mode==1 && $bonus eq 'R') ? @m1r
        :  ($mode==2 && $bonus eq 'B') ? @m2b : ($mode==2 && $bonus eq 'R') ? @m2r
        :  ($mode==3 && $bonus eq 'B') ? @m3b : ($mode==3 && $bonus eq 'R') ? @m3r
        :  ($mode==4 && $bonus eq 'B') ? @m4b : ($mode==4 && $bonus eq 'R') ? @m4r
        :  ($mode==5 && $bonus eq 'B') ? @m5b : ($mode==5 && $bonus eq 'R') ? @m5r
        :  ($mode==6 && $bonus eq 'B') ? @m6b : ($mode==6 && $bonus eq 'R') ? @m6r : 0;

    $i = 0; $x = $tbl[0];
    $r = int(rand(256)+1);
    while ($r > $x) { $i++; $x += $tbl[$i]; }
    $rt = &rtset($blk[$i], $blk[$i+1]);
    return $rt;
}
# 引数2つの間のランダムな整数を返す
sub rtset {
    local($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;
}


[ source / home ]