[ source / home ]


source : ボンバーパワフル


#!/usr/bin/perl
# ボンバーパワフル シミュレーション

$cginame  = 'b_power.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;
    $mode = 1 if !$mode;
    $def_sbig = $s_big;  # 再試行で使用
    $def_sreg = $s_reg;
    $def_mode = $mode;
}

$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_b_power.html'>data</a> / <a href='b_power_memo.html'>memo</a> / <a href='b_power.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>
設定は 1 〜 6 までの数値を入力。<br>
ストック数は BR 共に 99 個まで。<br>
モードについて: <b>1</b>->通常、 <b>2</b>->ハマリ、 <b>3</b>->連荘、 <b>4</b>->ボンバー<br>
</center><br><br>
__ FORM __


# エラーチェックと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 (grep { /[^\d]/ } ($play, $s_big, $s_reg)) { $error = 1; $er_msg = '不適切な文字が記入されています。'; };
if ($s_big>99 or $s_reg>99) {  $error = 1; $er_msg = 'ストック数はBR 共に 99 個までです。'; }

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

# data
# 通常時小役データ 総数は 65536
$big     = 272;
$reg     = 180;
$che     = 656;
$melon   = 656;
$grape   = 6908;
$rep     = 8980; $reprt = 56864;
$b_budo  = 25600; $b_jac = 16384; $b_12 = 5600;
$b_melon = ($s==6) ? 4448 : 4444;
$jachaz  = 256;

# RT 振り分け /65536
$m1[1]=$m1[3]=$m1[5] = '1024,1024,1024,1024,1024,2560,5120,256,10923,256,20292,256,10923,3277,3277,1638,1638';
$m1[2]=$m1[4]=$m1[6] = '1024,1024,1024,1024,1024,2560,10254,256,18400,256,18400,256,5120,1638,1638,819,819';
$m2[1]=$m2[3]=$m2[5] = '128,128,128,128,128,128,256,6553,256,1638,256,6553,256,9000,7500,7500,6000,6000,4500,4500,4000';
$m2[2]=$m2[4] = '128,128,128,128,128,128,256,6553,256,6553,256,13400,694,7000,5800,5800,4600,4600,3400,3400,2200';
$m2[6] = '256,256,256,256,256,256,512,6553,512,6553,512,13400,31862,1300,900,700,500,300,200,100,96';
$m3 = '4096,10377,10377,10377,4096,22937,1638,819,819';
$m4 = '21845,7282,7282,7282,21845';

@m1rt = split(/,/, $m1[$s]);
@m2rt = split(/,/, $m2[$s]);
@m3rt = split(/,/, $m3);
@m4rt = split(/,/, $m4);

# RTプレイ数
@blk = (0, 10, 20, 30, 40, 50, 100, 150, 200, 250, 300, 400, 500, 600, 700, 800, 900, 1000, 1050, 1100, 1150, 1200);

$s_big = 0 if !$s_big;
$s_reg = 0 if !$s_reg;
$stock = $s_big + $s_reg;
$rt    = ($start) ? $start : &rt($mode); # 初期RTの決定

# モード移行 振り分け /241
$m1t[1] = '80,80,76,5';
$m1t[2] = '80,80,80,1';
$m1t[3] = '70,70,76,25';
$m1t[4] = '70,70,88,13';
$m1t[5] = '55,55,76,55';
$m1t[6] = '55,55,122,9';

$m2t[1] = '80,40,96,25';
$m2t[2] = '80,40,115,6';
$m2t[3] = '75,20,96,50';
$m2t[4] = '75,20,115,31';
$m2t[5] = '60,10,96,75';
$m2t[6] = '60,10,162,9';

$m3t = '48,48,144,1';
$m4t = '1,1,119,120';

@m1t = split(/,/, $m1t[$s]);
@m2t = split(/,/, $m2t[$s]);
@m3t = split(/,/, $m3t);
@m4t = split(/,/, $m4t);

# 放出するボーナス
@rel_big = (170, 32, 170, 156);  #/256 左から m1~m4


