[ source / home ]


source : バベル


#!/usr/bin/perl
# バベルシミュレーション


$cginame  = 'babel.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, $s_big, $s_reg, $int, $start, $mode) = @input;


$int = 0 if !$int;
$int_chk[$int] = 'checked';

$s_big = 0 if !$s_big;
$s_reg = 0 if !$s_reg;
$def_sbig = $s_big;  # 再試行で使用
$def_sreg = $s_reg;

print "Content-Type: text/html\n\n";


# ヘッダとフォームの表示
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_babel.html'>data</a> / <a href='babel_memo.html'>memo</a> / <a href='babel.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>B <input type='text' size=3 name='s_big' maxlength=3 value='$s_big'>
 R <input type='text' size=3 name='s_reg' maxlength=3 value='$s_reg'> </td></tr>
<tr><td>内部ボーナス<br>の表\示</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>

設定は 1 〜 6 までの数値を入力。<br>
最初のストック数は合計 255 まで。<br>
</center><br><br>
__ FORM __


# エラーチェックとGET
if (!$s or !$play) { $error = 1; $er_msg = '記入漏れがあります。'; }
if ($s<=0 or $s>6) { $error = 1; $er_msg = '設定は1〜6までです。'; }
$stock = $s_big + $s_reg;
if ($stock > 255) { $error=1; $er_msg = 'ストックは合計255個までです。'; }
if ($s =~ /[^\d]/ or $play =~ /[^\d\.]/) { $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_babel.html'>data</a> / <a href='babel_memo.html'>memo</a> / <a href='babel.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
    exit;
}

# data
$big   = 68; # /16384
$reg   = 68;
$bell  = 1560;
$scorp = 128;
$che2  = 180;
@che3  = (56,59,62,65,68,71);  $che3 = $che3[$s-1];
@che4  = (28,30,32,34,36,38);  $che4 = $che4[$s-1];
$rep   = 2245; @reprt=(14295,14290,14285,14280,14275,14270); $reprt = $reprt[$s-1];
@bigget = (429.872, 432.146, 434.473, 436.827, 439.180, 441.533); $bigget = $bigget[$s-1];
$regget = 111.999+15;

# RTプレイ数振り分け /256
@b_low  = (0,1,1,2,2,4,8,48,48,16,52,52,22);
@b_high = (16,32,64,64,64,8,8);
@r_low  = (0,48,48,80,80);
@r_high = (8,32,48,72,64,32);
@blk    = (0,1,8,16,32,48,80,144,400,656,720,976,1232,1296); # RTプレイ数

@can_che2 = (4,17);    # チェリーによる強制解除確率 /256  低,高 の順
@can_che3 = (21,73);
@can_che4 = (102,171);

@low_bonus = (192,64); # 放出ボーナス /256  左からBIG, REG
$high_bonus[1] = '120 136';
$high_bonus[2] = '110 146';
$high_bonus[3] = '100 156';
$high_bonus[4] = '90 166';
$high_bonus[5] = '80 176';
$high_bonus[6] = '100 156';
@high_bonus = split(/ /, $high_bonus[$s]);

$mtb[1] = '50 180'; # mode移行 低→高 , 高→低 /256
$mtb[2] = '55 175';
$mtb[3] = '61 170';
$mtb[4] = '68 165';
$mtb[5] = '76 160';
$mtb[6] = '128 128';
$mtr[1] = '1 1';
$mtr[2] = '2 1';
$mtr[3] = '3 1';
$mtr[4] = '4 1';
$mtr[5] = '5 1';
$mtr[6] = '6 1';
@mtb = split(/ /, $mtb[$s]); @mtr = split(/ /, $mtr[$s]);
@mtscorp = (16,17,17,18,18,19); # サソリ当選時のモード移行 低→高 /256 左からs1~s6
$mtscorp = $mtscorp[$s-1];

