[ source / home ]


source : 北斗の拳


#!/usr/bin/perl
# 北斗の拳 シミュレーション

$cginame  = 'hokuto.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, $start) = @input;
$mode = $start;  # 最初のモード

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'>
<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_hokuto.html'>data</a> / <a href='hokuto_memo.html'>memo</a> / <a href='hokuto.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=10 maxlength=1 value='$s'></td></tr>
<tr><td>試行ゲーム数</td><td><input type='text' size=10 name='play' maxlength=4 value='$play'></td></tr>
<tr><td>最初のモード</td><td><input type='text' size=10 name='start_mode' maxlength=1 value='$start'></td></tr>
</table><br>
<input type='submit' value="開始">
</form>
<table border=0><tr><td><font size=2>
設定は 1 〜 6 の数値を入力。<br>
モードは 1 〜 3 の数値を入力。<font color=blue>(1:低確率 2:通常 3:高確率)</font><br>
最初のモードを記入しない場合、通常モードからのスタートになります。<br>
試行ゲーム数には、BB中のナビも含みます。<br><br>
暫定版 <font size=2>(前兆モードでの潜伏ゲーム数の振り分けが分からないため、とりあえず 25P としています。)<br>
初期ストックは20個としています。
</font></td></tr></table>
</center>
__ FORM __

# エラーチェックとGET送信
if (!$start) { $start=$mode=2; }

