jug7.com
[ home / cgi / juggler / column / diary / bbs / link / welcome ]


source : 南国育ち


#!/usr/bin/perl
# 南国育ち シミュレーション

$cginame  = 'south.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, $def_mode, $def_sbig, $def_sreg, $start) = @input;
    $mode = 2 if !$mode;
}

# 内部ストック
$s_big = 149 if !$s_big;
$s_reg = 106 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;


# ヘッダとフォームの表示
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'>[ <a href='../simu_data_south.html'>data</a> / <x href='south_memo.html'>memo</a> / <a href='south.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=7 value='$s'></td></tr>
<tr><td>試行ゲーム数</td><td><input type='text' size=7 name='play' maxlength=4 value='$play'></td></tr>
</table><br>
<input type='submit' value="開始">
</form>
設定は 1 〜 6 までの数値を入力。<br>
スタート時のモードは 通常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 ($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_south.html'>data</a> / <x href='south_memo.html'>memo</a> / <a href='south.html'>source</a> ]</div>};
    print q{<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>};
    print '</body></html>';
    exit;
}

# data
# 通常時小役データ 総数は 65536
$big     = 386;
$reg     = 275;  # s1~4 275, s5 321, s6 356
$che     = 80;   # 2枚
$suika   = 80;   # 5枚
$rep     = 8980;
@bell    = (8296, 8300, 8360, 8400, 8500, 9000); # 修正の余地あり
$bell = $bell[$s-1];

# BIG中小役データ 総数は 65536 修正の余地あり
#$b_bell  = 40800;
#$b_suika = 100;
#$b_che   = 100;
#$b_jacin = 18256;
# 上記小役確率でBIG獲得枚数を計算 = 394.724 (枚)
$bigget   = 394;
$regget   = 127;

# モード移行振り分け /65536  [] 内は設定
$m1[1]=$m1[3]= '35840,27648,1280,0,0,768';
$m1[2] =       '32768,30720,1280,0,0,768';
$m1[4] =       '27904,35584,1280,0,0,768';
$m1[5] =       '13312,50176,1280,0,0,768';
$m1[6] =       '10240,53248,1280,0,0,768';

$m2[1] = '0,45568,0,6656,13312,0';
$m2[2] = '0,44032,0,8192,13312,0';
$m2[3] = '0,40960,0,9984,14592,0';
$m2[4] = '0,34816,0,14336,16384,0';
$m2[5] = '0,27136,0,16384,22016,0';
$m2[6] = '0,10240,0,6144,49152,0';

$m3 = '0,0,26112,0,39424,0';

$m4[1]=$m4[2] = '0,0,0,29440,36096,0';
$m4[3]= '0,0,0,26880,38656,0';
$m4[4]= '0,0,0,23552,41984,0';
$m4[5]= '0,0,0,16384,49152,0';
$m4[6]= '0,0,0,10240,55296,0';

$m5[1]=$m5[3] = '11776,7680,2560,0,0,43520';
$m5[2]=$m5[4] = '12800,4096,5120,0,0,43520';
$m5[5] = '12800,6656,2560,0,0,43520';
$m5[6] = '5120,2048,2560,0,0,55808';

$m6[1] = '7680,6144,2560,0,49152,0';
$m6[2] = '9216,3072,4096,0,49152,0';
$m6[3] = '4864,5632,2560,0,52480,0';
$m6[4] = '6400,2560,4096,0,52480,0';
$m6[5] = '12288,4608,2560,0,46080,0';
$m6[6] = '51200,3584,4096,0,6656,0';

$mt[1] = $m1[$s];
$mt[2] = $m2[$s];
$mt[3] = $m3;
$mt[4] = $m4[$s];
$mt[5] = $m5[$s];
$mt[6] = $m6[$s];

