[ source / home ]


source : ネオプラネット


#!/usr/bin/perl
# ネオプラネット シミュレーション

$cginame  = 'neo_p.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 = $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_neo-p.html'>data</a> / <a href='neo_p_memo.html'>memo</a> / <a href='neo_p.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' maxlength=1  name='mode' size=14 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>
最初のストック数は合計 255 個まで。</font><br>
</center><br><br>
__ FORM __


# 最初のモードの決定
if (!$mode) {
    $r = int(rand(32768)+1);
    $mode = ($r <= 23296) ? 1 : ($r <= 24576) ? 4 : 6;   # 24576 = 23296 + 1280
}
$start_m = $mode;
$mode--;  # モード-1 値をシミュでは使用する。

# エラーチェックと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>5) { $error=1; $er_msg='モードは 1 から 6 までです。'; }
if (grep { /[^\d]/ } @input) { $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_neo-p.html'>data</a> / <a href='neo_p_memo.html'>memo</a> / <a href='neo_p.html'>source</a> / <a href='../index.html'>home</a> ]</div>};
    exit;
}

# 最初のストック
$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: 772;


# 通常時小役データ    総数は 32768
@big  = (130,132,134,136,136,136);                            $bigr  = $big[$s-1];   # /32768
@reg  = (98,100,102,104,106,116);                             $regr  = $reg[$s-1];   # REG の払出しは3枚
$rep  = 4490; @reprt = (28978,28968,28960,28948,28938,28894); $reprt = $reprt[$s-1];
$bell = 3120;  # 10枚(BIG中8枚)
@ora  = (104,110,114,122,130,164); $ora = $ora[$s-1];  # 6枚
$che  = 336;
# RT中の純ハズレは 2/32768

$m0[1] = '219,3,33,0,0,1'; # 通常モード(m0)でのモード移行 /256 [ ] 内は 設定
$m0[2] = '215,3,37,0,0,1';
$m0[3] = '210,4,41,0,0,1';
$m0[4] = '205,4,46,0,0,1';
$m0[5] = '199,5,51,0,0,1';
$m0[6] = '164,5,86,0,0,1';

$m[0] = $m0[$s];
$m[1] = '127,0,64,0,64,1'; # 非通常モードからのモード移行  [ ] 内はモード
$m[2] = '152,0,86,16,1,1';
$m[3] = '0,0,207,47,1,1';
$m[4] = '12,0,12,0,231,1';
$m[5] = '219,4,32,0,0,1';

$cancel[1] = '40,30,510,40,510,510';  #/32768  通常解除確率 左から m0~m5, [ ] 内は設定
$cancel[2] = '46,30,510,46,510,510';
$cancel[3] = '54,30,510,54,510,510';
$cancel[4] = '64,30,510,64,510,510';
$cancel[5] = '76,30,510,76,510,510';
$cancel[6] = '130,30,510,130,510,510';
@cancel = split(/,/, $cancel[$s]);

$bigget = '408.251';
$regget = 3+111.999;

# BIG中 / 32768
# che 3000, planet 3000, bell 14372, JACIN 9000 (3枚) jac_haz 1/8192