if ($play > 9999)  { $error = 1; $er_msg = 'プレイ数は最大9999Pまでです。'; }
if (!$s or !$play) { $error = 1; $er_msg = '記入漏れがあります。'; }
if ($s<=0 && $s>6) { $error = 1; $er_msg = '設定は 1 から 6 までです。'; }
if ($mode<1 or $mode>3) { $error = 1; $er_msg = 'モードは 1 から 3 までです。'; }
if (grep { /[^\d]/ } @input) { $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_hokuto.html'>data</a> / <a href='hokuto_memo.html'>memo</a> / <a href='hokuto.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
@reg   = (2064, 2065, 2066, 2067, 2068, 2069);        $reg = $reg[$s-1];
$bell  = 34505;
@rep   = (27664, 27618, 27559, 27478, 27457, 27406);  $rep = $rep[$s-1];
@che   = (752, 777, 810, 850, 850, 900);              $che = $che[$s-1];
@suika = (550, 570, 595, 635, 655, 655);            $suika = $suika[$s-1];
$haz   = 1;

# 小役によるモード移行データ 総数は 512    [ ] 内の数値が設定。 ( ) の6要素は左からmode1~6 への移行
@m1ra     = (512,0,0,0,0,0);
$m1rc[1]  = $m1rc[2] = $m1rc[3] = $m1rc[4] = '359,128,16,8,1,0';
$m1rc[5]  = '343,128,24,16,1,0';
$m1rc[6]  = '319,128,32,32,1,0'; @m1rc = split(/,/, $m1rc[$s]);
@m1ch4    = (470,32,8,2,0,0);
$m1ch2[1] = $m1ch2[2] = '118,256,8,128,1,1';
$m1ch2[3] = $m1ch2[4] = $m1ch2[5] = $m1ch2[6] = '110,256,16,128,1,1'; @m1ch2 = split(/,/, $m1ch2[$s]);
$m1sa[1]  = '358,128,8,16,1,1';
$m1sa[2]  = $m1sa[3] = $m1sa[4] = '350,128,16,16,1,1';
$m1sa[5]  = '342,128,24,16,1,1';
$m1sa[6]  = '318,128,32,32,1,1'; @m1sa = split(/,/, $m1sa[$s]);
$m1sb[1]  = '78,384,16,32,1,1';
$m1sb[2]  = $m1sb[3] = '62,384,16,48,1,1';
$m1sb[4]  = '46,384,32,48,1,1';
$m1sb[5]  = '30,384,32,64,1,1';
$m1sb[6]  = '16,382,48,64,1,1'; @m1sb = split(/,/, $m1sb[$s]);

@m2ra     = (32,480,0,0,0,0);
$m2rc[1]  = $m2rc[2] = $m2rc[3] = $m2rc[4] = $m2rc[5] = '0,375,128,8,1,0';
$m2rc[6]  = '0,367,128,16,1,0'; @m2rc = split(/,/, $m2rc[$s]);
$m2ch4[1] = $m2ch4[2] = '8,499,4,1,0,0';
$m2ch4[3] = '8,498,4,2,0,0';
$m2ch4[4] = $m2ch4[5]= $m2ch4[6] = '8,496,4,4,0,0'; @m2ch4 = split(/,/, $m2ch4[$s]);
@m2ch2    = (0,318,64,128,1,1);
$m2sa[1]  = '0,374,128,8,1,1';
$m2sa[2]  = $m2sa[3] = $m2sa[4] = '0,366,128,16,1,1';
$m2sa[5]  = $m2sa[6] = '0,350,128,32,1,1';  @m2sa = split(/,/, $m2sa[$s]);
@m2sb     = (0,62,384,64,1,1);

@m3ra  = (24,16,472,0,0,0);
@m3rc  = (0,0,383,128,1,0);
@m3ch4 = (4,8,499,1,0,0);
@m3ch2 = (0,0,0,510,1,1);
@m3sa  = (0,0,478,32,1,1);
@m3sb  = (0,0,254,256,1,1);

# mode について
# mode1 = 低確率    mode7  = 66% 継続
# mode2 = 通常      mode8  = 79% 継続
# mode3 = 高確率    mode9  = 84% 継続
# mode4 = 前兆      mode10 = 89% 継続
# mode5 = 赤7揃い   mode11 = BB落選モード & 設定変更
# mode6 = 北斗揃い

# BB時の連荘抽選。左から (m7~10) . さらに  ' ' の中の5要素は、左から '継続 転落 m4 m5 m6' への移行。
@ren = ('676 340 2 4 2', '811 205 2 4 2', '867 143 4 8 2', '911 99 4 8 2');  # mode7〜10 それぞれ総数は 1024

# BBから通常時に転落した場合のモード移行。左から 'm1 m2 m3'  [ ] 内は設定
$down[1]='599,175,250'; # 総数は 1024
$down[2]='574,200,250';
$down[3]='499,225,300';
$down[4]='449,250,325';
$down[5]='399,250,375';
$down[6]='299,250,475';
@down=split(/,/, $down[$s]);

$mdisp[7] ='<font size=2>66% 継続</font>'; # 表示用
$mdisp[8] ='<font color="#00aa00" size=2><b>79% 継続</b></font>';
$mdisp[9] ='<font color="blue" size=2><b>85% 継続</b></font>';
$mdisp[10]='<font color="red" size=2><b>89% 継続</b></font>';

# オーラの色   ' ' の中は 左から '白 青 黄 緑 赤 虹'  [ ] 内はモード。総数 /1024

$aura[7] ='596 256 128 32 8 4';
$aura[8] ='344 256 256 128 32 8';
$aura[9] ='176 176 256 256 128 32';
$aura[10]='85 85 86 256 256 256';

print <<"__ HTML __";
<br><br><center><table border=1 cellspacing=0><caption algin='top'>シミュレーション結果</caption>
<caption align='bottom'><font size=2>総ゲーム数 → BB中ナビ含まない / ナビ含む</font></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>オーラ<br>色</font></td><td><font size=2>BB中<br>mode</font></td>
<td><font size=2>BB後<br>mode</font></td><td><font size=2>BB回数</font></td><td><font size=2>JACIN<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>stock</td></tr>
__ HTML __


#------------------------
#   シミュレート開始
#------------------------
$g = $g2 = $count = 0;  # $g2 はBB中小役ゲームを含まない総ゲーム数
$k = $totalk = 0;
$ren = $r7count = $barcount = $bonus = $coin = 0;
$in = $t_jac = $high =  $minus = $max = $premium = 0;

$stock = 20;  # 初期ストック
$able  = 1;   # BBフラグをそのゲームで揃えられるかどうか ( リプレイ,ベル成立時は次プレイへ持ち越し )
while (1) {

    $g++;
    if (!$bonus) { $count++; $g2++; }
    if ($coin < 3) { $coin += 50; $k++; $totalk++; }
    $coin -= 3;
    $r = int(rand(65536)+1);

    if ($r <= $reg) { # 内部REG 当選
        $stock++;
    } elsif ($r <= ($reg+$bell)) { # 内部ベル 当選
        if ($in) { $coin += 10; } else {
            $r = int(rand(65536)+1);
            if ($r <= 11286) { $coin += 10; $able = 0; }
            elsif ($r == 11300) { $premium = 'premium ベル'; } # プレミア
        }
    } elsif ($r <= ($reg+$bell+$rep)) { # 内部リプ 当選
        $r = int(rand(10000)+1);
        if ($r <= 3276) { # 揃うリプレイ
            $coin += 3; $able = 0;
            if ($mode <= 3) { $mode = &mode_trans($mode,'ra'); next; }
        } elsif ($r <= 3513) { # レアリプレイ 237+3276=3513
            if ($mode <=3) { $mode = &mode_trans($mode,'rc'); next; }
        }
    } elsif ($r <= ($reg+$bell+$rep+$che)) { # チェリー当選
        $r = int(rand(10000)+1); $checount++;
        if ($r <= 6467) { # 4che
            $coin += 4; if ($mode <= 3) { $mode = &mode_trans($mode,'ch4'); next; }
        } else { # 2che
            $coin += 2; if ($mode <= 3) { $mode = &mode_trans($mode,'ch2'); next; }
        }
    } elsif ($r <= ($reg+$bell+$rep+$che+$suika)) { # スイカ当選
        $r = int(rand(32768)+1); $coin +=6; $suikacount++;
        if ($r <= 23328) { # suika A
            if ($mode <= 3) { $mode = &mode_trans($mode,'sa'); next; }
        } elsif ($r == 23329) { $premium = 'premium スイカ'; }
        else { #suika B
            if ($mode <= 3) { $mode = &mode_trans($mode,'sb'); next; }
        }
    } elsif ($r <= ($reg+$bell+$rep+$che+$suika+$haz)) { $premium = 'premium 純ハズレ'; }

    if ($premium) {
        $coin += 5+112; $t_jac++; $stock--; $premium = 0;
    }


    if ($mode == 4) {  # 前兆モード 前兆は25Pとしてみた ( 正確な前兆プレイ振り分け 不明 )
        $delay = 26 if !$delay;
        $delay--;
        if ($delay == 1) {
            $delay = 0;
            $r = int(rand(10000)+1);
            $mode = ($r >2300 && $r <= 2612) ? 6 : 5;  # mode6=北斗揃い mode5= 赤7揃い
        }
    } elsif ($mode==5 && $able && !$bonus) { # 赤7揃い
        $get = '<font color=red face="arial black"><b> 777 </b></font>';
        $clr = 'white'; $r7count++; $bonus = 1; $in = 10;   # $in = BBはワンセット10P
        $r = int(rand(10000)+1);
        $mode = ($r <= 117) ? 10 : ($r <= 312) ? 9 : ($r <= 4106) ? 8 : 7;  # BB時モードの振り分け
        next;
    } elsif ($mode==6 && $able && !$bonus) {  # 北斗揃い
        $get='<font color=\'#ffffff\'><i>北斗の拳</i></font>';
        $clr='black'; $barcount++; $bonus = 1; $in = 10;
        $r = int(rand(10000)+1);
        $mode = ($r <= 5) ? 7 : ($r <= 10) ? 8 : ($r <= 6206) ? 9 : 10;
        next;
    }

    if ($count >= 1999 && !$max) { # 天井 BB
        $max = 1; $r = int(rand(2)+1);
        $mode = ($r==1) ? 4 : 5;   # 1/2 で mode4 or mode5 へ振り分け
    }

    $in-- if $bonus;  # BB中なら $in 減らしていく
    if ($bonus && $in<=0 && $stock>0 && $able) { # BB 時 JACIN

        $coin += 5+112; $t_jac++; $stock--;
        @f = split(/ /, $ren[$mode-7]); $r = int(rand(1024)+1);

        if ($r <= $f[0]) { $ren++; $in = 10; next; } # 継続
        elsif ($r <=($f[0]+$f[1])) { # 転落
            $r = int(rand(1024)+1);
            $nextmode = ($r <= $down[0]) ? 1 : ($r <= ($down[0]+$down[1])) ? 2 : 3;  # m1~3 へ振り分け
        } elsif ($r <= ($f[0]+$f[1]+$f[2])) { $nextmode = 4; }     # mode4 へ
        elsif ($r <= ($f[0]+$f[1]+$f[2]+$f[3])) { $nextmode = 5; } # mode5 へ
        else { $nextmode = 6; }                                    # mode6 へ

        if ($nextmode == 3) { $high++; } elsif ($nextmode>=4) { $minus++; } # 転落時の m3 への移行率を調べる
        $ren++; if ($get=~ /777/) { $r7ren += $ren; } elsif ($get=~ /ffffff/) { $barren += $ren; } # 平均連荘数のため

        $k = ($k > 0) ? $k.'k' : ' ';
        $bbcount = $r7count + $barcount;
        if ($bbcount) { $bb_prob = int($g2/$bbcount+0.5); $bb = "$bbcount (1/$bb_prob)"; } else { $bb = 0; }

        # オーラ色の抽選
        @clr = split(/ /, $aura[$mode]);
        $r=int(rand(1024)+1);
        if ($r <= $clr[0]) { $aura = '白'; }
        elsif ($r <= ($clr[0]+$clr[1])) { $aura = '<font color=\'blue\'>青</font>'; }
        elsif ($r <= ($clr[0]+$clr[1]+$clr[2])) { $aura = '黄'; }
        elsif ($r <= ($clr[0]+$clr[1]+$clr[2]+$clr[3])) { $aura = '<font color=\'#00aa00\'><b>緑</b></font>'; }
        elsif ($r <= ($clr[0]+$clr[1]+$clr[2]+$clr[3]+$clr[4])) { $aura = '<font color=\'red\'><b>赤</b></font>'; }
        elsif ($r <= ($clr[0]+$clr[1]+$clr[2]+$clr[3]+$clr[4]+$clr[5])) { $aura = '<font color=\'red\'><b>虹</b></font>'; }

        # 表示データに色をつける
        $ren = ($ren == 1) ? '<font size=2>単発</font>' : ($ren<=5) ? "<font color='#00aa00'>$ren 連</font>"
            : ($ren <= 10) ? "<font color='blue'>$ren 連</font>" : "<font color='red'><b>$ren 連</b></font>";
        $opt   = ($nextmode==3) ? 'blue' : ($nextmode>4) ? 'red' : 'black';
        $opt2  = ($count<=100)  ? '<font color=\'blue\'><b>' : ($count>=500 && $count<1000) ? '<font color=\'#00aa00\'><b>'
               : ($count>=1000) ? '<font color=\'red\'><b>' : '';
        $opt2c = ($count<=100)  ? '</b></font>' : ($count>=500 && $count<1000) ? '</b></font>'
               : ($count>=1000) ? '<?b></font>' : '';

        print "<tr align='right'><td>$opt2 $count $opt2c</font></td><td align='center' bgcolor='$clr'>$get</td>";
        print "<td><b>$ren</b></td><td align='center'>$aura</td><td>$mdisp[$mode]</td>";
        print "<td align='center'>→ <font color='$opt'>$nextmode</font></td><td>$bb</td><td>$t_jac</td>";
        print "<td>$k</td><td>$coin</td><td>$g2 / $g</td><td>$stock</td></tr>\n";
        $bonus=0; $count=0; $mode=$nextmode; $ren=0; $in=0; $k=''; $max=0;
    }

    if($g >= $play) { # ヤメ
        $k = ($k > 0) ? $k.'k' : ' ';
        $bbcount = $r7count + $barcount;
        if ($bbcount) { $bb_prob = int($g2/$bbcount+0.5); $bb = "$bbcount (1/$bb_prob)"; } else { $bb = 0; }
        print "<tr align='right'><td>$count</td><td align='center'>ヤメ</td><td> </td><td> </td><td> </td>";
        print "<td align='center'>$mode</td><td>$bb</td><td>$t_jac</td><td>$k</td><td>$coin</td>";
        print "<td>$g2 / $g</td><td>$stock</td></tr>\n";
        last;
    }
    $able = 1;
}

# シミュデータの整理
$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);

