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