@n_rel = (199,199,199,206,215,247); # 通常解除
$n_rel = $n_rel[$s-1];
@h_rel = (3,7,13,16,21,21); # 純ハズレ解除
$h_rel = $h_rel[$s-1] + 30000;

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>備考</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;
$ren = 1;

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

    if ($mode>=5) { $release = 1; }  # モード5以上(1P連モード)なら、即放出

    $r = int(rand(65536)+1); # 内部役抽選

    if ($r<=$rep) { $coin += 3; $yaku=1; }                                # リプレイ
    elsif ($r<=$rep+$bell) { $coin+=7; $yaku=1; }                         # ベル
    elsif ($r<=$rep+$bell+$big) {                                         # 内部 BIG 
        $yaku = 0;
        if ($#bonus < 254) { push(@bonus,"B"); $s_big++; }
    } elsif ($r<=$rep+$bell+$big+$reg) {                                  # 内部 REG
        $yaku = 0;
        if ($#bonus < 254) { push(@bonus,"R"); $s_reg++; }
    } elsif ($r<=$rep+$bell+$big+$reg+$che) { $coin +=2; $yaku=1; }       # チェリー
    elsif  ($r<=$rep+$bell+$big+$reg+$che+$suika) { $coin +=5; $yaku=1; } # スイカ
    else {                                                                # ハズレ(制御によるリプこぼし)
        if ($r>30000 && $r<=$h_rel) { $release = 1; } # 純ハズレ当選
        $yaku=0;
    }

    if ($release==1 && $yaku==0) { # ボーナス放出  $yaku==1、つまり小役が成立した場合、放出は次プレイに持ち越し
        $release = 0;
        if ($bonus[0] eq 'B') {
            $bigcount++; $coin += $bigget; $s_big--; shift(@bonus);
            $get='<font color=\'red\' face=\'Arial black\'><b>777</b></font>';
        } else {
            $regcount++; $coin += $regget; $s_reg--; shift(@bonus); $get='<b>REG</b>';
        }

        # mode 移行
        @tbl = split(/,/, $mt[$mode]);
        $r = int(rand(65536)+1); $i = 0; $x = $tbl[0];
        while ($r > $x) { $i++; $x += $tbl[$i]; }
        $next_mode = $i+1;

        # ボーナス当選の表示
        $opt  = ($count < 100) ? '<b><font color=\'blue\'>' : ($count >= 500) ? '<b><font color=\'red\'>' : '';
        $opt2 = ($count < 100) ? '</font></b>'              : ($count >= 500) ? '</font></b>'             : '';
        if ($mode>=5) { $opt='<b><font color=\'#00aa00\'>'; $opt2='</font></b>';}
        $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)"; }
        if ($mode>=5) { $rencount++; }
        @mode_d = ('通常A', '通常B', '<font color=\'blue\'>チャンスA</font>', '<font color=\'blue\'>チャンスB</font>', '<font color=\'red\'>1P連A</font>', '<font color=\'red\'>1P連B</font>');
        $mode_1 = $mode_d[$mode-1];
        $mode_2 = $mode_d[$next_mode-1];

        if ($mode>=5) { $ren++; $ren_d = "$ren連"; } else { $ren=1; $ren_d=' '; }
        if ($ten==1) { $ren_d = '<font color=\'blue\' size=2><b>天井</b></font>'; }

        print "<tr align='right'><td>$opt $count $opt_2</td><td>$get</td>";
        print "<td><b><font size=2>$mode_1 → $mode_2</font></b></td><td>$ren_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>$k</td><td>$coin_d</td><td>$g</td></tr>\n";
        $k = ''; $count = 0; $msg = ' '; $ten=0;
        $mode = $next_mode;

        next;
    }

    if ($release==0) {
        $r = int(rand(65536)+1); # 通常解除抽選 次プレイに放出とした
        if ($r<=$n_rel) { $release = 1; }

#        $r = int(rand(65536)+1); # 純ハズレ解除抽選 次プレイに放出とした
#        if ($r<=$h_rel) { $release = 1; }
    }

    # 天井
    if ($mode==3) {
        if ($count >= 6000) { $release = 1 ; $ten = 1; }
    } else {
        if ($count >= 996) { $release = 1 ; $ten = 1; }
    }

    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='right'><td>$count</td><td>ヤメ</td><td> </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 = $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 回</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>

<center>
<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='submit' value="再試行">
</form>
</center>

<br><br><br><br>
<div align='right'>[ <a href='../simu_data_south.html'>data</a> / <x href='south_memo.html'>memo</a> / <a href='south.html'>source</a> ]</div>
<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>
</body></html>
__ RESULT __

exit;

# モード移行
sub mt {
    my($mode,,$r,$i,$x,$next_mode);
    ($mode) = @_;

    $r = int(rand(241)+1);
    $i = 0; $x = $tbl[0];
    while ($r > $x) { $i++; $x += $tbl[$i]; }
    $next_mode = $i + 1;
    return $next_mode;
}

# 少数を四捨五入して指定の桁にする
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 ]