$ave7 = ($r7count)  ? &point(($r7ren/$r7count),3)   : 0;
$aveh = ($barcount) ? &point(($barren/$barcount),3) : 0;
if ($bbcount) { $bbp = &point(($g2/$bbcount),3); $bbp = "( 1/$bbp )"; } else { $bbp = ''; }

$fruit = $checount + $suikacount; # 通常時スイカ+チェリー
if ($fruit) { $fruit_p = &point(($g/$fruit),3); $fruit_p = "( 1/$fruit_p )"; } else { $fruit_p = ''; }
if ($bbcount-$minus) { $per = $high/($bbcount-$minus)*100; $per = &point($per,2); } else { $per = 0; } # high 移行率

# 整理したデータ, 再試行ボタン, フッタ の表示
print <<"__ RESULT __";
</table><br><br>
<table border=1 align='center' cellpadding=3 cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=2><b>北斗の拳 設定 $s</b></font></td></tr>
<tr><td>プレイ数</td><td align='right'> $g2 P ( $g P)</td></tr>
<tr><td>BB</td><td align='right'><b>$bbcount 回 <font color=red>$bbp</font></b></td></tr>
<tr><td>総JACIN</td><td align='right'>$t_jac 回</td></tr>
<tr><td><font color='red' face='arial black'><b>777</b></td>
<td align='right'><b>$r7count 回 <font color='red'>(平均 $ave7 連)</font></b></td></tr>
<tr><td bgcolor='black'><font color='#ffffff'><i>北斗の拳</i></font></td>
<td align='right'><b>$barcount 回 <font color='red'>(平均 $aveh 連)</font></td></tr>
<tr><td><font size=2>チェリー+スイカ</td><td align='right'>$fruit 個 <b>$fruit_p</b></td></tr>
<tr><td><font size=2>BB後 高確率</td><td align='right'>$high 回 <b>( $per % )</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>PAYOUT</td><td align='right'><b>$payout %</b></td></tr>
<tr><td>換金</td><td align='right'>$kankin 円</td></tr>
<tr><td>収支</td><td align='right'><b><font color='$opt3'>$shushi 円</font></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='start_mode' value='$start'>
<center><input type='submit' value="再試行"></center>
</form>