$g = $count = $bigcount = $regcount = $coin = $delay = 0;
$ten = $che_s = $rep_s = $haz_s = $oracount = 0;  # $che_s, $rep_s, $haz_s は小役解除のカウンタ
$msg=' ';

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 __


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

    $delay-- if ($delay > 0);
    $r = int(rand(32768)+1); # RT中の場合、通常解除抽選
    if ($bonus[0] && $r<=$cancel[$mode] && !$delay) {
        $rt_cancel = 1; $delay = 5; $msg=' ';
    }
    if ($count==772 && !$rt_cancel && !$delay) {  # 天井
        $rt_cancel = 1; $delay = 5; $msg = '<font size=2>天井</font>'; $ten++;
    }

    $r = int(rand(32768)+1); # 役抽選
    $repr = ($bonus[0]) ? $reprt : $rep;

    if ($r<=$bigr && $#bonus<254) { # BIG
        $rt = 772 + $count if !$bonus[0];   # 初ストックなら、天井を設定する。
        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> </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<=($bigr+$regr) && $#bonus<254) { # REG
        $rt = 772 + $count if !$bonus[0];   # 初ストックなら、天井を設定する。
        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> </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 <= ($bigr+$regr+$repr)) { # replay
        if (!$bonus[0]) { $coin += 3; next; }
        else {
            $r = int(rand(8192)+1);  # 1272/8192 で揃うリプレイ(不明)  1/512 でRT解除
            if ($r <= 1272) { $coin += 3; next; }
            elsif ($r <= 1288) {
                $rt_cancel = 1;  $delay = 0; $rep_s++;
                $msg = '<font size=2 color=\'blue\'>リプ解除</font>';
            }
        }
    } elsif ($r <= ($bigr+$regr+$repr+$bell)) { $coin += 10; next; } # bell
    elsif   ($r <= ($bigr+$regr+$repr+$bell+$ora)) { $coin += 6; $oracount++; next; }  # orange
    elsif   ($r <= ($bigr+$regr+$repr+$bell+$ora+$che)) { # cherry
        $r = int(rand(1024)+1);
        if ($bonus[0]) { # ストック有りの場合はチェリー解除抽選
            if ($r <= 128)    { $coin += 2; $rt_cancel = 1; $msg = '<font size=2 color=\'red\'>2che 解除</font>'; $delay = 0; $che_s++; }
            elsif ($r <= 170) { $coin += 4; $rt_cancel = 1; $msg = '<font size=2 color=\'red\'>4che 解除</font>'; $delay = 0; $che_s++; } # 128+42
            elsif ($r <= 597) { $coin += 2; } else { $coin+=4; }
        } else { # ストックなし
            $coin = ($r <= 555) ? $coin+2 : $coin+4;
        }
    } else { # haz
        if ($bonus[0]) {
            $rt_cancel = 1; $delay = 0; $haz_s++;  $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);
            $get = '<font size=4 color=\'red\' face=\'HG丸ゴシックM-PRO\'><b>777</b></font>';
        } else {
            $regcount++; $coin += $regget; $s_reg--; shift(@bonus); $get = '<b>REG</b>';
        }

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

        $rt   = 772 if $bonus[0];  # ストックがあるなら、天井を 772 に設定
        $opt  = ($count < 100) ? '<b><font color=\'blue\'>' : ($count >= 500) ? '<b><font color=\'red\'>' : '';
        $optc = ($count < 100) ? '</font></b>'              : ($count >= 500) ? '</font></b>'             : '';
        $k    = ($k > 0) ? $k.'k' : ' ';
        $m_d  = $mode + 1;
        $start_m = '' if ( ($bigcount+$regcount) > 1 );
        $opt2 = ($m_d==3 or $m_d==5) ? 'red' : 'black';
        $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 $opt_c</td><td>$get</td><td>$msg</td>";
        print "<td>$start_m →<font color='$opt2'>$m_d</font></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 = ' ';
    }

    if($g >= $play) {
        $k = ($k > 0) ? $k.'k' : ' ';
        $coin_d = int($coin);
        $mode_d = $mode + 1;
        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>$mode_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";
        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 ($oracount) { $ora_prob = &point(($g/$oracount),2); $ora_prob = "(1/$ora_prob)"; }
if ($che_s)    { $che_sp   = &point(($g/$che_s),2);    $che_sp   = "(1/$che_sp)"; }
if ($rep_s)    { $rep_sp   = &point(($g/$rep_s),2);    $rep_sp   = "(1/$rep_sp)"; }
if ($haz_s)    { $haz_sp   = &point(($g/$haz_s),2);    $haz_sp   = "(1/$haz_sp)"; }

$normal = $bigcount + $regcount - $che_s - $rep_s - $haz_s - $ten;  # 通常解除回数
if ($normal) { $normalp = &point(($g/$normal),2);      $normalp  = "(1/$normalp)"; }

$mode++;
$start = ($bonus[0]) ? 772-$count : 0;  # 再試行用

# 整理したデータ、再試行ボタン、フッタの表示
print <<"__ RESULT __";
</table><br><br>
<table border=1 align='center' cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=4><b>ネオプラネット 設定 $s</b></td></tr>
<tr><td>総プレイ数</td><td align='right'>$g P</td>
<td>チェリー解除</td><td align='right'>$che_s <b>$che_sp</b></td></tr>
<tr><td>BIG</td><td align='right'><b>$bigcount <font color='red'>$b_prob</font></td>
<td>リプ解除</td><td align='right'>$rep_s <b>$rep_sp</b></td></tr>
<tr><td>REG</td><td align='right'><b>$regcount <font color='red'>$r_prob</td>
<td>純ハズレ解除</td><td align='right'>$haz_s <b>$haz_sp</b></td></tr>
<tr><td>投資</td><td align='right'>$toushi 円</td>
<td>通常解除</td><td align='right'>$normal <b>$normalp</b></td></tr>
<tr><td>獲得枚数</td><td align='right'><b>$coin_d 枚</b></td>
<td>オレンジ</td><td align='right'>$oracount <b>$ora_prob</b></td></tr>
<tr><td>換金</td><td align='right'>$kankin 円</td><td colspan=2 rowspan=3> </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 %</font></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_neo-p.html'>data</a> / <a href='neo_p_memo.html'>memo</a> / <a href='neo_p.html'>source</a> / <a href='../index.html'>home</a> ]</div>
</body></html>
__ RESULT __

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;
}


[ source / home ]