[ source / home ]


source : カンフーレツデン


#!/usr/bin/perl
# カンフーレツデン シミュレーション

$cginame  = 'retsu.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_retsu.html'>data</a> / <a href='retsu_memo.html'>memo</a> / <a href='retsu.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>
ストック数は記入しないと、BIG 10、REG 4 となります。<br>
最大ストック数はよくわからなかったので 255個までとしました。<br>
最初のモードを記入しない場合、3/4 で mode1 , 1/4 で mode6 になります。 
</font></center><br><br>
__ FORM __

# 最初のモードの決定
if (!$mode) {
    $r = int(rand(4)+1);
    $mode = ($r <= 3) ? 1 : 6;
}
$start_m = $mode;
$mode--;

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

# 最初のストック
$s_big =10 if ($s_big eq '');  # ストックは記入しないと B10 R4
$s_reg = 4 if ($s_reg eq '');

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: 1969;


# 通常時小役データ    総数は 16384
@big = (33,47,49,52,55,57);  $bigr = $big[$s-1]; # /32768
@reg = (13,18,19,20,21,22);  $regr = $reg[$s-1];   # REG の払出しは3枚
$rep = 2245; @reprt = (14229,14211,14207,14203,14199,14196); $reprt = $reprt[$s-1];
$k8  = 1780;
$k12 = 150;
$che = 178; # 振り分けがわからないため3枚とする
# BIG中小役ゲームのハズレ(1/16384)、JACゲーム中のハズレ(1/8192) は無視

# 通常解除。乱数の正確な数値がわからないため、確率の分母*100
$cancel[1] = '71111,49231,26667,5981,5981,71111';
$cancel[2] = '71111,49231,26667,5981,5981,5981';
$cancel[3] = '71111,45714,26667,5000,5000,5000';
$cancel[4] = '71111,42667,25600,5000,5000,5000';
$cancel[5] = '71111,42667,25600,5000,5000,5000';
$cancel[6] = '64000,42667,25600,5000,5000,5000';
@cancel = split(/,/, $cancel[$s]);

# モード移行振り分け /256 , の区切りは左から設定1〜6の順。  '' の中は左からm0~5
@b0 = ('124 84 8 40 0 0','100 84 8 24 0 40','130 78 8 40 0 0','84 76 8 48 0 40','144 64 8 40 0 0','50 22 8 88 0 88');
@b1 = ('112 108 12 20 0 4','108 104 12 12 0 20','124 96 12 20 0 4','104 96 12 24 0 20','156 64 12 20 0 4','134 22 12 44 0 44');
@b2 = ('0 0 128 128 0 0','0 0 128 128 0 0','0 0 128 128 0 0','0 0 128 128 0 0','0 0 128 128 0 0','0 0 128 128 0 0');
@b3 = ('64 64 40 80 8 0','64 64 40 80 8 0','50 50 40 108 8 0','64 64 40 76 12 0','68 68 16 40 64 0','54 54 40 92 16 0');
@b4 = ('0 0 0 32 224 0','0 0 0 32 224 0','0 0 0 32 224 0','0 0 0 32 224 0','0 0 0 32 224 0','0 0 0 32 224 0');
@b5 = ('120 84 8 40 4 0','112 110 8 24 2 0','128 76 8 40 4 0','112 110 8 24 2 0','140 64 8 40 4 0','142 22 8 80 4 0');
$r0 = '96 96 0 64 0 0'; # 全設定共通 REG 時
$r1 = '92 92 8 64 0 0';
$r2 = '0 0 128 128 0 0';
$r3 = '0 0 0 256 0 0';
$r4 = '0 0 0 32 224 0';
@r5 = ('96 96 0 64 0 0','0 0 0 128 0 128','0 0 0 128 0 128','0 0 0 128 0 128','0 0 0 128 0 128','0 0 0 256 0 0');