<div align='right'>[ <a href='../simu_data_hokuto.html'>data</a> / <a href='hokuto_memo.html'>memo</a> / <a href='hokuto.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 mode_trans {
    local($m,$c,@tbl,$x,$r,$new_mode);
    ($m, $c) = @_;

    @tbl = ($m==1 && $c eq 'ra' ) ? @m1ra  : ($m==1 && $c eq 'rc') ? @m1rc : ($m==1 && $c eq 'ch4') ? @m1ch4
         : ($m==1 && $c eq 'ch2') ? @m1ch2 : ($m==1 && $c eq 'sa') ? @m1sa : ($m==1 && $c eq 'sb' ) ? @m1sb
         : ($m==2 && $c eq 'ra' ) ? @m2ra  : ($m==2 && $c eq 'rc') ? @m2rc : ($m==2 && $c eq 'ch4') ? @m2ch4
         : ($m==2 && $c eq 'ch2') ? @m2ch2 : ($m==2 && $c eq 'sa') ? @m2sa : ($m==2 && $c eq 'sb' ) ? @m2sb
         : ($m==3 && $c eq 'ra' ) ? @m3ra  : ($m==3 && $c eq 'rc') ? @m3rc : ($m==3 && $c eq 'ch4') ? @m3ch4
         : ($m==3 && $c eq 'ch2') ? @m3ch2 : ($m==3 && $c eq 'sa') ? @m3sa : ($m==3 && $c eq 'sb' ) ? @m3sb : 0;

    $r = int(rand(512)+1);
    $i = 0; $x = $tbl[0];
    while ($r > $x) { $i++; $x += $tbl[$i]; }
    $new_mode = $i+1;
    return $new_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;
}


[ source / home ]