print <<"__ HTML __";
<br><br><table border=1 cellspacing=0 align='center'>
<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>mode</font></td><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 __


$mode=0 if !$mode; # 据え置きでなければ 低 からスタート

# 最初のRTプレイ
if ($start) { $rt = $start; }
elsif ($stock) {
    $next = &bonus($mode);   # 次に放出するボーナスを抽選
    $rt   = &rt($mode,$next);
}

#--------------------
#  シミュレート開始
#--------------------
$g =  $count = $bigcount = $regcount = $checount = 0; $msg=' ';
while (1) {
    $g++; $count++;
    if ($coin < 3) { $coin += 50; $k++; $totalk++; }
    $coin -= 3;

    $fire-- if $fire;

    # 規定RT消化
    if ($rt<=$count && $stock) { $rt_cancel = 1; $fire = 0; }

    $repr = ($stock) ? $reprt : $rep;
    $r = int(rand(16384)+1);

    if ($r<=$big && $stock<255) { # BIG
        if (!$stock) { $next = 'b'; $rt = &rt($mode,$next); $rt += $count; } # 初ストック時
        $stock++; $s_big++;
        if ($int) {
            print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 777</font></td>";
            print "<td> </td><td> </td><td> </td><td> </td><td>B $s_big R $s_reg</td><td> </td>";
            print "<td> </td><td>$g</td></tr>\n";
        }
    } elsif ($r<=($big+$reg) && $stock<255) { # REG
        if (!$stock) { $next = 'r'; $rt = &rt($mode,$next); $rt += $count; } # 初ストック時
        $stock++; $s_reg++;
        if ($int) {
            print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 REG</font></td>";
            print "<td> </td><td> </td><td> </td><td> </td><td>B $s_big R $s_reg</td><td> </td>";
            print "<td> </td><td>$g</td></tr>\n";
        }
    } elsif ($r <= ($big+$reg+$repr)) { # replay
        if (!$stock) { $coin += 3; next; }
        else {
            $r = int(rand(8192)+1);
            if ($r <= 1280) { $coin += 3; next; }
        }
    } elsif ($r <= ($big+$reg+$repr+$bell)) { $coin += 9; next; }   # bell
    elsif ($r <= ($big+$reg+$repr+$bell+$scorp)) { # scorpio
        $coin += 3;
        if(!$mode) {  # mode 0 なら mode up 抽選
            $r = int(rand(256)+1);
            if($r <= $mtscorp) {
                $mode = 1; $coin_d = int($coin);
                print "<tr align='center'><td>( $count )</td>",'<td><font size=2>サソリ</font></td>';
                print "<td><font color='blue' size=2>モード移行</font></td><td>→<font color='blue' size=2>高</font></td>";
                print "<td>-</td><td>-</td><td>B $s_big R $s_reg</td><td> </td><td>$coin_d</td><td>$g</td></tr>\n";
            }
        }
    }
    elsif ($r <= ($big+$reg+$repr+$bell+$scorp+$che2)) {
        $coin += 2;  $r = int(rand(256)+1);
        if ($r<=$can_che2[$mode] && $stock) {
            $rt_cancel = 1; $fire = 1; $checount++;
            $msg = '<font size=2>単チェリー解除</font>';
        }
    } elsif ($r <= ($big+$reg+$repr+$bell+$scorp+$che2+$che3)) {
        $coin += 3; $r = int(rand(256)+1);
        if ($r<=$can_che3[$mode] && $stock) {
            $rt_cancel = 1; $fire = 1; $checount++;
            $msg = '<font size=2 color=\'blue\'>2連チェリー解除</font>';
        }
    } elsif ($r <= ($big+$reg+$repr+$bell+$scorp+$che2+$che3+$che4)) {
        $coin += 4; $r = int(rand(256)+1);
        if ($r<=$can_che4[$mode] && $stock) {
            $rt_cancel = 1; $fire = 1; $checount++;
            $msg = '<font size=2 color=\'red\'>3連チェリー解除</font>';
        }
    } else {
        if ($stock) { $rt_cancel = 1; $fire = 0; $msg = '<font size=2 color=\'009900\'>純ハズレ解除</font>'; }
    }

    # bonus 放出
    if ($rt_cancel && !$fire) {
        $rt_cancel = 0;
        if ($next eq 'b') {
            $bigcount++; $coin += $bigget; $s_big--; $stock--;
            $get = '<font color=\'red\' face=\'Arial black\'><b>777</b></font>';
        } else {
            $regcount++; $coin += $regget; $s_reg--; $stock--; $get = '<b>REG</b>';
        }

        # mode 移行
        $mode = &mt($mode,$next);
        $next = &bonus($mode);    # 次に放出するボーナスを決定
        $rt   = ($stock) ? &rt($mode,$next) : ' ';  # 次のRTを決定
        $k    = ($k > 0) ? $k.'k' : ' ';

        $opt  = ($count < 128) ? '<font color=\'blue\'><b>' : ($count >= 500) ? '<font color=\'red\'><b>' : '';
        $optc = ($count < 128) ? '</b></font>'              : ($count >= 500) ? '</b></font>'             : '';
        $m_d  = ($mode) ? '<font size=2 color=\'blue\'>高</font>' : '<font size=2>低</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</font></td><td>$get</td><td>$msg</td><td>→ $m_d</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";
        $k = ''; $count = 0; $msg = ' ';
    }

    if($g >= $play) {
        $k = ($k > 0) ? $k.'k' : ' ';
        $m_d = ($mode) ? '<font size=2 color=\'blue\'>高</font>' : '<font size=2>低</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>$count</td><td>ヤメ</td><td> </td><td>$m_d</td><td>";
        print "<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)"; }
if ($checount) { $che_p  = &point(($g/$checount),2); $che_p  = "(1/$che_p)"; }

$start = ($stock) ? $rt-$count : 0;

# 整理したデータ、再試行ボタン、フッタの表示
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</b></td></tr>
<tr><td>REG</td><td align='right'><b>$regcount $r_prob</b></td></tr>
<tr><td><font size=2>チェリー解除</font></td><td align='right'><b>$checount $che_p</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><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='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='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='hidden' name='start' value='$mode'>
<input type='submit' value="再試行2(据え置き)">
</form></td></tr></table>

<br><br><br><br>
<div align='right'>[ <a href='../simu_data_babel.html'>data</a> / <a href='babel_memo.html'>memo</a> / <a href='babel.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __

exit;
# 放出ボーナスの決定
sub bonus {
    my($mode,$i,$x,@tbl,$return,$next);
    ($mode) = @_;
    if (!$s_big && !$s_reg) { return; }
    elsif (!$s_big) { return 'r'; }
    elsif (!$s_reg) { return 'b'; }
    else { $x = ($mode) ? $high_bonus[0] : $low_bonus[0]; }

    $r    = int(rand(256)+1); $i = 0;
    $next = ($r <= $x) ? 'b' : 'r';
    return $next;
}
# モード移行
sub mt {
    my($mode,$next,$trans);
    ($mode,$next) = @_;

    $trans = ($mode && $next eq 'b') ? $mtb[1] : ($mode && $next eq 'r') ? $mtr[1]
           : (!$mode && $next eq'b') ? $mtb[0] : $mtr[0];

    $r = int(rand(256)+1);
    if ($r <= $trans) { $mode = ($mode) ? 0 : 1; }
    return $mode;
}
# RT 決定
sub rt {
    my($mode,$next,@tbl,$i,$x);
    ($mode,$next) = @_;
    @tbl = ($mode && $next eq'b') ? @b_high : ($mode && $next eq'r') ? @r_high : (!$mode && $next eq'b') ? @b_low : @r_low;

    $r = int(rand(256)+1); $i = 0; $x = $tbl[0];
    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 ]