print <<'__ TBL __';
<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>BIG獲得</font></td><td><font size=2>モード移行</font></td>
<td><font size=2>次のRT</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>
__ TBL __


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

    $delay-- if $delay; # 前兆RT $delay==0 でボーナス放出
    # 規定RT消化
    if ($rt<=$count && $stock && !$rt_cancel) { $rt_cancel = 1; $delay = 1; }  # RT消化の次のプレイで放出

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

    if ($r <= $repr) {
        if (!$stock) { $coin += 3; next; }  else {
            $r = int(rand(8192)+1);
            if ($r<=1294) { $coin += 3; next; } # RT中の揃うリプレイ
        }
    } elsif ($r <= ($repr+$grape)) { $coin+=8; next; }
    elsif ($r <= ($repr+$grape+$che)) {
        $r = int(rand(256)+1); # チェリー解除と 2 or 4枚の振り分け
        if($r <= 16 && $stock) {  # 解除
            $rt_cancel = 1; $delay = 0;
            $msg = '<font size=2 color=\'red\'>イチゴ解除</font>';
            $r = int(rand(256)+1); $coin += ($r <= 224) ? 2 : 4;
        } else {  # 非解除
            $r = int(rand(256)+1); $coin += ($r <=  64) ? 2 : 4;
        }
    } elsif ($r <= ($repr+$grape+$che+$melon)) {
        $coin += 12; $r = int(rand(256)+1);
        if ($r<=8 && $stock && !$rt_cancel) {
            $rt_cancel = 1; $delay = 9+1;
            $msg = '<font size=2 color=\'blue\'>メロン解除</font>';
        }
    } elsif ($r<=($repr+$grape+$che+$melon+$big)) {  # 内部BIG
        if ($s_big>0 or $s_reg>0) { # すでにストックありの場合、内部ボーナス解除抽選
            $r=int(rand(256)+1);
            if ($r<=2 && $stock && !$rt_cancel) {
                $rt_cancel = 1; $delay = 9+1;
                $msg = '<font size=2>内部 BIG 解除</font>';
            }
        }
        if ($s_big < 99) { $s_big++; $stock++; }  # ストックする
        if($s_big==1 && !$s_reg) {        # 初ストックなら、RTプレイ数の抽選
            $rt = $rt_d = &rt($mode);     # $rt_d は表示用
            $rt += $count;                # 初ストックなので、現在のプレイ数に上乗せ。
        } else { $rt_d=' '; }

        if($int) {  # 内部ボーナス表示有りの場合
            print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 777</font></td>";
            print "<td> </td><td> </td><td> </font></td><td>$rt_d</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> </td><td>$coin</td><td>$g</td></tr>\n";
        }
    } elsif($r <= ($repr+$grape+$che+$melon+$big+$reg)) {  # 内部REG
        if ($s_big>0 or $s_reg>0) {
            $r = int(rand(256)+1);
            if ($r<=2 && $stock && !$rt_cancel) {
                $rt_cancel = 1; $delay = 9+1; $msg = '<font size=2>内部 REG 解除</font>';
            }
        }
        if ($s_reg < 99) { $s_reg++; $stock++; }
        if (!$s_big && $s_reg==1) {
            $rt = $rt_d = &rt($mode);
            $rt += $count;
        } else { $rt_d=' '; }
        if ($int) {
            print "<tr align='center' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 REG</font></td>";
            print "<td> </td><td> </td><td> </font></td><td>$rt_d</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> </td><td>$coin</td><td>$g</td></tr>\n";
        }
    }

    # RT を解除してボーナス放出
    if ($rt_cancel && !$delay) {
        $rt_cancel = 0;
        $r = int(rand(256)+1);
        if( !$s_reg or ($s_big && $s_reg && $r<=$rel_big[$mode-1]) ) {   # BIG 放出
            $bigcount++; $s_big--; $stock--;
            $get='<font color=\'red\' face=\'Arial black\'><b>777</b></font>';

            # BIG プレイ開始
            $bigget += 15; $jacin = $in = 0;
            for ($x=1; $x<=30; $x++) {
                $bigget -= 3;
                $r = int(rand(65536)+1);
                if ($r <= $b_budo){
                    $bigget += 8;
                    $r = int(rand(655536)+1);
                    $ren = 1 if $r<=180; # ブドウによる1P連
                } elsif($r <= ($b_budo+$b_jac)) {
                    if (($jacin<2) or ($jacin==2 && $x>=20)) { # jacin
                        $bigget += 3; $jacin++;
                        for ($y=1; $y<=12; $y++) {
                            $r = int(rand(65536)+1);
                            if ($r <= $jachaz) {
                                $r = int(rand(65536)+1);
                                if ($r <= 65535) { $ren = 1; $bigget -= 1; } # JACハズレによる1P連
                            } else { $bigget += 14; $in++; }
                            if ($in == 8) { $in = 0; last; }
                        }
                        last if $jacin==3;
                    }
                }
                elsif ($r <= ($b_budo+$b_jac+$b_12)) { $bigget += 12; }
                elsif($r<=($b_budo+$b_jac+$b_12+$b_melon)) { $bigget+=12; }
                else {
                    $r = int(rand(65536)+1);
                    $ren = 1 if $r<=327;  # ハズレによる1P連
                }
            } # BIG プレイ終了
            $coin += $bigget;
        } else {  # REG 放出
            $regcount++; $s_reg--; $stock--; $get='<b>REG</b>';
            $coin += 15; $in = 0; $bigget=' ';
            for ($y=1; $y<=12; $y++) {
                $r = int(rand(65536)+1);
                if ($r <= $jachaz) { $ren = 1; $coin -= 1; } # JACハズレによる1P連
                else { $coin += 14; $in++; }
                last if ($in==8);
            }
        }

        $mode = &mt($mode); # モード移行

        if ($stock && $ren && $ren2<4) {  # 1P連の場合   $ren2 は1P連の連続フラグ。4回まで。
            $rt_cancel = 1; $delay = 0; $rencount++;
            $rt = 0; $ren2++;
            $msg2='<b><font size=2 color=\'#00aa00\'>1P連確定</font></b>';
            $msg = ($msg ne ' ') ? $msg.'<br>'.$msg2 : $msg2;  # すでに $msg があるなら<br>をつけて連結
        } elsif ($stock) {  # 1P連ではなく、まだストックがある
            $rt = &rt($mode); $ren2 = 0;   # RTプレイ数の決定。
        } else {  # 1P連ではなく、ストックもない
            $rt=' '; $ren2 = 0;
        }

        $opt  = ($count <=100) ? '<b><font color=\'blue\'>' : ($count >= 600) ? '<b><font color=\'red\'>' : '';
        $optc = ($count <=100) ? '</font></b>'              : ($count >= 600) ? '</font></b>'             : '';
        $opt2 = ($mode >= 3) ? 'red' : 'black';  # モード3以上には色をつける
        $k    = ($k > 0) ? $k.'k' : ' ';
 
       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>$bigget</td>";
        print "<td>→ <font color='$opt2'>$mode</font></td><td>$rt</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</td><td>$g</td></tr>\n";
        $count = $bigget = $ren = 0; $msg=' '; $k='';
    }

    if($g >= $play) {
        $k = ($k > 0) ? $k.'k' : ' ';
        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>$mode</td><td> </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</td><td>$g</td></tr>\n";
        last;
    }
}