$mtb[0] = $b0[$s-1];
$mtb[1] = $b1[$s-1];
$mtb[2] = $b2[$s-1];
$mtb[3] = $b3[$s-1];
$mtb[4] = $b4[$s-1];
$mtb[5] = $b5[$s-1];
$mtr[0] = $r0;
$mtr[1] = $r1;
$mtr[2] = $r2;
$mtr[3] = $r3;
$mtr[4] = $r4;
$mtr[5] = $r5[$s-1];

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 = $delay =  $ten = 0; $msg=' ';

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

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

    $r = int(rand(16384)+1);
    $repr = ($bonus[0]) ? $reprt : $rep;

    if ($r<=$bigr && $#bonus<254) { # BIG
        $rt = 1969 + $count if !$bonus[0];   # 初ストックなら天井を設定
        push(@bonus, 'B'); $s_big++;
        if ($int) {
            print "<tr align='right' bgcolor='#eeefef'><td>( $count )</td><td><font size=2>内部 七七七</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 = 1969 + $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);  # 1296/8192 で揃うリプレイ(不明)
            if ($r <= 1296) { $coin += 3; next; }
        }
    } elsif ($r <= ($bigr+$regr+$repr+$k8)) { $coin += 8; next; } # 8枚役
    elsif   ($r <= ($bigr+$regr+$repr+$k8+$k12)) { $coin += 12; next; }  # スイカ
    elsif   ($r <= ($bigr+$regr+$repr+$k8+$k12+$che)) { $coin += 3; }  # cherry
    else { # haz
        if ($bonus[0]) { $rt_cancel = 1; $msg = '<font size=2>純ハズレ解除</font>'; $delay = 0; }
    }

    # ボーナス放出
    if ($rt_cancel && !$delay) {
        $rt_cancel = 0;
        if ($bonus[0] eq 'B') {
            $bigcount++; $coin += 711; $s_big--; $del = shift(@bonus);
            $get = '<font size=4 color=\'blue\' face=\'HG創英角ポップ体\'><b>七七七</b></font>';
        } else {
            $regcount++; $coin += 115; $s_reg--; $del = shift(@bonus); $get = '<b>REG</b>';
        }

        # mode 移行
        @tbl = ($del eq 'B') ? split(/ /, $mtb[$mode]) : split(/ /, $mtr[$mode]);
        $r = int(rand(256)+1);
        $i = 0; $x = $tbl[0];
        while ($r > $x) { $i++; $x += $tbl[$i]; }
        $mode = $i;

        $rt = 1969 if $bonus[0];  # ストックがあるなら天井を設定
        $opt  = ($count < 200) ? '<b><font color=\'blue\'>' : ($count>=500 && $count<1000) ? '<font color=\'red\'>'
              : ($count >= 1000) ? '<b><font color=\'red\'>' : '';
        $optc = ($count < 200) ? '</font></b>' : ($count>=500 && $count<1000) ? '</font>'
              : ($count >= 1000) ? '</font></b>' : '';

        $k = ($k > 0) ? $k.'k' : ' ';
        $m_d = $mode + 1;
        $start_m = '' if ( ($bigcount+$regcount) > 1);

        $opt2  = ($m_d==3) ? '<font color=\'blue\'>' : ($m_d==4) ? '<font color=\'red\'>'
               : ($m_d==5) ? '<font color=\'red\'><b>' : '';
        $opt2c = ($m_d==3 or $m_d==4) ? '</font>' : ($m_d==5) ? '</b></font>' : '';
        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 align='right'>$opt $count $opt_c</td><td>$get</td><td>$msg</td>";
        print "<td>$start_m →$opt2 $m_d $opt2_c</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 align='right'>$coin</td><td align='right'>$g</td></tr>\n";
        $k = ''; $count = 0; $msg = ' ';
    }

    if($g >= $play) {
        $k = ($k > 0) ? $k.'k' : ' ';
        $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 align='center'>ヤメ</td><td> </td>";
        print "<td align='center'>$mode_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</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)"; }

$mode++;
$start = ($bonus[0]) ? 1969-$count : 0;

# 整理したデータ、再試行ボタン、フッタの表示
print <<"__ RESULT __";
</table><br><br>
<table border=1 align='center' cellspacing=0>
<tr align='center' bgcolor='#ffffcc'><td colspan=2><b>カンフーレツデン 設定 $s</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>投資</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_retsu.html'>data</a> / <a href='retsu_memo.html'>memo</a> / <a href='retsu.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 ]