# シミュデータの整理
$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 ($rencount) { $ren_p  = &point(($g/$rencount),2); $ren_p  = "(1/$ren_p)"; }
$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></b></td></tr>
<tr><td>総プレイ数</td><td align='right'>$g P</td></tr>
<tr><td>BIG</td><td align='right'><b>$bigcount <font color='red'>$b_prob</font></b></td></tr>
<tr><td>REG</td><td align='right'><b>$regcount <font color='red'>$r_prob</font></b></td></tr>
<tr><td>1P連荘</td><td align='right'><b>$rencount $ren_p</b></td></tr>
<tr><td>投資</td><td align='right'>$toushi 円</td></tr>
<tr><td>獲得枚数</td><td align='right'><b>$coin 枚</b></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='$def_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></tr></table>

<br><br><br><br>
<div align='right'>[ <a href='../simu_data_b_power.html'>data</a> / <a href='b_power_memo.html'>memo</a> / <a href='b_power.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __

exit;

# モード移行
sub mt {
    my($mode,@tbl,$r,$i,$x,$next);
    ($mode) = @_;
    @tbl = ($mode==1) ? @m1t : ($mode==2) ? @m2t : ($mode==3) ? @m3t : @m4t;

    $r = int(rand(241)+1);
    $i = 0; $x = $tbl[0];
    while ($r > $x) { $i++; $x += $tbl[$i]; }
    $next = $i + 1;
    return $next;
}
# RT プレイ数の決定
sub rt {
    my($mode,@tbl,$i,$x,$rt);
    ($mode) = @_;
    @tbl = ($mode==1) ? @m1rt : ($mode==2) ? @m2rt : ($mode==3) ? @m3rt : @m4rt;

    $r = int(rand(65536)+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 {
    my($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 ]